共计 2149 个字符,预计需要花费 6 分钟才能阅读完成。
1.前言
微服务的盛行,彼此间的交互必不可少,常见的有RPC通信,也有基于HTTP通信的,openFeign就是后者。对使用openFeign有不少人存在误区,只认为Cloud下服务通讯优雅的落地方案。殊不知openFeign在非cloud环境也是可以使用的!设想一下第三方交互接口使用openFeign定义,那也太简洁了吧。
2.openFeign之旅
篇幅有限,笔者就不自定义openfeign的starter了,我们就使用cloud的starter来演示,添加版本依赖以及我们的openFeign
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud-version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
先简单看下FeignAutoConfiguration
openFeign的依赖全乎了。开始定义我们的接口,假设第三方业务系统的地址为127.0.0.1:8080,存在一个接口URI为/api/sample/test,我们就可以这么写
@FeignClient(name = "no-op-service",url = "127.0.0.1:8080",
path = "/api/sample")
public interface SampleClient {
@PostMapping(value = "/test")
CommonResponse<Integer> test();
}
接下来我们只需要使用EnableFeignClients注解启用SampleClient的路径就OK了。像使用其它Bean一样使用SampleClient,是不是很简单?这时候有人说了,我们接口要鉴权的,你这怎么添加鉴权信息呢?答案是当然可以!openFeign提供了一个接口RequestInterceptor,实现它,添加我们自己的鉴权信息并添加到Bean容器里就行了。
public class SampleRequestInterceptor implements RequestInterceptor{
@Override
public void apply(RequestTemplate template) {
// todo
}
}
这时候问题又来了,业务系统和多个第三方系统都有交互,我们总不能把所有第三方业务的鉴权规则写在一个拦截器里吧,当然我们可以添加一套责任链模式来分拆这里的鉴权实现,达到一定的解藕,但是业务代码不是一直由一两个程序员写的,其他程序员也可能要写这部分,所以有时候问题越简化,更利于程序的维护。这时候我们的FeignContext闪亮登场
直接说这个,很多小伙伴丈二和尚摸不着头脑的感觉,其实FeignClient会被注册到Bean容器里
这里FeignClientFactoryBean是个特殊的Bean,它是FactoryBean的实现,核心在于它的getObject方法,看下它干了什么好事
原来偷偷摸摸的叫别人干事!干的事还不少,笔者展示一个
到这里和FeignClient的configuration对上号了,可以写代码了。安排!
@FeignClient(name = "no-op-service",url = "127.0.0.1:8080",
path = "/api/sample",configuration=SampleClientConfiguration.class)
public interface SampleClient {
@PostMapping(value = "/test")
CommonResponse<Integer> test();
}
@Configuration(proxyBeanMethods = false)
public class SampleClientConfiguration {
@Bean
public SampleRequestInterceptor sampleRequestInterceptor(){
return new SampleRequestInterceptor();
}
}
到这里笔者解释下前面的FeignContext,FeignClientFactoryBean会尝试从FeignContext里获取自己的容器上下文里的Bean,而这些Bean就是SampleClientConfiguration注册的,也就是说此SampleRequestInterceptor只存在于SampleClient的容器上下文里,完美解决了多个Client的隔离问题!
3.小结
本文简述了openFeign的使用,并对openFeign的父子上下文作了简单探讨。