什么是Hystrix:
在分布式环境中,许多服务依赖项中的一些不可避免地会失败。Hystrix 是一个库,它通过添加延迟容差和容错逻辑,帮助您控制这些分布式服务之间的交互。Hystrix 通过隔离服务之间的访问点、停止服务之间的级联故障以及提供回退选项来为此提供,所有这些都可提高系统的整体恢复能力。
做什么用
1.保护和控制通过第三方客户端库访问(通常通过网络)访问的依赖项的延迟和故障。
2.停止复杂分布式系统中的级联故障。
3.失败,快速恢复。
4.回退,并尽可能正常降级。
5.实现近乎实时的监控、警报和操作控制。
问题
正常情况某个服务出现问题
Hystrix重要概念:
-服务降级
服务器忙,请稍候再试,不让客户端等待并立刻返回一个友好提示,fallback
(可能出现原因:程序运行异常、超时、服务熔断触发服务降级、线程池/信号量打满也会导致服务降级)
-服务熔断
类比保险丝达到最大服务访问后,直接拒绝访问,拉闸限电,然后调用服务降级的方法并返回友好提示
(服务的降级->进而熔断->恢复调用链路)
-服务限流
秒杀高并发等操作,严禁一窝蜂的过来拥挤,使得调用排队,一秒钟N个,有序进行
使用:
<dependencies>
<!--新增hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<!--添加Eureka-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--图形监控-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
YML配置文件:
server:
port: 8001
eureka:
client:
register-with-eureka: true #表识不向注册中心注册自己
fetch-registry: true #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
service-url:
# defaultZone: http://eureka7002.com:7002/eureka/ #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,
# server:
# enable-self-preservation: false
spring:
application:
name: cloud-provider-hystrix-payment
# eviction-interval-timer-in-ms: 2000
服务降级:添加注解HystrixCommand
例如:业务类中
@Service
public class PaymentService {
//成功
public String paymentInfo_OK(Integer id){
return "线程池:"+Thread.currentThread().getName()+" paymentInfo_OK,id: "+id+"\t"+"Success" ;
}
//失败
@HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandler",commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000") //3秒钟以内就是正常的业务逻辑
})
public String paymentInfo_TimeOut(Integer id){
// int timeNumber = 5;
int age = 10/0;
// try { TimeUnit.SECONDS.sleep(timeNumber); }catch (Exception e) {e.printStackTrace();}
//return "线程池:"+Thread.currentThread().getName()+" paymentInfo_TimeOut,id: "+id+"\t"+"嘤嘤嘤"+" 耗时(秒)"+timeNumber;
return "线程池:"+Thread.currentThread().getName()+" paymentInfo_TimeOut,id: "+id+"\t"+"嘤嘤嘤"+" 耗时(秒)";
}
//兜底方法
public String paymentInfo_TimeOutHandler(Integer id){
return "线程池:"+Thread.currentThread().getName()+" 系统繁忙, 请稍候再试 ,id: "+id+"\t"+"嘤嘤哇呜";
}
}
//当服务不可用,或者出现问题的时候,在添加了HystrixCommand注解之后,会有一个兜底方法来处理之后的问题。问题:服务超时、程序运行故障
//一旦调用服务方法失败并抛出了错误信息后,会自动调用@HystrixCommand标注好的fallbackMethod调用类中的指定方法
主启动类需要添加新注解@EnableCircuitBreaker
@EnableCircuitBreaker
服务消费者若需要添加降级保护
feign:
hystrix:
enabled: true #如果处理自身的容错就开启。开启方式与生产端不一样。
消费者主启动添加
@EnableHystrix
业务类:
@GetMapping("/consumer/payment/hystrix/timeout/{id}")
@HystrixCommand(fallbackMethod = "paymentTimeOutFallbackMethod",commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1500") //3秒钟以内就是正常的业务逻辑
})
public String paymentInfo_TimeOut(@PathVariable("id") Integer id){
String result = paymentHystrixService.paymentInfo_TimeOut(id);
return result;
}
//兜底方法
public String paymentTimeOutFallbackMethod(@PathVariable("id") Integer id){
return "我是消费者80,对付支付系统繁忙请10秒钟后再试或者自己运行出错请检查自己";
}
这样我们需要为每一个需要的方法都添加一个HystrixCommand注解,并写上相应的兜底方法。
解决方法:在类上添加默认的处理方法
@DefaultProperties(defaultFallback = "payment_Global_FallbackMethod") //全局的
关系
上面这样做原理上可以,但是会造成处理降级和业务逻辑等糅杂到一起,比较混乱。
对接口进行实现,将降级的处理写在接口实现类中
@Component
@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT",fallback = PaymentFallbackService.class)
public interface PaymentHystrixService {
@GetMapping("/payment/hystrix/ok/{id}")
public String paymentInfo_OK(@PathVariable("id") Integer id);
@GetMapping("/payment/hystrix/timeout/{id}")
public String paymentInfo_TimeOut(@PathVariable("id") Integer id);
}
@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT",fallback = PaymentFallbackService.class)
fallback=接口实现类.class,这样在出现问题时,就会自动调用实现类中的降级方法
@Component
public class PaymentFallbackService implements PaymentHystrixService {
@Override
public String paymentInfo_OK(Integer id) {
return "-----PaymentFallbackService fall back-paymentInfo_OK , (┬_┬)";
}
@Override
public String paymentInfo_TimeOut(Integer id) {
return "-----PaymentFallbackService fall back-paymentInfo_TimeOut , (┬_┬)";
}
}
YML开启处理自身容错:
feign:
hystrix:
enabled: true #如果处理自身的容错就开启。开启方式与生产端不一样。
服务熔断:
服务熔断熔断打开:请求不再进行调用当前服务,内部设置时钟一般为MTTR(平均故障处理时间),当打开时长达到所设时钟则进入熔断状态
熔断关闭:熔断关闭不会对服务进行熔断
熔断半开:部分请求根据规则调用当前服务,如果请求成功且符合规则则认为当前服务恢复正常,关闭熔断
熔断器配置:
服务熔断 1
2
3
4
网友评论