Spring Cloud — Hystrix 服务隔离、请求缓存及归并

打印 上一主题 下一主题

主题 855|帖子 855|积分 2565

Hystrix 的核心是提供服务容错掩护,防止任何单一依靠耗尽整个容器的全部用户线程。使用舱壁隔离模式,对资源或失败单元进行隔离,避免一个服务的失效导致整个体系垮掉(雪崩效应)。
1 Hystrix监控

Hystrix 提供了对服务请求的仪表盘监控。在客户端加入以下依靠:
  1. <dependency>
  2.     <groupId>org.springframework.cloud</groupId>
  3.     <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
  4. </dependency>
  5. <dependency>
  6.     <groupId>org.springframework.boot</groupId>
  7.     <artifactId>spring-boot-starter-actuator</artifactId>
  8. </dependency>
复制代码
并在客户端的Application类加上@EnableHystrixDashboard注解。
访问地址:http://localhost:8080/hystrix
在输入框中输入监控地址:http://localhost:8080/hystrix.stream,然后点击“Monitor Stream”按钮。

图 Hystrix 监控初始界面


图 Hystrix 仪表盘紧张参数及寄义

2 服务隔离


图 Hystrix 实现服务隔离的思绪

2.1 隔离计谋

Hystrix 提供了线程池隔离和信号量隔离两种隔离计谋。
execution.isolation.strategy 属性设置隔离计谋,默认为THREAD(线程池隔离),SEMAPHORE为信号量隔离。execution.isolation.thread.timeoutInMilliseconds属性设置请求超时时间,默认为1000ms。
2.1.1 线程池隔离

差异服务的执使用用差异的线程池,同时将用户请求的线程(如Tomcat)与具体业务实行的线程分开,业务实行的线程池可以控制在指定的巨细范围内,从而使业务之间不受影响,到达隔离的结果。
长处

     

  • 隔离上风,如果一个服务发生问题,只会影响该服务,而不会影响其他服务。
  • 方便性能变化调整,可以更改对应command的参数(超时时间、重试次数、线程池巨细等)。
缺点

线程及线程池的创建及管理增加了计算开销。
表 线程池隔离的优缺点

关于线程池隔离的相关设置有如下参数:
coreSize:线程池核心线程数。即线程池中保持存活的最小线程数。默认为10。
maximumSize:线程池允许的最大线程数。当核心线程数已满且使命队列已满时,线程池会尝试创建新的线程,直到到达最大线程数。默认为10。
maxQueueSize:线程池使命队列的巨细。默认为-1,表现使命将被直接交给工作线程处理,而不是放入队列中等候。
queueSizeRejectionThreshold:即便没到达maxQueueSize阈值,但到达该阈值时,请求也会被拒绝,默认值为5。

图 新的请求在线程池的处理过程

是否创建新线程,是指当前活跃线程已到达coreSize,但线程数小于maximumSize,Hystrix 会创建新的线程来处理该使命。(这一步还受到queueSizeRejectionThreshold及maxQueueSize参数的影响)。
2.1.2 信号量隔离

用户请求线程和业务实行线程是同一线程,通过设置信号量的巨细限制用户请求对业务的并发访问量,从而到达限流的掩护结果。
长处

1 开销小,避免了线程创建、烧毁及上下文切换等开销。
2 设置简朴,只需要设置信号量巨细即可。
3 适合轻量级操作,如内存或缓存服务访问,这些操作不太可能导致长时间耽误,因此信号隔离可以保持体系的高效性。
缺点

限流本领有限,存在壅闭风险,如果依靠服务壅闭,因为其没有使用线程池来隔离请求,那么可能会影响整个请求链路,导致体系性能降落。
表 Hystrix 信号隔离的优缺点

execution.isolation.semaphore.maxConcurrentRequests 最大并发请求数(信号量巨细)。默认为10。
2.2 服务隔离的颗粒度

@HystrixCommand 注解还有三个属性:commandKey(标识该下令全局唯一的名称,默认情况下,同一个服务名称共享一个线程池)、groupKey(组名,Hystrix 会让相同组名的下令使用同一个线程池)、threadPoolKey(线程池名称,多个服务可以设置同一个threadPoolKey,来共享同一个线程池,在信号量隔离计谋中不起作用)。
3 请求缓存

用户的同一个请求中,消耗者可能会多次重复调用一个服务。Hystrix 提供的请求缓存可以在CommandKey/CommandGroup相同的情况下,直接共享第一次下令实行的结果,低沉依靠调用次数。
  1. @Service
  2. public class UserService {
  3.     private final RestTemplate restTemplate;
  4.     public UserService(RestTemplate restTemplate) {
  5.         this.restTemplate = restTemplate;
  6.     }
  7.     @CacheResult(cacheKeyMethod = "generateCacheKey")
  8.     @HystrixCommand(commandKey = "info3",groupKey = "info3Group",commandProperties = {
  9.             @HystrixProperty(name = "requestCache.enabled", value = "true")})
  10.     public RequestResult<String> info3(String name) {
  11.         System.out.println("发送请求:" + name);
  12.         return RequestResult.success(restTemplate.getForObject("http://provider/user/info?name=" + name, String.class));
  13.     }
  14.     public String generateCacheKey(String name) {
  15.         return name;
  16.     }
  17. }
复制代码
  1. @RequestMapping("/home")
  2. @RestController
  3. public class HomeController {
  4.     private final RestTemplate restTemplate;
  5.     private final UserService userService;
  6.     public HomeController(RestTemplate restTemplate, UserService userService) {
  7.         this.restTemplate = restTemplate;
  8.         this.userService = userService;
  9.     }
  10.     @GetMapping("/info3")
  11.     public RequestResult<String> info3(String name) {
  12.         HystrixRequestContext context = HystrixRequestContext.initializeContext();
  13.         RequestResult<String> result = userService.info3(name);
  14.         userService.info3(name);
  15.         context.close();
  16.         return result;
  17.     }
  18. }
复制代码
 
4 请求归并

Hystrix针对高并发场景,支持将多个请求自动归并为一个请求,通过归并可以减少对依靠的请求,极大节省开销,提高体系服从。
请求归并紧张是通过两部分实现:1)@HystrixCollapser 指定高并发请求的对应请求,其返回值为Futuer。2)@HystrixCommand 指定归并后的单个请求。其参数为第1部分请求参数的集合。
  1. @Service
  2. public class UserService {
  3.     private final RestTemplate restTemplate;
  4.     public UserService(RestTemplate restTemplate) {
  5.         this.restTemplate = restTemplate;
  6.     }
  7.     @HystrixCollapser(
  8.             collapserKey = "info",
  9.             scope = com.netflix.hystrix.HystrixCollapser.Scope.GLOBAL,
  10.             batchMethod = "batchInfo",collapserProperties = {
  11.             @HystrixProperty(name = "timerDelayInMilliseconds", value = "1000"),
  12.             @HystrixProperty(name = "maxRequestsInBatch", value = "3")
  13.     })
  14.     public Future<RequestResult<String>> batchInfo(String name) {
  15.         // 不会被执行
  16.         System.out.println("HystrixCollapser info");
  17.         return null;
  18.     }
  19.     @HystrixCommand
  20.     public List<RequestResult<String>> batchInfo(List<String> names) {
  21.         System.out.println("批量发送:" + names);
  22.         // 依赖也需要有一个支持批量的接口
  23.         String res = restTemplate.getForObject("http://provider/user/info?name=" + names, String.class);
  24.         List<RequestResult<String>> list = new ArrayList<>();
  25.         int count = 0;
  26.         for (String str : names) {
  27.             list.add(RequestResult.success(res + "kk" + str + count++));
  28.         }
  29.         return list;
  30.     }
  31. }
复制代码
  1. @RequestMapping("/home")
  2. @RestController
  3. public class HomeController {
  4.     private final RestTemplate restTemplate;
  5.     private final UserService userService;
  6.     public HomeController(RestTemplate restTemplate, UserService userService) {
  7.         this.restTemplate = restTemplate;
  8.         this.userService = userService;
  9.     }
  10.     @GetMapping("/info2")
  11.     public RequestResult<String> info2(String name) throws ExecutionException, InterruptedException {
  12.         HystrixRequestContext context = HystrixRequestContext.initializeContext();
  13.         Future<RequestResult<String>> future = userService.batchInfo(name);
  14.         RequestResult<String> result = future.get();
  15.         context.close();
  16.         return result;
  17.     }
  18. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

半亩花草

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表