Hystrix配置入门
1.为什么需要Hystrix
hystrix就是对服务进行隔离保护。以实现服务不会出现连带故障。导致整个系统不可用 hystrix 对服务进行隔离保护
2.Hystrix是什么
Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性
3.Hystrix能解决什么问题
线程池隔离:Hystrix隔离方式采用线程/信号量的方式,通过隔离限制依赖的并发量和阻塞扩散
线程隔离: hystrix在每一个依赖调用分配了一个线程池,单线程池满了调用将会立即被拒绝,默认采用不排队,加速失败判定,线程数是可以被设定的。
4.什么是服务雪崩
是一种因服务”提供者”的不可用导致服务”调用者”的不可用,并将不可用逐渐放大的过程
5.造成雪崩的原因有哪儿些
1)服务提供者不可用
• a)硬件故障:硬件损坏造成的服务器主机宕机, 网络硬件故障造成的服务提供者的不可访问
• b)程序Bug:
• c) 缓存击穿:缓存击穿一般发生在缓存应用重启, 所有缓存被清空时,以及短时间内大量缓存失效时. 大量的缓存不命中, 使请求直击后端,造成服务提供者超负荷运行,引起服务不可用
• d)用户大量请求:在秒杀和大促开始前,如果准备不充分,用户发起大量请求也会造成服务提供者的不可用
2)重试加大流量
• a)用户重试:在服务提供者不可用后, 用户由于忍受不了界面上长时间的等待,而不断刷新页面甚至提交表单
• b)代码逻辑重试: 服务调用端的会存在大量服务异常后的重试逻辑
3)服务调用者不可用
• a)同步等待造成的资源耗尽:当服务调用者使用同步调用 时, 会产生大量的等待线程占用系统资源. 一旦线程资源被耗尽,服务调用者提供的服务也将处于不可用状态, 于是服务雪崩效应产生了。
6.如何解决灾难性雪崩效应
SpringCloud Netflix 的 Hystrix组件,解决服务雪崩问题的逻辑是:不可用服务的调用快速失败。一般通过以下三点来实现:
• 资源隔离
• 熔断器
• 熔断后的 降级方法
7.什么是服务器熔断和服务器降级
服务熔断一般是指软件系统中,由于某些原因使得服务出现了过载现象,为防止造成整个系统故障,从而采用的一种保护措施,所以很多地方把熔断亦称为过载保护;
服务降级是在服务器压力陡增的情况下,利用有限资源,根据当前业务情况,关闭某些服务接口或者页面,以此释放服务器资源以保证核心任务的正常运行。
8.Hystrix设计原则是什么
(1)对依赖服务调用时出现的调用延迟和调用失败进行控制和容错保护
(2)在复杂的分布式系统中,阻止某一个依赖服务的故障在整个系统中蔓延,服务A->服务B->服务C,服务C故障了,服务B也故障了,服务A故障了,整套分布式系统全部故障,整体宕机
(3)提供fail-fast(快速失败)和快速恢复的支持
(4)提供fallback优雅降级的支持
(5)支持近实时的监控、报警以及运维操作
9.Hystrix有哪儿两种命令模式
HystrixCommand或者HystrixObservableCommand
两种命令模式,可以分别执行:.execute()、.queue()、.observe()和.toObservable()。
Hystrix配置详情
1.线程隔离,服务降级
1.引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
2.开启熔断
在启动类上添加注解**@EnableCircuitBreaker**
@EnableCircuitBreaker
public class App {
public static void main(String[] args) {
// TODO Auto-generated method stub
SpringApplication.run(App.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
3.编写降级逻辑
在控制层添加**@DefaultProperties(defaultFallback=“defaultFallback”)**
@HystrixCommand
@RestController
@DefaultProperties(defaultFallback="defaultFallback")
public class UserController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/{id}")
##添加Hystrix注解
@HystrixCommand
public String querbyId(@PathVariable("id") Integer id){
if(id == 1){
throw new RuntimeException("网络拥堵啦!!!");
}
String url="http://SpringCloud-service/user/"+id;
String uv=restTemplate.getForObject(url, String.class);
System.out.println(uv);
System.out.println(url);
return uv;
}
##注意String数据类型必须为String
public String defaultFallback(){
return "网络连接超时";
}
}
4.测试访问localhost:10088/1
关闭服务提供者 启动消费者客户端
服务器熔断
1.修改服务器消费者业务
在消费者调用业务里面加一段逻辑
public String querbyId(@PathVariable("id") Integer id){
##添加的逻辑代码
if(id == 1){
throw new RuntimeException("网络拥堵啦!!!");
}
String url="http://SpringCloud-service/user/"+id;
String uv=restTemplate.getForObject(url, String.class);
System.out.println(uv);
System.out.println(url);
return uv;
}
2.进行测试
启动服务提供者跟服务器消费者客户端
1.访问localhost:10088/1的时候网页显示网络连接超时
2.访问localhost:100882的时候网页显示数据库查询内容
3.hystrix服务监控Dashboard
1.引入依赖
两个缺一不可
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
2.添加注解
启动类添加注解**@EnableHystrixDashboard**
@EnableHystrixDashboard
public class App {
public static void main(String[] args) {
// TODO Auto-generated method stub
SpringApplication.run(App.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
@Bean
public ServletRegistrationBean getServlet() {
HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
registrationBean.setLoadOnStartup(1);
registrationBean.addUrlMappings("/hystrix.stream");
registrationBean.setName("HystrixMetricsStreamServlet");
return registrationBean;
}
}
注解:高版本的Springboot2.0以上需要添加一个方法在写启动器类中否则最后访问仪表盘中的数据
@Bean
public ServletRegistrationBean getServlet() {
HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
registrationBean.setLoadOnStartup(1);
registrationBean.addUrlMappings("/hystrix.stream");
registrationBean.setName("HystrixMetricsStreamServlet");
return registrationBean;
}
3.修改配置文件
hystrix.dashboard.proxy-stream-allow-list=localhost
此目的是将localhost访问路径添加到list数组中
4.测试
registrationBean.setName("HystrixMetricsStreamServlet");
return registrationBean;
}
## 3.修改配置文件
```xml
hystrix.dashboard.proxy-stream-allow-list=localhost
此目的是将localhost访问路径添加到list数组中
4.测试
开启仪表盘:localhost:10088/hystrix