一、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、启动类添加注解
在edu的启动类添加如下注解
@EnableFeignClients
三、OpenFeign的使用
1、oss中创建测试api
服务的生产者的FileController中添加如下方法:
@ApiOperation(value = "测试")
@GetMapping("test")
public R test() {
log.info("oss test被调用");
return R.ok();
}
2、edu创建远程调用接口
服务消费者中创建feign包,创建如下接口:
package com.atguigu.guli.service.edu.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();
}
4、Swagger测试
四、负载均衡
1、配置多实例
2、测试负载均衡
对比两个实例输出日志的时间,可以发现默认情况下是轮询策略
3、Ribbon的负载均衡策略
策略名 | 策略描述 |
---|---|
BestAvailableRule | 选择一个最小的并发请求的server |
AvailabilityFilteringRule | 过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(activeconnections 超过配置的阈值 |
WeightedResponseTimeRule | 根据响应时间分配一个weight,响应时间越长,weight越小,被选中的可能性越低。 |
RetryRule | 对选定的负载均衡策略机上重试机制。 |
RoundRobinRule | 轮询选择server |
RandomRule | 随机选择一个server |
ZoneAvoidanceRule | 综合判断server所在区域的性能和server的可用性选择server |
edu中配置负载均衡策略的方式:
service-oss: # 调用的提供者的名称
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秒钟,否则超时报错
超时后,服务消费者端默认会发起一次重试
edu中配置重试规则:
springcloud openfeign默认使用Retryer.NEVER 不重试
以前的版本:openfeign默认使用Retryer.DEFAULT 重试5次,会导致(幂等性失败的问题: 两端结果一致性,以后还会整合token解决)
ribbon:
MaxAutoRetries: 0 # 同一实例最大重试次数,不包括首次调用,默认0
MaxAutoRetriesNextServer: 1 # 重试其他实例的最大重试次数,不包括首次所选的server,默认1
3、解决方案
edu中配置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
在edu中创建配置文件
package com.atguigu.guli.service.edu.config;
@Configuration
public class OpenFeignConfig {
@Bean
Logger.Level feignLoggerLevel(){
return Logger.Level.FULL;
}
}
4、开启日志
edu的application.yml中指定监控的接口,以及日志级别
logging:
level:
com.atguigu.guli.service.edu.feign.OssFileService: debug #以什么级别监控哪个接口