基于OpenFeign的服务调用

我是傲骄鹿先生,沉淀、学习、分享、成长。

如果你觉得文章内容还可以的话,希望不吝您的「一键三连」,文章里面有不足的地方希望各位在评论区补充疑惑、见解以及面试中遇到的奇葩问法

目录

一、OpenFeign是什么

二、OpenFeign的引入

1、引入依赖

2、启动类添加注解

三、OpenFeign的使用

1、生产者微服务中创建测试api

2、消费者微服务中创建远程调用接口

3、调用远程方法

四、负载均衡

1、配置多实例

2、测试负载均衡

3、Ribbon的负载均衡策略

五、OpenFeign的超时控制

1、模拟长流程业务

2、远程调用测试

3、解决方案

六、OpenFeign日志

1、作用

2、日志级别

3、配置日志bean

4、开启日志


一、OpenFeign是什么

OpenFeign是Spring Cloud提供的一个声明式的伪Http客户端, 它使得调用远程服务就像调用本地服务一样简单, 只需要创建一个接口并添加一个注解即可。

Nacos很好的兼容了OpenFeign, OpenFeign默认集成了 Ribbon, 所以在Nacos下使用OpenFeign默认就实现了负载均衡的效果。

二、OpenFeign的引入

1、引入依赖

service模块中配置OpenFeign的pom依赖(实际是在服务消费者端需要OpenFeign的依赖)

<!--服务调用-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2、启动类添加注解

在消费者服务service_edu的启动类添加如下注解

@EnableFeignClients

三、OpenFeign的使用

1、生产者微服务中创建测试api

服务的生产者的FileController中添加如下方法:

@ApiOperation(value = "测试")
@GetMapping("test")
public R test() {
    log.info("oss test被调用");
    return R.ok();
}

2、消费者微服务中创建远程调用接口

服务消费者中创建feign包,创建如下接口:

@Service
@FeignClient("service-oss")
public interface OssFileService {

    @GetMapping("/admin/oss/file/test")
    R test();
}

3、调用远程方法

服务消费者中的TeacherController中添加如下方法:

@Autowired
private OssFileService ossFileService;

@ApiOperation("测试服务调用")
@GetMapping("test")
public R test(){
    ossFileService.test();
    return R.ok();
}

四、负载均衡

1、配置多实例

2、测试负载均衡

对比两个实例输出日志的时间,可以发现默认情况下是轮询策略

 

3、Ribbon的负载均衡策略

策略名

策略描述

BestAvailableRule

选择一个最小的并发请求的server

AvailabilityFilteringRule

过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(activeconnections 超过配置的阈值)

WeightedResponseTimeRule

根据响应时间分配一个weight,响应时间越长,weight越小,被选中的可能性越低。

RetryRule

对选定的负载均衡策略机上重试机制。

RoundRobinRule

轮询选择server

RandomRule

随机选择一个server

ZoneAvoidanceRule

综合判断server所在区域的性能和server的可用性选择server

 配置负载均衡策略的方式:

service-product: # 调用的提供者的名称 
  ribbon: 
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

五、OpenFeign的超时控制

1、模拟长流程业务

修改oss服务FileController的test方法,添加sleep 3秒:

@ApiOperation(value = "测试")
@GetMapping("test")
public R test() {
    log.info("oss test被调用");
    try {
        TimeUnit.SECONDS.sleep(3);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return R.ok();
}

2、远程调用测试

上面的程序在测试时会出现远程调用超时错误。如下:因为OpenFeign默认等待1秒钟,否则超时报错

超时后,服务消费者端默认会发起一次重试 

重试规则:每隔一秒发起重试

ribbon:
  MaxAutoRetries: 0 # 同一实例最大重试次数,不包括首次调用,默认0
  MaxAutoRetriesNextServer: 1 # 重试其他实例的最大重试次数,不包括首次所选的server,默认1

3、解决方案

application.yml文件中配置ribbon的超时时间(因为OpenFeing的底层即是对ribbon的封装)

ribbon:
  ConnectTimeout: 10000 #连接建立的超时时长,默认1秒
  ReadTimeout: 10000 #处理请求的超时时间,默认为1秒

六、OpenFeign日志

1、作用

OpenFeign提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解OpenFeign中Http请求的细节。即对OpenFeign远程接口调用的情况进行监控和日志输出。

2、日志级别

  • NONE:默认级别,不显示日志
  • BASIC:仅记录请求方法、URL、响应状态及执行时间
  • HEADERS:除了BASIC中定义的信息之外,还有请求和响应头信息
  • FULL:除了HEADERS中定义的信息之外,还有请求和响应正文及元数据信息

3、配置日志bean

在service_edu中创建配置文件:


@Configuration
public class OpenFeignConfig {

    @Bean
    Logger.Level feignLoggerLevel(){
        return Logger.Level.FULL;
    }
}

4、开启日志

在service_edu中,application.yml中指定监控的接口,以及日志级别:

logging:
  level:
    com.atguigu.guli.service.edu.feign.OssFileService: debug #以什么级别监控哪个接口

系列文章持续更新,微信搜一搜「傲骄鹿先生 」,回复【面试】有准备的一线大厂面试资料。

猜你喜欢

转载自blog.csdn.net/cyl101816/article/details/124582397