分布式系统中经常会出现某个基础服务不可用造成整个系统不可用的情况,这种现象被称为服务雪崩效应。为了应对服务雪崩,一种常见的做法是手动服务降级。而 Hystrix 的出现,给我们提供了另一种选择。
Hystrix实现了断路器的模式。断路器本身是一种开关装置,当某个服务发生故障之后,通过断路器的故障监控,向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。
在请求失败频率较低的情况下,Hystrix 还是会直接把故障返回给客户端。只有当失败次数达到阈值时,断路器打开并且不进行后续通信,而是直接返回备选响应。
Hystrix是Netflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或第三方库,防止级联失败,从而提高系统的可用性与容错性。
Hystrix的隔离策略:
Hystrix的隔离策略有THREAD和SEMAPHORE两种,默认是THREAD。
THREAD(线程隔离):它将在单独的线程上执行,并发请求受线程池中的线程数量的限制。
SEMAPHORE(信号量隔离):它将在调用线程上执行,开销相对较小,并发请求收到信号量个数的限制。
默认并且推荐的设置是,运行 HystrixCommand 使用线程隔离(THREAD)HystrixObservableCommand 使用信号量隔离(SEMAPHORE)。
正常情况下,保持默认即可。如果发生找不到上下文的运行时异常,可考虑将隔离策略设置为SEMAPHORE。
一般来说,只有当调用负载非常高时才需要对 HystrixCommand 使用信号量隔离,因为这种场景下使用单独线程开销太高。
在Ribbon+RestTemplate环境下使用Hystrix
在pom.xml文件添加依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
在启动类中添加 @EnableHystrix 注解,启用断路器支持:
@EnableEurekaClient @SpringBootApplication @EnableHystrix //启用断路器支持 public class Main { @Bean @LoadBalanced public RestTemplate getRestTemplate() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(Main.class, args); } }
在Controller类的请求方法上添加 @HystrixCommand 注解,使方法具备容错能力
@RestController public class UserController { //服务提供者的接口地址:此处用应用名 private String baseURL = "http://service-provider-1"; @Autowired private RestTemplate restTemplate; /** * 通过@HystrixCommand注解为业务方法指定回退方法 * fallbackMethod: 回退方法 * commandProperties: 指定Hystrix的隔离策略 */ @HystrixCommand(fallbackMethod = "getUserById_Fallback") @GetMapping("/getUserById/{id}") public String getUserById(@PathVariable Long id){ String result = restTemplate.getForObject(baseURL + "/user/{id}", String.class, id); return result; } public String getUserById_Fallback(Long id){ System.out.println("请求异常,执行回退方法"); return null; } }
Hystrix断路器的状态监控
为了监控应用程序的运行状态,需要引入以下依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
断路器的状态也是暴露在Actuator提供的 /actuator/health 端口。在 Actuator 的默认配置中,/actuator/health 端口只能查看系统的状态,不能查看详细信息。要查看详细信息,需要在application.properties文件中添加以下配置:
management.endpoint.health.show-details=always
在Feign环境下使用Hystrix(使用FallbackFactory的方式)
创建Feign Client的回退工厂类
/** * Feign Client的回退工厂类,通过工厂类可以获知回退的具体原因 */ @Component public class UserFeignClientFallbackFactory implements FallbackFactory<UserFeignClient>{ /** * create方法必须返回Feign Client的接口类 */ @Override public UserFeignClient create(Throwable ex) { return new UserFeignClient() { @Override public String addUser(Long id) { showErrorReason(); return "error"; } @Override public String query(String name) { showErrorReason(); return "error"; } @Override public User getUser(Long id) { showErrorReason(); return new User(); } @Override public User add(Address address) { showErrorReason(); return new User(); } @Override public String update(Address address) { showErrorReason(); return "error"; } @Override public List<Address> getAllAddress() { showErrorReason(); return new ArrayList<Address>(); } @Override public void put(Address address) { showErrorReason(); System.out.println("put >> error"); } private void showErrorReason(){ System.out.println(ex.toString()); } }; } }
在Feign Client接口类的@FeignClient注解中指定fallbackFactory属性值,指向回退工厂类
@FeignClient(name="service-provider-1", fallbackFactory=UserFeignClientFallbackFactory.class) public interface UserFeignClient extends UserService{ }
在application.properties文件添加以下配置信息
#开启Feign的Hystrix支持(全局) feign.hystrix.enabled=true
##### 如果想为指定的Feign客户端禁用Hystrix支持,可以创建一个Feign配置类
@Configuration public class DefaultFeignConfiguration { /** * 局部针对某个Feign客户端禁用Hystrix */ @Bean @Scope("prototype") public Feign.Builder feignBuilder() { return Feign.builder(); } }
然后在Feign客户端接口类中,设置@FeignClient注解类的configuration变量值
@FeignClient(name="service-provider-1", fallbackFactory=UserFeignClientFallbackFactory.class, configuration=DefaultFeignConfiguration.class) public interface UserFeignClient extends UserService{ }
在Feign环境下使用Hystrix(使用Fallback的方式)
在Feign Client接口类的@FeignClient注解中指定fallback属性值,指向回退类
/** * Feign客户端接口类:通过Feign的继承特性来实现接口共享 * * name:服务名 * fallback:指定回退类 */ @FeignClient(name="service-provider-1", fallback=UserFeignClientFallback.class) public interface UserFeignClient extends UserService{ }
创建Fallback类,该类需要实现Feign Client接口类
/** * 回退类:需要实现Feign Client接口类 */ @Component public class UserFeignClientFallback implements UserFeignClient{ @Override public String addUser(Long id) { return "error"; } @Override public String query(String name) { return "error"; } @Override public User getUser(Long id) { return new User(); } @Override public User add(Address address) { return new User(); } @Override public String update(Address address) { return "error"; } @Override public List<Address> getAllAddress() { return new ArrayList<Address>(); } @Override public void put(Address address) { System.out.println("put >> error"); } }
在application.properties文件添加以下配置信息
#开启Feign的Hystrix支持(全局) feign.hystrix.enabled=true
相关推荐
客户端整合Hystrix实现容错,通过简单地配置,为系统保驾护航
主要介绍了Spring Cloud Hystrix 服务容错保护的原理实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
1、统一开发环境 2、了解微服务架构 3、了解Spring Cloud 4、Spring Cloud的快速入门 5、Eureka服务注册中心的使用 6、使用Ribbon实现负载均衡 7、使用Hystrix实现容错
本篇文章主要介绍了spring cloud 使用Hystrix 实现断路器进行服务容错保护的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
个人学习练习demo,对应Blog:springCloud学习【二】:服务熔断:Hystrix容错框架【实例】,里面是完整的demo包,registry是注册中心模块,service是服务提供者,consume和consume-feign是消费服务的两种实现方式,...
• 1. 服务雪崩效应 • 2. 服务雪崩应对策略 ... 使用Hystrix预防服务雪崩 • 4. 预售中Hystrix的运用 • 5. Hystrix的实现 • 6. Hystrix的运维 • 7. 题外话: Netflix的技术栈 • 8. 题外话: 响应式编程
本篇文章主要介绍了详解Spring Cloud Hystrix断路器实现容错和降级,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
通过2个spring boot服务,实现consul的注册以及通过fegin(服务名)进行微服务直接的调用,实现HystrixCommand的容错处理
Eureka:服务治理组件,包含服务注册中心,服务注册与发现机制的实现。...Zuul:网关组件,提供...Hystrix:容错管理组件,实现断路器模式,帮助服务依赖中出现的延迟和为故障提供强大的容错能力。(熔断、断路器,容错)
容错-使用RabbitMQ的Hystrix和Turbine 通过RabbitMQ将Hystrix与Turbine集成 栏目 介绍 该项目提供了带有hystrix的断路器的实现。 此外,它将利用涡轮机来收集分布式的水力流信息。 这使您可以轻松监视所有hystrix...
microservice-eureka-ribbon-feign-hystrix微服务(服务发现组件Eureka-负载均衡Ribbon-REST调用Feign-实现容错Hystrix)简介:microservice-eureka-ribbon-feign-hystrix-demo服务提供者:microservice-simple-...
Hystrix是一个库,通过添加延迟容忍和容错逻辑,帮助你控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点、停止级联失败和提供回退选项来实现这一点,所有这些都可以提高系统的整体弹性。复杂分布式...
Hystrix是一个通过添加延迟容忍和容错逻辑来帮助您控制这些分布式服务之间的交互的库。Hystrix通过隔离服务之间的访问点来实现这一点,停止跨级的级联故障,并提供备用选项,这些工作都提高了系统的整体弹性。
Spring Cloud Netflix:核心组件,可以对多个Netflix OSS开源套件进行整合,包括以下几个组件: Eureka:服务治理组件,包含服务注册与发现 Hystrix:容错管理组件,实现了熔断器 Ribbon:客户端负载均衡的服务调用...
#####Hyrax 使用来实现 Hystrix 断路器的 Scala 等效项。 #####Hyrax 使用 Actor 及其层次结构来实现弹性层的隔板和泳道方面。 提供容错和快速失败策略。 #####Hystrix 是豪猪的一个属,以其保护性凶猛而闻名:这是...
springcloud入门代码基于Spring Cloud实现的服务容错保护库代码 运行 Eureka Server 运行 hello-provider 运行 eureka-hystrix-client,发请求测试效果 停止 hello-provider 发请求测试效果
Eureka Server代码实现 Eureka Client 代码实现 Spring Cloud Config 远程配置Hystrix 容错机制 服务跟踪
Hystrix,客户端容错保护,特性有服务降级、服务熔断、请求缓存、请求合并、依赖隔离。 Feign,声明式服务调用,本质上就是Ribbon+Hystrix Stream,消息驱动,有Sink、Source、Processor三种通道,特性有订阅发布...
本资源为《基于Spring Cloud的...项目包含Eureka注册中心、Zuul网关验证、Config分布式配置管理、Ribbon负载均衡、Feign接口调用、Hystrix容错处理、Sleuth微服务追踪、ELK+Kafka日志收集、RabbitMQ实现分布式事务等。
容错与弹性:通过Hystrix等组件实现熔断机制,提高系统的容错能力,防止单点故障导致整个系统的崩溃。 动态配置:使用Spring Cloud Config实现动态配置管理,使得在不重启服务的情况下可以更新配置信息,加快了开发...