Spring Cloud Ribbon/Hystrix
客户端负载均衡Spring Cloud Ribbon
前言
基于Http和Tcp的客户端负载均衡工具
- 微服务中使用客户端负载均衡
- 服务提供者:只需要启动多个服务实例并注册到一个注册中心或多个注册中心
- 服务消费者:调用被@LoadBalanced注解修饰过的RestTemplate来实现面向服务的接口调用
@Bean
@LoadBalanced
//开启客户端负载均衡
RestTemplate restTemplate() {
return new RestTemplate();
}
@Autowired
RestTemplate restTemplate;
RestTemplate
- get请求:getForObject、getForEntity
- post请求:postForEntity、postForObject、postForLocation
- put请求:put
- delete请求:delete
//例如参数 url:http://<服务名>/路径参数
restTemplate.getForObject("http://HELLO-SERVICE/hello",String.class)
restTemplate.postForEntity("http://HELLO-SERVICE/insertOne",user,User.class)
restTemplate.put("http://HELLO-SERVICE/updateOne/{id}",user,id);
restTemplate.delete("http://HELLO-SERVICE/delete/{id}",90);
Ribbon参数配置
- 全局配置 ribbon.ConnectTimeout
- 指定客户端配置 <服务名>.ribbon.listOfServices=
与Eureka结合
- Spring Cloud 同时引入Ribbon和Eureka会触发Eureka实现对Ribbon的自动化配置,可用ribbon.eureka.enable 禁用
- 区域亲和策略 eureka.instance.metadata-map.zone
ribbon重试
服务容错保护Spring Cloud Hystrix
使用Hystrix
- 引入spring-cloud-starter-hystrix依赖
- 开启断路器@EnableCircuitBreaker
- 改造服务消费模式
- 新增service类,注入ResTemplate
- 在相应的函数上添加@ HystrixCommand注解,指定回调方法
断路器模式
当某个服务单元发生故障之后,通过断路器的故障监控,自调用方法返回一个错误响应,而不是长时间的等待,这样就不会使得线程因调用故障服务而被长时间占有不释放,避免了故障在分布式系统中的蔓延;
Hystrix的默认超时时间为2S,底层使用RxJava
Hystrix接口和注解的使用方法
使用方式
- 通过继承 继承HystrixCommand 重写run方法,可同步/异步
- 通过@HystrixCommand注解 异步需要
//注解-异步方式
@HystrixCommand
public Future<User> getUserByAsyc(Long id) {
return new AsyncResult<User>() {
@Override
public User invoke() {
return restTemplate.getForObject("http://HELLO-SERVICE/user/{id}",User.class,id);
}
};
}
服务降级(fallback是Hystrix执行失败后的备用方法)
- 通过重载getFallback()
- 注解 @HystrixCommand(fallbackMethod = “helloFallback”),
- 注解使用的方法和指定降级的方法在同一个主类上;
- 异常获取,在fallback实现的方法中添加Throwable e参数,可获取异常
- 异常传播 ignoreExceptions
注解-同步调用 (ignoreExceptions 异常传播 不会触发后续的fallback逻辑)@HystrixCommand(ignoreExceptions = {HystrixBadRequestException.class})
线程池划分、命令令名称、分组
- 继承方式忽略
- Hystrix命令默认的线程划分是根据命令分组来实现的,默认相同组名的的名称使用的同一个线程池;
//commandKey :命令名称(命令名)
//groupKey:分组(组名)
//threadPoolKey:线程池划分
@HystrixCommand(commandKey = "zhuJieUser",groupKey = "userGroup",threadPoolKey = "zhuJieUserThread")
请求缓存
- 继承方式重载getCacheKey()方法
- 注解方式
- cacheKeyMethod:用于指名请求命名同一个类中,指定一个方法作为缓存key (用于定义缓存key)
- 缓存清理时,commanKey必须指定
请求合并(减少通信消耗和线程数占用)
- 继承方式(省略)
- @HystrixCollapser注解
- 是否使用请求合并主要考虑请求本身的延迟和延迟时间窗内的并发量
/**
* batchMethod指定批量请求方法
* collapserProperties 请求合并器设置相关属性
* timerDelayInMilliseconds 设置合并时间窗
* @param id
* @return
*/
@HystrixCollapser(batchMethod = "findAll",collapserProperties = {@HystrixProperty(name="timerDelayInMilliseconds",value = "100")})
@Override
public User fing(Long id) {
return null;
}
@HystrixCommand
@Override
public List<User> findAll(List<Long> ids) {
return restTemplate.getForObject("http://HELLO-SERVICE/users?ids={1}",List.class, StringUtils.join(ids,","));
}
属性详解
- 全局默认值:没有下边三个,此为默认项
- 全局配置属性:配置文件中定义全局属性,可用Spring Cloud Config和Spring Cloud Bus 动态刷新配置
- 实例默认值:通过代码为实例设置属性
- 实例配置属性:配置文件中定义实例属性,可用Spring Cloud Config和Spring Cloud Bus 动态刷新配置
具体的属性配置
Hystrix 仪表盘
引入Turbine来聚合监控
参考《Spring Cloud 微服务实战》