一、OpenFeign 原理
1. OpenFeign 动态代理
- 主动扫描所有有@FeginClient 的接口,并加载
- 对每一个 @FeginClient 接口生成动态代理对象
- 将动态代理对象添加到Spring 上下文
- LocalService 发起调用
1-3 步均发生在启动时
二、使用 OpenFeign
- 添加 OpenFeign Maven 依赖
<!-- OpenFeign组件 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.创建远程调用的 service 并加上 @FeignClient 注解
@FeignClient(value = "my-server1", path = "/calculator")
public interface CalculationService{
//其他代码
}
三、参数说明
1.统一路径配置 path
统一的路径参数可以配置在 url 中
2.指定远程调用地址 url
url一般用于调试,可以手动指定@FeignClient调用的地址
3.降级 fallback
使用 Hystrix + fallback 实现
实现一个TemplateServiceFallback,实现 TemplateService 接口
在FeignClient 中指定
@FeignClient(value = "coupon-template-serv", path = "/template", // 通过fallback指定降级逻辑 fallback = TemplateServiceFallback.class)
四、注意事项
1. 日志级别配置
微服务之间的调用,是测试的一个难点。因此我们可以单独调整远程调用接口的日志级别
logging:
level:
com.lhc.inner.feign.AService: debug
com.lhc.inner.feign.BService: debug
在日志配置类中,改变日志级别为 FULL,记录完整的调用信息
@Bean
Logger.Level feignLogger() {
return Logger.Level.FULL;
}
2.必须配置超时
OpenFeign 默认的读取超时时间是 1 秒,对于大部分业务场景来说,这个时间都过于短了。
我就亲身经历过,因为数据量太大,OpenFeign 调用的接口读取超时,导致不可用的情况。
因此,对于 OpenFeign,我们必须在配置中配置合适的超时时间。
这里 OpenFeign 还有一个坑———— 配置读取超时(readTimeout)时,必须配置连接超时(connectTimeout)才能生效。
我一般会将 readTimeout 设置在 5s-30s。而 connectTimeout 设置在 1s-5s 之间。
这里的逻辑是这样的,超过 30s 的读取很有可能拖慢下游的业务。而超过 5s 都没有连接上,肯定不是因为网络波动,而是需要看看对应的服务是不是挂了。
feign:
client:
config:
# 全局超时配置
default:
# 网络连接阶段5秒超时
connectTimeout: 5000
# 服务请求响应阶段30秒超时
readTimeout: 30000
# 针对某个特定服务的超时配置
my-server:
connectTimeout: 1000
readTimeout: 2000
在上面的配置中,我还加入针对某个特定服务的超时配置。对于特殊的业务我们可以自行来调整超时时间。
(注:上面的单位都是毫秒)
评论区