防雪崩利器
基于Netflix对应的Hystrix
具备的功能:
1.服务降级
2.依赖隔离
3.服务熔断
4.监控(Hystrix Dashboard)
优先核心服务,非核心服务不可用或弱可用
通过HystrixCommand注解指定
fallbackMethod(回退函数)中具体实现降级逻辑
1.引入依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-hystrixartifactId>
dependency>
<dependency>
<groupId>com.netflix.hystrixgroupId>
<artifactId>hystrix-javanicaartifactId>
<version>RELEASEversion>
dependency>
2.修改启动类配置
@SpringCloudApplication
/*@SpringBootApplication
@EnableDiscoveryClient
// hystrix需添加
@EnableCircuitBreaker*/
3.Controller
@RestController
// 设置默认返回方法
@DefaultProperties(defaultFallback = "defaultFallback")
public class HystrixController {
@HystrixCommand(commandProperties = {
// 设置超时时长
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")
})//(fallbackMethod = "fallback")
@GetMapping("/getProductInfoList")
public String getProductInfoList() {
RestTemplate restTemplate = new RestTemplate();
return restTemplate.postForObject("http://127.0.0.1:8005/product/listForOrder",
Arrays.asList("1530607189075321022"),
String.class);
}
private String fallback() {
return "太拥挤了,请稍候再试~~";
}
private String defaultFallback() {
return "默认:太拥挤了,请稍候再试~~";
}
}
hystrix:
command:
# 默认超时时间
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 1000
# 单个方法自定义超时时间,名称为controller方法名
getProductInfoList:
execution:
isolation:
thread:
timeoutInMilliseconds: 3000
线程池隔离:会为每个HystrixCommand设置一个独立的线程池,这样在一个HystrixCommand包装下的依赖服务出现延迟过高的情况,也只是对该依赖服务的调用产生影响,并不会拖慢其他服务。
Hystric自动实现了依赖隔离。
1.配置:
feign:
hystrix:
enabled: true
2.服务端
@FeignClient(name = "product", fallback = ProductClient.ProductClientFallback.class)
public interface ProductClient {
@PostMapping("/product/listForOrder")
List<ProductInfoOutput> listForOrder(@RequestBody List<String> productIdList);
@Component
static class ProductClientFallback implements ProductClient {
@Override
public List<ProductInfoOutput> listForOrder(List<String> productIdList) {
return null;
}
}
}
3.调用方启动类配置
@ComponentScan(basePackages = "com.imooc")
Circuit Breaker:断路器
断路器模式设计状态机:3种模式closed,open,half open
调用失败累计达到一定的阈值或者一定的比例就会启动熔断机制,open是容器打开状态,此时对服务都直接返回错误,但是会设置一个时钟选项,默认的到达这个时间之后,就会进入半熔断状态,允许定量的服务请求。如果调用都成功,或者达到一定的比例,则会关闭熔断器,否则再次进入open。
@HystrixCommand(commandProperties = {
@HystrixProperty(name = "circuitBreaker.enabled", value = "true"), // 设置熔断
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"),
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60")
})
circuitBreaker.sleepWindowInMilliseconds:休眠时间窗(10000毫秒),休眠时间结束之后,会将断路器设置为half open,尝试熔断请求命令,如果失败,会重新进入熔断状态,休眠时间窗重新计时。如果成功,则关闭熔断器。
circuitBreaker.requestVolumeThreshold:滚动时间窗口中,断路器的最小请求数(10次)
circuitBreaker.errorThresholdPercentage:滚动时间窗口中请求超过这个比例,会进入熔断状态(60%,也就是10次中的7次)
1.引入依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-netflix-hystrix-dashboardartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
2.修改启动类
@EnableHystrixDashboard
如果出现Failed opening connection to http://localhost:8091/hystrix.stream?delay=100 : 404 : HTTP/1.1 404 错误,需要在主类添加方法:
@Bean
public ServletRegistrationBean getServlet() {
HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
registrationBean.setLoadOnStartup(1);
registrationBean.addUrlMappings("/actuator/hystrix.stream");
registrationBean.setName("HystrixMetricsStreamServlet");
return registrationBean;
}
3.其他版本SpringBoot可能需要配置yml文件,如果不配置会出现上诉404错误
management:
context-path: /