0
点赞
收藏
分享

微信扫一扫

服务的隔离、降级和熔断

老王420 2022-04-16 阅读 85
java

【尚学堂】Java300集零基础适合初学者视频教程_Java300集零基础教程_Java初学入门视频基础巩固教程_Java语言入门到精通_哔哩哔哩_bilibili

1.服务隔离、降级和熔断的产生背景

2.服务隔离解决思路

2.1 线程池隔离

2.2 信号量隔离

3.服务降级

4.服务熔断

<dependencies>
    <dependency>
        <groupId>com.netflix.hystrix</groupId>
        <artifactId>hystrix-metrics-event-stream</artifactId>
        <version>1.5.12</version>
    </dependency>
    <dependency>
        <groupId>com.netflix.hystrix</groupId>
        <artifactId>hystrix-javanica</artifactId>
        <version>1.5.12</version>
    </dependency>
</dependencies>

public class OrderHystrixCommand extends HystrixCommand<JSONObject> {
   @Autowired
   private MemberService memberService;

   public OrderHystrixCommand(MemberService memberService) {
      super(setter());
      this.memberService = memberService;
   }
   @Override
   protected JSONObject run() throws Exception {
      JSONObject member = memberService.getMember();
      System.out.println("当前线程名称:" + Thread.currentThread().getName() + ",订单服务调用会员服务:member:" + member);
      return member;
   }

   /**
    * 使用线程池方式解决隔离
    * @return
    */
   private static Setter setter() {
      // 服务分组
      HystrixCommandGroupKey groupKey = HystrixCommandGroupKey.Factory.asKey("members");
      // 服务标识
      HystrixCommandKey commandKey = HystrixCommandKey.Factory.asKey("member");
      // 线程池名称
      HystrixThreadPoolKey threadPoolKey = HystrixThreadPoolKey.Factory.asKey("member-pool");
      // #####################################################
      // 线程池配置 线程池大小为10,线程存活时间15秒 队列等待的阈值为100,超过100执行拒绝策略
      HystrixThreadPoolProperties.Setter threadPoolProperties = HystrixThreadPoolProperties.Setter().withCoreSize(10)
            .withKeepAliveTimeMinutes(15).withQueueSizeRejectionThreshold(100);
      // ########################################################
      // 命令属性配置Hystrix 开启超时
      HystrixCommandProperties.Setter commandProperties = HystrixCommandProperties.Setter()
            // 采用线程池方式实现服务隔离
            .withExecutionIsolationStrategy(HystrixCommandProperties.ExecutionIsolationStrategy.THREAD)
            // 禁止
            .withExecutionTimeoutEnabled(false);
      return HystrixCommand.Setter.withGroupKey(groupKey).andCommandKey(commandKey).andThreadPoolKey(threadPoolKey)
            .andThreadPoolPropertiesDefaults(threadPoolProperties).andCommandPropertiesDefaults(commandProperties);

   }

   /**
    * 服务降级
    * @return
    */
   @Override
   protected JSONObject getFallback() {
      // 如果Hystrix发生熔断,当前服务不可用,直接执行Fallback方法
      System.out.println("系统错误!");
      JSONObject jsonObject = new JSONObject();
      jsonObject.put("code", 500);
      jsonObject.put("msg", "系统错误!");
      return jsonObject;
   }
}

使用:
/**
 * 线程池方式解决
 * @return
 * @throws InterruptedException
 */
@RequestMapping("/orderIndexHystrix")
public Object orderIndexHystrix() throws InterruptedException {
   return new OrderHystrixCommand(memberService).execute();
}
信号量方式 和线程池方式也就setter方法不一致,其他的均一致
/**
 * 使用信号量解决隔离
 * @return
 */
private static Setter setter() {
   // 服务分组
   HystrixCommandGroupKey groupKey = HystrixCommandGroupKey.Factory.asKey("members");
   // 命令属性配置 采用信号量模式
   HystrixCommandProperties.Setter commandProperties = HystrixCommandProperties.Setter()
         .withExecutionIsolationStrategy(HystrixCommandProperties.ExecutionIsolationStrategy.SEMAPHORE)
         // 使用一个原子计数器(或信号量)来记录当前有多少个线程在运行,当请求进来时先判断计数
         // 器的数值,若超过设置的最大线程个数则拒绝该请求,若不超过则通行,这时候计数器+1,请求返 回成功后计数器-1。
         .withExecutionIsolationSemaphoreMaxConcurrentRequests(50);
   return HystrixCommand.Setter.withGroupKey(groupKey).andCommandPropertiesDefaults(commandProperties);
}


 

举报

相关推荐

0 条评论