我是傲骄鹿先生,沉淀、学习、分享、成长。
如果你觉得文章内容还可以的话,希望不吝您的「一键三连」,文章里面有不足的地方希望各位在评论区补充疑惑、见解以及面试中遇到的奇葩问法
目录
OpenFeign是Spring Cloud提供的一个声明式的伪Http客户端, 它使得调用远程服务就像调用本地服务一样简单, 只需要创建一个接口并添加一个注解即可。
Nacos很好的兼容了OpenFeign, OpenFeign默认集成了 Ribbon, 所以在Nacos下使用OpenFeign默认就实现了负载均衡的效果。
service模块中配置OpenFeign的pom依赖(实际是在服务消费者端需要OpenFeign的依赖)
-
org.springframework.cloud -
spring-cloud-starter-openfeign
在消费者服务service_edu的启动类添加如下注解
@EnableFeignClients
服务的生产者的FileController中添加如下方法:
- @ApiOperation(value = "测试")
- @GetMapping("test")
- public R test() {
- log.info("oss test被调用");
- return R.ok();
- }
服务消费者中创建feign包,创建如下接口:
- @Service
- @FeignClient("service-oss")
- public interface OssFileService {
-
- @GetMapping("/admin/oss/file/test")
- R test();
- }
服务消费者中的TeacherController中添加如下方法:
- @Autowired
- private OssFileService ossFileService;
-
- @ApiOperation("测试服务调用")
- @GetMapping("test")
- public R test(){
- ossFileService.test();
- return R.ok();
- }

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

| 策略名 | 策略描述 |
| 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
修改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();
- }
上面的程序在测试时会出现远程调用超时错误。如下:因为OpenFeign默认等待1秒钟,否则超时报错
超时后,服务消费者端默认会发起一次重试
重试规则:每隔一秒发起重试
- ribbon:
- MaxAutoRetries: 0 # 同一实例最大重试次数,不包括首次调用,默认0
- MaxAutoRetriesNextServer: 1 # 重试其他实例的最大重试次数,不包括首次所选的server,默认1
application.yml文件中配置ribbon的超时时间(因为OpenFeing的底层即是对ribbon的封装)
- ribbon:
- ConnectTimeout: 10000 #连接建立的超时时长,默认1秒
- ReadTimeout: 10000 #处理请求的超时时间,默认为1秒
OpenFeign提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解OpenFeign中Http请求的细节。即对OpenFeign远程接口调用的情况进行监控和日志输出。
在service_edu中创建配置文件:
-
- @Configuration
- public class OpenFeignConfig {
-
- @Bean
- Logger.Level feignLoggerLevel(){
- return Logger.Level.FULL;
- }
- }
在service_edu中,application.yml中指定监控的接口,以及日志级别:
- logging:
- level:
- com.atguigu.guli.service.edu.feign.OssFileService: debug #以什么级别监控哪个接口
系列文章持续更新,微信搜一搜「傲骄鹿先生 」,回复【面试】有准备的一线大厂面试资料。