openFeign的妙用

1,014次阅读
没有评论

共计 2149 个字符,预计需要花费 6 分钟才能阅读完成。

1.前言

微服务的盛行,彼此间的交互必不可少,常见的有RPC通信,也有基于HTTP通信的,openFeign就是后者。对使用openFeign有不少人存在误区,只认为Cloud下服务通讯优雅的落地方案。殊不知openFeign在非cloud环境也是可以使用的!设想一下第三方交互接口使用openFeign定义,那也太简洁了吧。

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>

其实这里帮我们尝试装配了以下内容
openFeign的妙用

先简单看下FeignAutoConfiguration

openFeign的妙用

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闪亮登场

openFeign的妙用

直接说这个,很多小伙伴丈二和尚摸不着头脑的感觉,其实FeignClient会被注册到Bean容器里

openFeign的妙用

这里FeignClientFactoryBean是个特殊的Bean,它是FactoryBean的实现,核心在于它的getObject方法,看下它干了什么好事

openFeign的妙用

原来偷偷摸摸的叫别人干事!干的事还不少,笔者展示一个

openFeign的妙用

到这里和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的父子上下文作了简单探讨。

正文完
 
mysteriousman
版权声明:本站原创文章,由 mysteriousman 2022-04-26发表,共计2149字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)