乐趣区

关于java:Hystrix服务保护框架

Hystrix 简介

基于 Hystrix 解决服务雪崩效应原理:

  1. 服务降级:在高并发状况下避免始终期待,而应用降级的形式(返回一个敌对提醒给客户端,不会去解决申请,调用 fallBack 本地办法),在 tomcat 没有线程解决申请的时候,不应该让用户始终期待。目标是为了用户体验。
  2. 服务熔断:目标为了爱护服务。在高并发状况下,如果申请达到肯定极限(能够本人设置阈值),如果流量超出了设置的阈值,主动开启服务爱护性能,应用服务降级形式返回一个敌对提醒。服务熔断和服务降级个别是一起应用的
  3. 服务隔离:线程池隔离和信号量隔离。每个服务接口有本人独立的线程池,每个线程池互不影响,毛病 CPU 占用率十分高。不是所有的接口都采纳线程隔离,外围要害接口隔离

依赖

springcloud-parent 中引入 pom 依赖:

<!--hystrix 断路器 -->
<dependency>
 <groupId>org.springframework.cloud</groupId>
 <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

springcloud-api-order-service-impl 中开启断路器

#### 开启 hystrix 断路器
feign:
  hystrix:
    enabled: true  # 在 feign 中开启 hystrix

Feign 调用同一个接口模仿雪崩效应,一个是没加了 @HystrixCommand 注解的,一个是加了 @HystrixCommand 注解的。并创立一个办法,验证开启 @HystrixCommand 注解会 默认开启:

  1. 默认开启服务隔离,以线程池隔离形式
  2. 默认开启服务降级执行办法
  3. 默认开启服务服务熔断机制
package com.baba.api.service.impl;
import com.baba.api.entity.UserEntity;
import com.baba.api.feign.MemberServiceFeign;
import com.baba.api.service.IOrderService;
import com.baba.wlb.base.BaseResponse;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * @Author wulongbo
 * @Date 2021/1/22 13:51
 * @Version 1.0
 */
@RestController
public class OrderServiceImpl implements IOrderService {
    // 订单服务集成会员服务接口,用来实现 feign 客户端 缩小接口反复代码
 @Autowired
 private MemberServiceFeign memberServiceFeign;
 @Override
 @RequestMapping("/getOrderByMember")
    public String getOrderByMember(String name) {UserEntity userEntity = memberServiceFeign.getMember(name);
 return userEntity == null ? "没有找到用户信息!" : userEntity.toString();}
    // 没有解决服务雪崩效应
 @Override
 @RequestMapping("/getUserInfoByMember")
    public BaseResponse getUserInfoByMember() {return memberServiceFeign.getUserInfo();
 }
    // 解决服务雪崩效应
 /***
 * fallbackMethod 办法作用:服务降级执行。* @HystrixCommand 默认开启服务隔离,以线程池隔离形式
 * 默认开启服务降级执行办法 getUserInfoByMemberHystrixFallbackMethod
 * 默认开启服务服务熔断机制
 */
 @HystrixCommand(fallbackMethod = "getUserInfoByMemberHystrixFallbackMethod")
    @RequestMapping("/getUserInfoByMemberHystrix")
    public BaseResponse getUserInfoByMemberHystrix() {System.out.println("getUserInfoByMemberHystrix--> 线程池名称:" + Thread.currentThread().getName());
 return memberServiceFeign.getUserInfo();}
    public BaseResponse getUserInfoByMemberHystrixFallbackMethod() {return new BaseResponse(500, "返回一个敌对提醒", "服务降级,服务器忙碌,请稍后重试!");
 }
    // 订单服务接口
 @Override
 @RequestMapping("/getOrderInfo")
    public String getOrderInfo() {System.out.println("getOrderInfo--> 线程池名称:" + Thread.currentThread().getName());
 return "订单服务接口调用胜利!";
 }
    // Hystrix 有两种形式配置爱护服务,通过注解和接口模式
}

IOrderService 接口类:

package com.baba.api.service;
import com.baba.wlb.base.BaseResponse;
import org.springframework.web.bind.annotation.RequestMapping;
/**
 * @Author wulongbo
 * @Date 2021/1/22 13:46
 * @Version 1.0
 */public interface IOrderService {// 订单服务调用会员服务接口 feign @RequestMapping("/getOrderByMember")
    String getOrderByMember(String name);
 // 订单服务调用会员服务接口 feign @RequestMapping("/getUserInfoByMember")
    BaseResponse getUserInfoByMember();
 // 订单服务调用会员服务接口 feign @RequestMapping("/getOrderInfo")
    String getOrderInfo();}

启动测试

测试线程池隔离

顺次启动 Eureka Server,Member 和 order 服务:
拜访:http://localhost:8200/getUserInfoByMemberHystrix 和 http://localhost:8200/getOrderInfo



证实 @HystrixCommand 注解会默认开启服务隔离,以线程池隔离形式。

测试服务熔断降级

关上测试工具,Apache JMeter, 开 200 个线程,循环 100 组,测试 20000 个并发

拜访 http://localhost:8200/getUserInfoByMemberHystrix 接口测试


能够看到只执行了 10 次,默认并发申请数为 10, 阐明服务熔断失效,而咱们测试一般接口 http://localhost:8200/getOrderInfo


能够看到没有做降级解决。

浏览器测试熔断接口

当初咱们应用浏览器拜访 http://localhost:8200/getUserInfoByMemberHystrix



能够发现 Feign 客户端 getUserInfo()接口能拜访到,然而走的是服务降级办法,起因是因为浏览器 (默认 1s,能够配置) 在 1s 内没有拿到申请后果就会走服务降级办法(即响应工夫,而非调用接口工夫)。

解决方案,因为咱们在会员接口设置了休眠工夫,而咱们 hystrix 是默认开启超时工夫的,所以想要咱们接口能够失常拜访,须要敞开超时配置:

hystrix:
  command:
    default:
      execution:
        timeout:
          enabled:
            false

重启后再次拜访 http://localhost:8200/getUserInfoByMemberHystrix
期待 1.5s 后,接口可能失常拜访!

留神:这里只是演示成果,失常线上是肯定要开始超时工夫的

退出移动版