前言
该篇博文,主要通过源码分析方式,介绍Reactive Feign接口,底层封装过程,并借此解答上一篇博文一文读懂Reactive Feign:底层请求调用原理及实现细节提及的部分源码类的串联过程。
通过该篇博文,大致可以了解如下内容:
- Feign接口,在Spring环境中,被代理成哪个Bean,进行实际使用。
- Feign接口代理类,内部封装逻辑。
- Feign请求,数据流转方式。
一、Feign接口,代理类创建过程
相信大家知道,在配置类上,通过EnableFeignClients注解,启用Reactive Feign。该注解,通过Import注解,引入ReactiveFeignClientsRegistrar。通过该类,扫描ReactiveFeignClient注解标记的接口,并通过动态代理,装配成Bean。
关于这部分内容,与FeignClient代理类创建过程分析类似,此处不再赘述。不同点在于,Reactive Feign通过ReactiveFeignClientFactoryBean,开启代理类功能。后续内容,也是基于该类,进行分析。
二、Feign代理类,请求处理逻辑封装
ReactiveFeignClientFactoryBean,实现FactoryBean接口,通过getObject为获取Bean实例。此处,将通过geiObject方法,开启这部分内容的源码分析。
// ReactiveFeignClientFactoryBean.java 内容
@Override
public Object getObject() {
return getTarget();
}
/**
* @param <T> the target type of the Feign client
* @return a {@link ReactiveFeign} client created with the specified data and the context information
*/
private <T> T getTarget() {
ReactiveFeignNamedContext namedContext = new ReactiveFeignNamedContext(applicationContext, name);
ReactiveFeignBuilder builder = namedContext.get(ReactiveFeignBuilder.class)
.contract(namedContext.get(Contract.class));
builder = applyConfigurators(builder, namedContext);
if (decode404) {
builder = builder.decode404();
}
builder = fallback(builder, namedContext);
// 通过判断url是否有值,确定是否需要开启负载均衡。this.name,值为服务实例名称。
// builder,对应于ReactiveFeignBuilder
return StringUtils.hasText(this.url)
? (T) builder.target(type, buildUrl())
: (T) builder.target(type, this.name, buildUrl());
}
// ReactiveFeignBuilder.java 内容
default T target(final Target