Hystrix整合Spring
Hystrix主要用于保护调用服务的一方,如果被调用的服务发生故障,符合一定的条件,就开启断路器,对调用的程序进行隔离。
下面就一个测试项目入口,看看怎么在Spring中使用Hystrix。
测试项目分为3个部分:
- hystrix-spring-server:作为Eureka服务端,监听端口8761
- hystrix-spring-provider:提供REST服务,监听8080端口。提供一个/person/{personId}接口
- hystrix-spring-invoker:服务调用方,监听9000端口,提供一个/router/{personId}接口
hystrix-spring-server
pom文件依赖为:
1 | <dependencies> |
启动程序为:
1 | @SpringBootApplication |
hystrix-spring-provider
pom文件依赖为:
1 | <dependencies> |
REST controller为:
1 |
|
perosn 类为
1 | public class Person { |
启动类为
1 |
|
hystrix-spring-invoker
pom依赖为:
1 | <dependencies> |
Rest Controller为:
1 |
|
Person类同hystrix-spring-provider中的person
PersonService为:
1 |
|
我们使用注解@HystrixCommand修饰getPerson方法,再配置一个fallbackMethod为getPersonFallback方法。被@HystrixCommand修饰的方法,会被AspectJ进行代理,Spring会将相关的类转换为Bean放到容器中。
最后启动类为:
1 |
|
使用注解@EnableCircuitBreaker,启用断路器。
启动三个服务之后,在浏览器中输入http://localhost:9000/router/2
就能看到正常结果了
然后,关闭hystrix-spring-provider,就能看到断路器发挥了作用
缓存注解
缓存与合并请求功能需要先初始化请求上下文才能实现。新建一个javax.servlet.filter,用于创建与销毁Hystrix的请求上下文。
1 |
|
添加CacheService:
1 |
|
然后在InvokeController中添加/cache/{personId}
1 |
|
调用接口/cache/2之后。可以正常获取结果,
查看后天,可以发现,只有getPerson方法只执行了一次,其他的都是走的缓存。
缓存相关的注解主要有以下3个:
- @CacheResult:该注解修饰的方法,表示被修饰的方法返回结果将会被缓存,需要配合@HystrixCommand一起使用
- @CacheRemove:用于修饰方法让缓存失效,需要与@CacheResult的缓存key关联
- @CacheKey:用于修饰方法参数,表示该参数作为缓存的key
1 |
|
以上代码片段中的cacheMethod方法,使用的缓存key为removeKey,方法updateMethod被调用后,将会删除key为removeKey的缓存。
合并请求注解
在Spring Cloud中同样支持合并请求,在一次HTTP请求的过程中,收集一段时间内的相同请求,放到一个批处理命令中执行。实现合并请求,同样需要先初始化请求上下文。
新增CollapseService
1 |
|
在InvokerController中添加新的/collapse接口
1 |
|
使用
注解@HystrixCollapser(batchMethod = “getPersons”, collapserProperties = {
@HystrixProperty(name = “timerDelayInMilliseconds”, value = “1000”)
})
设置批量方法为getPersons,然后设置时间为1S。即,如果在1S的有相同的请求,就合并,而后调用getPersons方法。
从执行结果看,最终是只执行了getPersons方法。