一. 背景
我们的业务当中会大量依赖于第三方的服务,而这些第三方的服务都是基于Http请求的。我们的调用模式基本如下:
业务时序图
因此,第三方资源的稳定性会直接影响我们的业务。除此之外,如果是第三方资源响应速度变慢,则会长时间占用我们的线程池,严重的情况下会产生雪崩效应。
外部依赖I发生堵塞
为了防止这种现象发生,我们需要对服务做隔离,熔断,降级以及限流操作。
二. 业务调用示例
2.1 Controller层
客户端请求地址
2.2 Service业务层
在service当中使用restTemplate操作第三方资源,在这里我使用restTemplate调用睡眠地址,模拟了一下第三方资源的处理过程。
模拟业务执行10秒
业务调用层
这里的restTemplate.getForEntity("http://127.0.0.1:8080/hystrix/sleep",String.class)就是在模拟第三方http资源的处理,我们这里是处理10秒。
2.3 客户端调用
httpClient模拟客户羰
客户端返回结果
浏览器直接访问
服务端调用日志
以上就是一次正常的服务请求,耗时10S。正是我们模拟的第三方资源处理时间。
三. 模拟在第三方资源处理时间内打爆RestTemplate线程池
3.1 我们将服务端RestTemplate连接池设置为5个
设置RestTemplate线程池数量
3.2 将客户端请求封装的线程中模拟客户端请求