`
raymond.chen
  • 浏览: 1442326 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

使用Hystrix实现容错

 
阅读更多

分布式系统中经常会出现某个基础服务不可用造成整个系统不可用的情况,这种现象被称为服务雪崩效应。为了应对服务雪崩,一种常见的做法是手动服务降级。而 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实现容错

    本文将深入探讨如何在客户端整合Hystrix来实现容错,并结合Spring Cloud生态,让我们的系统更加健壮。 首先,我们了解下Hystrix的核心概念: 1. **断路器模式**:当服务调用频繁失败时,断路器打开,后续请求不再...

    Spring Cloud Hystrix 服务容错保护的原理实现

    Spring Cloud Hystrix 服务容错保护的原理实现 Spring Cloud Hystrix 服务容错保护的原理实现主要介绍了Spring Cloud Hystrix 服务容错保护的原理实现。Hystrix 是Netflix 中的一个组件库,它隔离了服务之间的访问...

    spring cloud hystrix 服务容错保护例子

    首先,`spring-cloud-hystrix` 是Netflix开发的一个库,它是基于Hystrix设计模式的实现,用于构建容错系统。Hystrix的核心概念包括断路器、熔断器模式、线程隔离和请求缓存等。断路器模式能够防止一个故障的服务对...

    15.Spring Cloud中使用Hystrix

    在Spring Cloud生态系统中,Hystrix是一个至关重要的组件,它主要负责实现服务容错和断路器模式,以增强系统的稳定性和健壮性。本文将深入探讨如何在Spring Cloud项目中集成并使用Hystrix,以及如何将其与Feign...

    断路器hystrix实现.rar

    本教程将深入探讨如何使用Hystrix在微服务中实现断路器功能。 首先,让我们理解断路器的工作原理。断路器在正常情况下处于“关闭”状态,允许请求通过。当服务出现故障,如连续多次调用失败或调用超时,断路器会...

    spring cloud 使用Hystrix 实现断路器进行服务容错保护的方法

    为了解决这个问题,Spring Cloud 提供了Hystrix组件,用于实现服务容错管理,特别是断路器机制。断路器是一种设计模式,它在检测到服务故障时能够快速失败,防止系统因等待故障服务恢复而消耗过多资源。 Spring ...

    Netflix 的 Hystrix 延迟和容错库(适用于 Go).zip

    Hystrix 是一个延迟和容错库,旨在隔离对远程系统、服务和第三方库的访问点,阻止级联故障,并在不可避免的故障的复杂分布式系统中实现恢复能力。我认为 Hystrix 模式(程序员定义的回退和自适应健康监测)适用于...

    Spring Cloud :Hystrix实现优雅的服务容错

    当请求失败、超时或被断路器拒绝时,可以配置一个备用响应或一个安全的默认值。

    Hystrix提供延迟和容错

    Hystrix的核心理念是通过隔离服务调用、降级策略以及断路器模式来实现系统的容错和弹性。下面将详细探讨这些关键概念。 1. 隔离服务调用:Hystrix通过命令模式实现了服务调用的隔离。每个服务请求都被封装成一个...

    03Spring Cloud Hystrix:服务容错保护1

    Spring Cloud Hystrix是Spring Cloud Netflix的一个核心组件,它的主要目标是实现服务容错和线程隔离,以增强系统的稳定性和抗压性。Hystrix引入了断路器模式,当服务出现故障时,断路器会快速失败,避免了故障的...

    SpringCloud服务容错保护(Hystrix)介绍与使用示例

    在微服务架构中,服务容错处理至关重要,Spring Cloud Hystrix 提供了一种解决方案,...在实际开发中,结合 Hystrix Dashboard 和 Turbine 等工具,还能实现对 Hystrix 容错机制的可视化监控,进一步优化系统的健壮性。

    hystrix-dashboard.zip

    综合这些信息,我们可以了解到这个示例项目展示了如何在Spring Cloud环境中构建微服务架构,使用Eureka进行服务注册和发现,使用Feign进行服务间的通信,并通过Hystrix实现容错和监控。Hystrix Dashboard的集成使得...

    基于Java的SpringCloud服务容错保护库Hystrix设计与实现源码解析

    本项目深入解析了基于Java的SpringCloud服务容错保护库Hystrix的设计与实现,源码文件共计69个,涵盖35个Java源文件、11个XML配置文件、4个Git忽略文件等,旨在帮助开发者全面理解Hystrix的工作原理和应用技巧。

    详解spring cloud使用Hystrix实现单个方法的fallback

    详解 Spring Cloud 使用 Hystrix 实现单个方法的 Fallback 在分布式系统中,服务降级和熔断机制是一种非常重要的容错机制。它可以在系统出现故障或高负载的情况下,提供 fallback 的解决方案,以确保系统的可用性和...

    详解Spring Cloud Hystrix断路器实现容错和降级

    Spring Cloud Hystrix断路器实现容错和降级 Spring Cloud Hystrix断路器是一种实现容错和降级的机制,它可以在服务不可用时,对配置了断路器的方法实行降级策略,临时调用备用方法。这种机制可以避免服务雪崩效应,...

    spring cloud hystrix原理介绍及使用

    降级逻辑可以通过HystrixCommand类中的fallbackMethod方法来指定,或者在响应式调用中使用fallback操作符。 Hystrix的入门相对简单,其提供的注解编程模型允许开发者通过极简的配置就能实现上述功能。对于开发者而...

    服务熔断:Hystrix容错框架【包括之前章节Demo】

    个人学习练习demo,对应Blog:springCloud学习【二】:服务熔断:Hystrix容错框架【实例】,里面是完整的demo包,registry是注册中心模块,service是服务提供者,consume和consume-feign是消费服务的两种实现方式,...

    Go-gobreak延迟和容错库如Netflix的Hystrix支持prometheus和gobreaker

    标题中的“Go-gobreak延迟和容错库如Netflix的Hystrix支持prometheus和gobreaker”指的是在Go编程语言中实现的一种基于Netflix Hystrix理念的延迟和容错库,它集成了Prometheus监控和gobreaker模式。这个库的主要...

Global site tag (gtag.js) - Google Analytics