前言
- Feign makes writing java http clients easier :主要讲述了
Feign
的基本用法。 - DefaultFeignClient Case and Summary:主要举例
Feign
原生注解调用第三方服务、Feign
结合SpringMvc
注解调用第三方服务,并且简要封装了一个创建Feign
构造器的工具类。 - Feign Call Case:通过
Feign
结合SpringMvc
注解的构造方式,简要模拟实际开发过程中的调用第三方服务的案例。
那么博主今天主要举例并总结的是,Feign
结合 SpringBoot
注解的具体用法,并且添加了熔断机制。老规矩直接上代码案例。
Server
Pom
1 | <properties> |
版本的说明:spring-cloud-dependencies
用的是当前最新版本,spring-cloud-starter-openfeign
版本为 3.0.0,从 3.0.0 开始 spring-cloud-starter-openfeign
的依赖中已经移除了 feign-hystrix
该依赖。也就是说 spring-cloud-starter-openfeign
3.0.0 及之后的版本不能在直接与 Hystrix
结合使用。当然你也可以自行添加 feign-hystrix
这个依赖,继续配合使用 Hystrix
所提供的熔断机制,不过这种方式只是博主理论上的认为可行,博主也没有真正尝试过,毕竟是否会有依赖上的冲突,只有真正尝试过后才知道。 说到这里,读者可能会问,那么 spring-cloud-starter-openfeign
3.0.0 及以后的版本,熔断机制应该如何处理。通过翻阅 spring-cloud-openfeign 官网文档以及 spring-cloud-openfeign Issues 的查看,大致可以有两中解决方法:
- 添加
Resilience4J
依赖来代替Hystrix
,具体可看官网的 spring-cloud-openfeign Issues。 spring-cloud-starter-openfeign
3.0.0 后增加了CircuitBreakerFactory
这个类来处理熔断。
Commons
ResponseDto
1 | /** |
ResultCode
1 | /** |
BaseResultCode
1 | /** |
Controller
ServerSimulatorController
1 | /** |
Client
Application
CallingThirdPartyApiApplicationTests
1 |
|
Config
CircuitBreakerConfig
上文已经说过 spring-cloud-starter-openfeign
3.0.0 以及之后的版本,移除了 feign-hystrix
依赖,而该依赖就是用来处理熔断回滚的。所以 spring-cloud-starter-openfeign
3.0.0 以及之后的版本,需要添加额外的熔断配置。具体配置如下(参考 spring-cloud-starter-openfeign 官方案例 CircuitBreakerTests):
1 |
|
Two Circuit Breaker Methods
- Fallback:在
@FeignClient
注解属性中,需要定义fallback
该属性,而该属性需要自定义实现第三方调用接口,这句话看着有点晕,那么直接看下面的案例。如:TpApiClient
这个类是客户端根据服务端定义的第三方调用接口,当服务端出现故障或者网络等问题时,为了确保客户端不会因为这些问题而影响运行。那么最实用的做法就是,客户端自定义一个熔断机制。当客户端调用服务端接口时,服务端发生故障时,那么客户端就会自行触发该熔断机制。spring-cloud-starter-openfeign
就已经为我们提供了这套逻辑处理,具体的做法就是,我们需要额外自定义实现TpApiClient
该接口,当调用TpApiClient
该接口下的方法不成功时,那么就会触发熔断机制TpApiClientFallback
实现类中对应的方法。 - FallbackFactory:在
@FeignClient
注解属性中,还提供了一个属性fallbackFactory
,通过属性名我们大致就能明白其含义。该属性提供给我们以工厂模式的方式来自定义熔断机制。如下案例:我们需要实现FallbackFactory<T>
接口,并重写public TpApiClientWithFactory create(Throwable cause)
方法,该方法就是我们具体需要实现的熔断方法。
Fallback
TpApiClient
1 | /** |
FallbackFactory
- WithFactory:spring-cloud-starter-openfeign 官网给出的熔断回滚工厂模式案例。
- WrapFactory:根据官网给出的熔断回滚工厂模式,进行了简要的封装。
WithFactory
TpApiClientWithFactory
1 | /** |
写到这里,按道理来说应该已经算是结束了,但是我不经会有这样一个疑问。如果客户端需要大量的调用服务端的接口,可能是 50 个接口甚至更多的接口,那么我们是不是也得实现并重写这么多接口,来完成熔断机制的编写呢。这无疑会是一个很大的工作量,是否有更为简单高效的方法呢。当然有,博主在 FallbackFactory<T>
接口的基础上,简要的封装了一个工具类,该工具类中通过 spring
所提供的动态代理 cglib
的方式来帮我们动态生成泛型 T
(也就是第三方调用接口)的实现类(也就是我们所需要定义的熔断机制)。这话看着有点绕,还是老规矩直接上代码。
WrapFactory
ClassUtils
1 | /** |
DefaultFallbackFactory
1 | /** |
TpApiClientWrapFactory
1 | /** |
Test
CloudFeignFallbackTest
1 |
|
**主要:**启动测试类时,服务端不需要启动。
TpApiClientTest Log
1 | 2021-02-06 19:13:45.485 INFO 30116 --- [ main] c.v.c.o.s.config.CircuitBreakerConfig : Creating a circuit breaker with id [tpApiClient_getAccessToken] |
TpApiClientWithFactoryTest Log
1 | 2021-02-06 19:20:42.279 INFO 30174 --- [ main] c.v.c.o.s.config.CircuitBreakerConfig : Creating a circuit breaker with id [TpApiClientWithFactory_getAccessToken] |
TpApiClientWrapFactoryTest Log
1 | 2021-02-06 19:22:07.251 INFO 30189 --- [ main] c.v.c.o.s.config.CircuitBreakerConfig : Creating a circuit breaker with id [TpApiClientWrapFactory_getAccessToken] |
Reference Resources:https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/#spring-cloud-feign-circuitbreaker-fallback
Reference Resources:https://github.com/spring-cloud/spring-cloud-openfeign/blob/v3.0.1/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/circuitbreaker/CircuitBreakerTests.java
Case Source Code:https://github.com/V-Vincen/calling-third-party-api
If you like this blog or find it useful for you, you are welcome to comment on it. You are also welcome to share this blog, so that more people can participate in it. If the images used in the blog infringe your copyright, please contact the author to delete them. Thank you !