断路器(熔断器)Hystrix
一. 概述
1.雪崩效应
在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应。服务雪崩效应是一种因“服务提供者”的不可用导致“服务消费者”的不可用,并将不可用逐渐放大的过程。
如果下图所示:A作为服务提供者,B为A的服务消费者,C和D是B的服务消费者。A不可用引起了B的不可用,并将不可用像滚雪球一样放大到C和D时,雪崩效应就形成了。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbwxCdh1mcvZ2LcV2Zh1Wa9M3clN2byBXLzN3btg3Pj1mY3VzUNR3ZYFWeSNzY1gmMMtmVzI2cOJjW1xWbjdnTzw0MFRUT5hTejxGZXlFdsJDT6JFWapnTYlld0clW5VTejxmUYFWe50GZoplMMZ3bENGMShUYvwlbj5yZtlmbkN3YuQnclZnbvN2Ztl2Lc9CX6MHc0RHaiojIsJye.jpg)
2.断路器(熔断器)Hystrix
被调用的服务达到一定的呼叫阈(yù)值,断开服务,调用备用服务,
举个例子:用户请求
订单服务
,订单支付完成,请求
积分服务
,
但是
积分服务出现故障,可以调用备用服务,将积分信息存入
数据库
3.资源隔离
在Hystrix中, 主要通过线程池来实现资源隔离. 通常在使用的时候我们会根据
调用的远程服务
划分出
多个线程池
. 例如调用产品服务的Command放入A线程池, 调用账户服务的Command放入B线程池. 这样做的主要优点是运行环境被隔离开了. 这样就算调用服务的代码存在bug或者由于其他原因导致
自己所在线程池被耗尽时, 不会对系统的其他服务造成影响
. 但是带来的代价就是维护多个线程池会对系统带来额外的性能开销. 如果是对性能有严格要求而且确信自己调用服务的客户端代码不会出问题的话, 可以使用Hystrix的信号模式(Semaphores)来隔离资源
二、断路器(熔断器)的使用
1.上一章建立的子模块:Feign
spring-cloud-starter-openfeign已经自带了Hystrix,我们只需要修改一些配置信息就可以了
feign:
hystrix:
enabled: true
2.新建备用服务类,ServiceHiHystrix
ServiceHiHystrix.java
package com.example.feign;
import org.springframework.stereotype.Component;
@Component
public class ServiceHiHystrix implements serviceHi{
@Override
public String sayHIfromServerHi(String name) {
return "访问失败"+name;
}
}
3.接口中添加 建好的FallBACK类
serviceHi
package com.example.feign;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient(value = "server-hi",fallback = ServiceHiHystrix.class)#添加fallback
public interface serviceHi {
@GetMapping("/hi/{name}")
String sayHIfromServerHi(@PathVariable(value = "name") String name);
}
本地controller内容不变
package com.example.feign;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class helloController {
@Autowired
private serviceHi serviceHi;
@GetMapping("hello/{name}")
public String sayHi(@PathVariable(value = "name") String name){
return serviceHi.sayHIfromServerHi(name);
}
}
三、运行 注册中心、服务提供者、feign服务消费者
1.正常访问本地controller,访问正常
2.关闭服务提供者,模拟服务不可用宕机,之后继续访问本地方法,返回备用服务信息
断路器仪表盘Hystrix Dashboard和Turbine
1.介绍
Hystrix的主要优点之一是它收集关于每个HystrixCommand的一套指标。Hystrix仪表板以有效的方式显示每个断路器的运行状况。
长这个样子,实测对中文并不友好
Turbine
但是只使用Hystrix Dashboard的话, 你只能看到单个应用内的服务信息, 这明显不够. 我们需要一个工具能让我们
汇总系统内多个服务的数据
并
显示到Hystrix Dashboard上
, 这个工具就是Turbine.
在复杂的分布式系统中,相同服务的节点经常需要部署上百甚至上千个,很多时候,运维人员希望能够把相同服务的节点状态以一个整体集群的形式展现出来,这样可以更好的把握整个系统的状态。
2.使用方法
新建springboot子类 HystrixDashboardTurbine 用来收集服务的熔断信息
- 引入两个依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<!--spring boot 1.X:spring-cloud-starter-hystrix-->
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<!--spring boot 1.X:spring-cloud-starter-hystrix-dashboard-->
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
- 主类添加两个注解
package com.example.hystrixdashboardturbine;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
import org.springframework.cloud.netflix.turbine.EnableTurbine;
@EnableTurbine
@EnableHystrixDashboard
@SpringBootApplication
public class HystrixDashboardTurbineApplication {
public static void main(String[] args) {
SpringApplication.run(HystrixDashboardTurbineApplication.class, args);
}
}
- yml配置
server:
# 服务端口号
port: 8767
spring:
application:
# 服务名,即serviceId
name: hystrix-dashboard-turbine
eureka:
client:
serviceUrl:
# 安全认证的服务注册中心地址
defaultZone: http://peer1:8771/eureka
# 熔断器turbine
turbine:
aggregator:
cluster-config: default
cluster-name-expression: new String("default")
app-config: service-feign,service-feign2 #配置从那些服务收集熔断监控 使用 ,隔开多个服务
fegin服务 复制一份,改名为 service-feign2,调用不同的注册服务
主类添加两个注解
填入网址
http://localhost:8767/hystrix/
http://localhost:8767/turbine.stream
Github参考地址:https://github.com/jw-star/springCloudPractice/tree/master/parents
springCloud中文文档:https://www.springcloud.cc/spring-cloud-dalston.html
参考博客地址:https://blog.csdn.net/qqxx6661/article/details/88559088