共计 3720 个字符,预计需要花费 10 分钟才能阅读完成。
Hystrix 简介
基于 Hystrix 解决服务雪崩效应原理:
- 服务降级:在高并发状况下避免始终期待,而应用降级的形式(返回一个敌对提醒给客户端,不会去解决申请,调用 fallBack 本地办法),在 tomcat 没有线程解决申请的时候,不应该让用户始终期待。目标是为了用户体验。
- 服务熔断:目标为了爱护服务。在高并发状况下,如果申请达到肯定极限(能够本人设置阈值),如果流量超出了设置的阈值,主动开启服务爱护性能,应用服务降级形式返回一个敌对提醒。服务熔断和服务降级个别是一起应用的
- 服务隔离:线程池隔离和信号量隔离。每个服务接口有本人独立的线程池,每个线程池互不影响,毛病 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
注解会 默认开启:
- 默认开启服务隔离,以线程池隔离形式
- 默认开启服务降级执行办法
- 默认开启服务服务熔断机制
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 后,接口可能失常拜访!留神:这里只是演示成果,失常线上是肯定要开始超时工夫的