一、断路器——Netflix Hystrix
在复杂的分布式架构的应用程序有很多的依赖,都会不可避免地在某些时候失败。高并发的依赖失败时如果没有隔离措施,当前应用服务就有被拖垮的风险
1.1、解决方案
对依赖做隔离,Hystrix就是处理依赖隔离的框架,同时也是可以帮我们做依赖服务的治理和监控.。
当我们使用了Hystrix时,Hystrix将所有的外部调用都封装成一个HystrixCommand或者 HystrixObservableCommand对象,这些外部调用将会在一个独立的线程中运行。我们可以将出现 问题的服务通过熔断、降级等手段隔离开来,这样不影响整个系统的主业务
Hystrix是保证微服务群健壮框架,做了隔离,熔断,降级等操作.最终达到不会由于某一个服务出问题而导致雪崩现象,让整体群死掉.
1.2、Hystrix简介
Hystrix是国外知名的视频网站Netflix所开源的非常流行的高可用架构框架。Hystrix能够完美的解决分布式系统架构中打造高可用服务面临的一系列技术难题。
- Hystrix “豪猪”,具有自我保护的能力。hystrix 通过如下机制来解决雪崩效应问题。
资源隔离(限流):包括线程池隔离和信号量隔离,限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务调用。
融断:当失败率达到阀值自动触发降级(如因网络故障/超时造成的失败率高),熔断器触发的快速失败会进行快速恢复。
降级机制:超时降级、资源不足时(线程或信号量)降级,降级后可以配合降级接口返回托底数据。
缓存:提供了请求缓存、请求合并实现。
对断路器模式不太清楚的话,可以参看另一篇博文【非本人写】:断路器:Hystrix,下面直接介绍Spring Cloud的断路器如何使用。
如果我们服务消费者实现的技术为ribbon,必须在服务提供者方通过Hystrix的断路器.
如果我们服务消费者实现的技术为feign,必须在服务消费者通过feign的断路器,feign断路器底层还是Hystrix的断路器.
1.3、Hystrix实现(服务提供者实现)
1.3.1、导包
<!--springboot支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!--eureka客户端支持 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--断路器-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
1.1.2、启动类开启熔断
@SpringBootApplication
@EnableDiscoveryClient 表示是通用的客户端
@EnableHystrix //开启熔断支持
public class Ehr_RunApp_2 {
public static void main(String[] args) {
SpringApplication.run(Ehr_RunApp_2.class, args);
}
}
1.1.3、controller层使用
1.1.4、服务消费者测试
== 必须==
开启注册中心
开启服务提供者
开启服务消费者
输入localhost:9001/getEmp/2
- 注意:
1 熔断实在服务提供方做
2 调用时不能使用feign调用(有自己熔断机制),要用ribbon调用
1.2、feign实现(服务提供者)
不需要导入ribbon包
1.2.1、导包
<dependencies>
<!--依赖接口-->
<dependency>
<groupId>springcloud-demo</groupId>
<artifactId>ehr-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--springboot支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!--eureka客户端支持 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
1.2.2、服务消费者application.yml配置feign方式熔断支持
server:
port: 9001
# 注册服务名称
spring:
application:
name: springcloud-demo-crm #不要使用下划线
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka #告诉服务提供者要把服务注册到哪儿
#defaultZone: http://localhost:7001/eureka,http://localhost:7002/eureka #告诉服务提供者要把服务注册到哪儿,多个用逗号隔开
instance:
#eureka服务器在接收到最后一个心跳之后等待的时间,然后才能从列表中删除此实例 默认90s(开发环境)
lease-expiration-duration-in-seconds: 2
#eureka客户端需要向eureka服务器发送心跳的频率 默认30s (开发环境)
lease-renewal-interval-in-seconds: 1
prefer-ip-address: true # 显示ip地址
feign:
hystrix:
enabled: true #开启熔断支持
client:
config:
remote-service: #服务名,填写default为所有服务
connectTimeout: 3000
readTimeout: 3000
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 3000
1.2.3、服务提供者对feign配置的接口进行托底处理
- EmpClientFallback
@Component //对那个接口进行托底处理
public class EmpClientFallback implements EmpCllent {
public Object getEmp(Integer id) {
return id+"不存在Feign模式";
}
}
- EmpCllent
1.3.4、测试
启动注册中心
启动服务提供者
启动服务消费者测试