不操千曲而后晓声,观千剑而后识器。这篇文章主要讲述SpringCloud升级之路2020.0.x版-37. 实现异步的客户端封装配置管理的意义与设计相关的知识,希望能为你提供帮助。
本系列代码地址:??https://github.com/JoJoTec/spring-cloud-parent??
为何需要封装异步 HTTP 客户端 WebClient对于同步的请求,我们使用 spring-cloud-openfeign 封装的 FeignClient,并做了额外的定制。对于异步的请求,使用的是异步 Http 客户端即 WebClient。WebClient 使用也比较简单,举一个简单的例子即:
//使用 WebClient 的 Builder 创建 WebClient
WebClient client = WebClient.builder()
//指定基址
.baseUrl("http://httpbin.org")
//可以指定一些默认的参数,例如默认 Cookie,默认 HttpHeader 等等
.defaultCookie("cookieKey", "cookieValue")
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.build();
创建好 WebClient 后即可以使用这个 WebClient 进行调用:
// GET 请求 /anything 并将 body 转化为 String
Mono<
String>
stringMono = client.get().uri("/anything").retrieve().bodyToMono(String.class);
//这里为了测试,采用阻塞获取
String block = stringMono.block();
返回的结果如下所示(请求
??http://httporg.bin/anything??
会将请求中的所有内容原封不动返回,从这里我们可以看出上面测试的 Header 还有 cokkie 都被返回了):
{
"args": {},
"data": "",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip",
"Cookie": "TestCookie=TestCookieValue,getAnythingCookie=getAnythingCookieValue",
"Getanythingheader": "getAnythingHeaderValue",
"Host": "httpbin.org",
"Testheader": "TestHeaderValue",
"User-Agent": "ReactorNetty/1.0.7"
},
"json": null,
"method": "GET",
"origin": "12.12.12.12",
"url": "http://httpbin.org/anything"
}
我们也可以加入负载均衡的功能,让 WebClient 利用我们内部的 LoadBalancer,负载均衡调用其他微服务,首先注入负载均衡 Filter:
@Autowired
ReactorLoadBalancerExchangeFilterFunction lbFunction;
创建 WebClient 的时候,将这个 Filter 加入:
//使用 WebClient 的 Builder 创建 WebClient
WebClient client = WebClient.builder()
//指定基址微服务
.baseUrl("http://微服务名称")
//可以指定一些默认的参数,例如默认 Cookie,默认 HttpHeader 等等
.defaultCookie("cookieKey", "cookieValue")
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
//负载均衡器,改写url
.filter(lbFunction)
.build();
这样,这个 WebClient 就能调用微服务了。
但是,这样还不能满足我们的需求:
要实现的配置设计以及使用举例首先,我们要实现的 WebClient,其 Filter 包含三个:
需要重试的场景:?ReactorLoadBalancerExchangeFilterFunction?
?
我们需要实现的配置方式是,通过这样配置
??application.yml?
?:
webclient:
configs:
//微服务名称
testService1:
//请求基址,第一级域名作为微服务名称
baseUrl: http://testService1
//最多的 http 连接数量
maxConnection: 50
//连接超时
connectTimeout: 500ms
//响应超时
responseTimeout: 60s
//除了 GET 方法外,哪些路径还能重试
retryablePaths:
- /retryable/**
- /user/orders
加入这些配置,我们就能获取载对应微服务的 WebClient 的 Bean,例如:
//自动装载 我们自定义的 WebClient 的 NamedContextFactory,这个是我们后面要实现的
@Autowired
private WebClientNamedContextFactory webClientNamedContextFactory;
//通过微服务名称,获取对应的微服务调用的 WebClient
webClientNamedContextFactory.getWebClient("testService1");
接下来,我们会实现这些。
微信搜索“我的编程喵”关注公众号,每日一刷,轻松提升技术,斩获各种offer:
【SpringCloud升级之路2020.0.x版-37. 实现异步的客户端封装配置管理的意义与设计】
推荐阅读
- #yyds干货盘点# .NET Core 中对象池(Object Pool)的使用
- #yyds干货盘点#Django 中的超级用户和自己创建 app 原来这么简单!
- MyBatisCodeHelperPro报错(NO MODULE FOUND #yyds干货盘点#)
- Flume面试题整理
- Spark调优 | Spark OOM问题常见解决方式
- #yyds干货盘点# web安全day7(IIS之FTP服务器)
- 5步法,快速找到数据分析思路
- WordPress Sage(如何在特定的单个或存档CPT页面上触发JS())
- WordPress的save_post钩子将被不必要地触发