一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第 13 天,点击查看活动详情。
正是江南好风景,花开时节又逢君。
1 前言
在 Spring cloud
中,OpenFeign
的用途是服务发现,负载均衡,服务调用。这里说一下 Feign 和 OpenFeign 的区别。
- 1
Feign
是 SpringCloud 组件中一个轻量级 RESTful 的 HTTP 服务客户端,Feign 内置了 Ribbon,用来做客户端负载均衡,从注册中心获取服务发起调用调用 @Feign 注解定义的接口,就可以调用服务注册中心的服务。 - 2
OpenFeign
则是在 Feign 的基础上做了封装,支持了 SpringMVC 的注解,如 @RequestMapping 等。OpenFeign 的 @FeignClient 可以解析 SpringMVC 中 @RequestMapping 注解的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。
2 openfeign 的实现原理
在 springcloud
中,在启动类上的 @EnableFeignClients
将项目中所有被 @FeignClient
注解标记的类类注册到容器中。当这些被 @FeignClient 标记的类被调用时会创建一个动态代理对象,在项目中发起调用时,都会被统一转发给 Feign 框架所定义的一个 InvocationHandler
,由该 Handler 完成后续的 HTTP 转换 发送接收翻译 HTTP 响应的工作。
3 openfeign 配置
默认情况下,OpenFeign 使用 jdk 自带的 HttpURLConnection
来发起调用,但是 HttpURLConnection
没有连接池,性能和效率都比较低,在使用时可能会有系统出现问题。
3.1 Apache Httpclient 调用
如果需要使用 Apache HttpClient ,则需要添加以下配置并添加 pom 依赖,这里在 spring 中采用条件装配来实现。
# 使用 httpclient
feign.httpclient.enabled=true
# 添加 pom 依赖
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
<version>9.3.1</version>
</dependency>
3.2 OkHttpClient 调用
OkHttpClient 是一个高性能的调用框架,如果使用该框架进行系统间的调用,将会带来性能的提升。相关配置如下:
# 启用 okhttp 相关配置以及 pom 文件依赖
feign.okhttp.enabled=true
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
<version>10.2.0</version>
</dependency>
4 openFeign 超时时间
openFeign 可以设置全局超时时间,也可以对单独的服务进行设置超时时间。如果不设置超时时间,那么连接超时为 10s,读取数据超时则为 60s。
# 全局超时时间设置
feign.client.config.default.connectTimeout=2000
feign.client.config.default.readTimeout=60000
# 单个服务的超时时间
feign.client.config.serviceName.connectTimeout=1000
feign.client.config.serviceName.readTimeout=30000
Ribbon 作为 OpenFeign 内置的负载均衡器,也可以设置超时时间,这里需要说明的是, feign 的超时时间就可以覆盖掉 ribbon 设置的超时时间。
# ribbon 相关的连接和读取超时时间
ribbon.ConnectTimeout=2000
ribbon.ReadTimeout=11000
5 服务重试
5.1 openfeign 重试
默认情况下 OpenFeign 是不支持重试的,这一点可以在源代码 FeignClientsConfiguration
中 feignRetryer
的 Retryer.NEVER_RETRY;
中看出。如果想要发起重试,则需要重写 Retryer 即可实现。默认的重试策略,重试策略是每次间隔 100-1000ms 重试一次,最大重试一次,包括调用的次数则共计 2 次。
5.2 ribbon 重试
Ribbon 在默认情况下,每次间隔是 30s 从注册中心拉去服务列表配置,如果想要改变,则配置如下:
# appService 则为应用服务名称
appService.ribbon.ServerListRefreshInterval=3
# 同一实例重试次数,不包括首次调用
serviceApp.ribbon.MaxAutoRetries=1
# 同一服务的其它实例最大重试次数,这里不包括首次调用
serviceApp.ribbon.MaxAutoRetriesNextServer=1
# 是否对所有的操作都进行重试,如果为 true,则对所有的操作都进行重试,默认为 false
serviceApp.ribbon.OkToRetryOnAllOperations=false
# 对指定状态码进行重试
serviceApp.retryableStatusCodes=404,502,500
6 调用设置
在实际的业务中,还会有调用权限相关的配置,这些信息可以通过 RequestInterceptor
进行添加。
7 总结
在本文中,主要讲述了 openfeign 相关的设置,包括调用的 http 工具,超时工具和负载均衡策略,以及调用的参数添加等。