这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战
本系列代码地址:github.com/JoJoTec/spr…
上一节我们通过单元测试验证了重试的正确性,这一节我们来验证我们线程隔离的正确性,主要包括:
- 验证配置正确加载:即我们在 Spring 配置(例如
application.yml
)中的加入的 Resilience4j 的配置被正确加载应用了。 - 相同微服务调用不同实例的时候,使用的是不同的线程(池)。
验证配置正确加载
与之前验证重试类似,我们可以定义不同的 FeignClient,之后检查 resilience4j 加载的线程隔离配置来验证线程隔离配置的正确加载。
并且,与重试配置不同的是,通过系列前面的源码分析,我们知道 spring-cloud-openfeign 的 FeignClient 其实是懒加载的。所以我们实现的线程隔离也是懒加载的,需要先调用,之后才会初始化线程池。所以这里我们需要先进行调用之后,再验证线程池配置。
首先定义两个 FeignClient,微服务分别是 testService1 和 testService2,contextId 分别是 testService1Client 和 testService2Client
1 | less复制代码@FeignClient(name = "testService1", contextId = "testService1Client") |
然后,我们增加 Spring 配置,并且给两个微服务都添加一个实例,使用 SpringExtension 编写单元测试类:
1 | less复制代码//SpringExtension也包含了 Mockito 相关的 Extension,所以 @Mock 等注解也生效了 |
编写测试代码,验证配置正确:
1 | scss复制代码@Test |
相同微服务调用不同实例的时候,使用的是不同的线程(池)。
我们需要确保,最后调用(也就是发送 http 请求)的执行的线程池,必须是对应的 ThreadPoolBulkHead 中的线程池。这个需要我们对 ApacheHttpClient 做切面实现,添加注解 @EnableAspectJAutoProxy(proxyTargetClass = true)
:
1 | less复制代码//SpringExtension也包含了 Mockito 相关的 Extension,所以 @Mock 等注解也生效了 |
拦截 ApacheHttpClient
的 execute
方法,这样可以拿到真正负责 http 调用的线程池,将线程其放入请求的 Header:
1 | typescript复制代码@Aspect |
这样,我们就能拿到具体承载请求的线程的名称,从名称中可以看出他所处于的线程池(格式为“bulkhead-线程隔离名称-n”,例如 bulkhead-testService1Client:www.httpbin.org:80-1
),接下来我们就来看下不同的实例是否用了不同的线程池进行调用:
1 | ini复制代码@Test |
这样,我们就成功验证了,实例调用的线程池隔离。
微信搜索“我的编程喵”关注公众号,每日一刷,轻松提升技术,斩获各种offer
本文转载自: 掘金