【熔断器Spring Cloud Hystrix】
六、请求缓存
Hystrix为了降低访问服务的频率,支持将一个请求与返回结果做缓存处理。如果再次请求的URL没有变化,那么Hystrix不会请求服务,而是直接从缓存中将结果返回。这样可以大大降低访问服务的压力。
Hystrix自带缓存。有两个缺点:
- 是一个本地缓存。在集群情况下缓存是不能同步的。
- 不支持第三方缓存容器。Redis,memcached不支持的。
所以可以利用spring cache。实现请求缓存。
在降级处理的代码基础上完成下面变化。
什么是请求改变?IP,端口,主机名,域名,参数发生变化,都是请求改变。商业项目中,项目上线后,都使用域名访问,不涉及到ip,端口,主机名的变化,就是参数改变的问题,那么只要使用SpringEL保证缓存的key是和请求参数相关的,就可以保证缓存的有效性。项目中,写请求的数量,远少于读请求,极限比例的达到百万级:1。缓存效果非常明显,做缓存同步,不管多麻烦,都有必要。
1. 添加依赖
2. 修改配置文件
添加redis的配置,此处使用的是redis单机版。如果是redis集群使用spring.redis.cluster.nodes进行配置。
3. 修改启动类
在启动类上添加@EnableCaching注解
4. 在HystrixService和实现类上添加
在service实现类方法上面额外再添加一个注解。
5. 编写控制器,进行测试
控制器代码没有变化,直接调用service即可。
6. 检查结果
通过在redis中keys * 查看是否添加/删除key成功。
七、请求合并
没有请求合并
Application Service 负载是Application Client发送请求的总数量
请求合并
把一段时间范围内的所有请求合并为一个请求。大大的降低了Application Service 负载。
什么情况下使用请求合并
在微服务架构中,我们将一个项目拆分成很多个独立的项目,这些独立的项目通过远程调用来互相配合工作,但是,在高并发情况下,通信次数的增加会导致总的通信时间增加,同时,线程池的资源也是有限的,高并发环境会导致有大量的线程处于等待状态,进而导致响应延迟,为了解决这些问题,我们需要来了解Hystrix的请求合并。
请求合并的缺点
设置请求合并之后,本来一个请求可能5ms就搞定了,但是现在必须再等10ms看看还有没有其他的请求一起的,这样一个请求的耗时就从5ms增加到15ms了,不过,如果我们要发起的命令本身就是一个高延迟的命令,那么这个时候就可以使用请求合并了,因为这个时候时间窗的时间消耗就显得微不足道了,另外高并发也是请求合并的一个非常重要的场景。
1. 请求合并参数介绍
请求合并理论学习明白后,代码实现起来还是很容易的。关键就是一个@HystrixCollapser注解
2. 代码实现
实现请求合并时,不仅仅需要修改Application Client代码,还需要修改Application Service的代码,因为Application Service必须支持把所有参数捆绑到一起的方式,同时还支持把多个值一起返回。
2.1 修改Application Service控制器
没有请求合并时的控制器
有请求合并时必须要支持一次传递过来多个参数和一次返回多个值。在额外添加一个控制器方法。
参数添加@RequestBody是因为Application Client使用请求体传递数据。
返回值也是List,List里面数据是有顺序的。
2.2 修改Application Client的Service
在请求缓存的代码基础上,在service及实现类中添加新方法。
@HystrixCollapser 进行请求合并
batchMethod:处理请求合并的方法
scope - 合并请求的请求作用域。可选值有global和request。
global代表所有的请求线程都可以等待可合并。 常用
request代表一个请求线程中的多次远程服务调用可合
timerDelayInMilliseconds:等待时长,默认10毫秒。
maxRequestInBatch:最大请求合并数量。
@HystrixCommand 处理请求合并的方法必须有此注解。
实现类中client(String)方法一旦被@HystrixCollapser标记,方法就不会被执行,方法体中为空即可。直接执行batchMethod对应的方法。
batchMethod方法返回值顺序和传递进来的参数顺序有关系的。
注意:在实际测试中scope使用默认值REQUEST会出现空指针异常,请换成GLOBAL
2.3 修改consumer中控制器方法
在一个控制器中多次调用service的方法进行模拟并发操作。
控制通过休眠模拟两次并发请求。
f1和f2的输出语句必须放到请求后面,否则无法合并。
八、Hystrix-dashboard
Hystrix-dashboard能够让Actuator从json转换为界面。
在包含Hystrix的项目中(DemoFallback)进行操作
1. 添加依赖
2. 修改启动器注解
3. 修改配置文件
4. 在浏览器访问
先访问非界面版,等待ping成功。
地址栏输入:http://localhost:8081/actuator/hystrix.stream
访问界面版。
在地址栏输入:http://localhost:8081/hystrix访问界面版。
在界面的输入框中输入监控中心地址http://localhost:8081/actuator/hystrix.stream 后点击“Monitor Stream”
跳转到结果页面。
只有包含@HystrixCommand的方法,被执行后就会显示对应的图片
九、Feign的降级处理
1. 添加依赖
Feign中包含Hystrix中部分功能。所以不需要单独导入Hystrix的依赖。
1. 编写配置文件
默认情况下Feign的hystrix是不开启的,需要手动开启。其他方式和之前配置是相同的。
2. 编写service
编写HystrixService内容。依然使用Feign进行声明式调用。
在案例中是直接使用内部类进行实现的,也可以新建一个类进行完成。
fallback属性表示降级后处理类。
3. 编写启动器
需要更多Java学习资料的小伙伴可以到评论区留言或私信我获取哦