Hytrix-豪猪
Hytrix是什么?
在分布式缓存中,服务多了肯定会有一些服务会崩。Hystrix是一个库,可以添加延迟容忍和容错逻辑,帮助你控制这些分布式服务之间的交互。通过隔离服务之间的访问点,停止级联失败和提供回退选项来实现这一点,可以提高整个系统的容错性。
Hytrix设计目标?
1、对通过第三方客户端库访问的依赖项的延迟和故障进行保护和控制。(这种一般都是网络传输造成的)
2、在复杂的分布式系统中阻止级联故障。
3、快速失败、快速恢复
4、回退,尽可能优雅地降级。
5、启动近实时监控、警报和操作控制。
服务熔断最小案例
开发流程:在product服务中进行
1、引入依赖
<!--hystrix--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
2、在启动类application加上注解,EnableCircuitBreaker
@SpringBootApplication @EnableDiscoveryClient @EnableCircuitBreaker //断路器 public class Product9997Application { public static void main(String[] args) { SpringApplication.run(Product9997Application.class, args); } }
3、在controller编写测试逻辑
//如果觉得每个服务都配置同样的一个熔断方法太麻烦了 //这里有个通用的方法可以进行替换 //hystrixMethod注解中 fallbackMethod----替换--->defaultFallback=testFallbackMethod //将回调方法改成默认的 //服务熔断 @GetMapping("/product/break") //服务访问路由 @HystrixCommand(fallbackMethod="testFallbackMethod") //如果发生服务异常 则服务熔断 执行注解内的方法 public String testBreak(int id) { if(id>0) { System.out.println("ok!!!!"); //正常的逻辑 }else { throw new RuntimeException("error------>num <=0!!!!!!"); //产生异常的逻辑 } return "num:" + id; } //服务熔断的时候就会调用这个函数 public String testFallbackMethod(int id) { return "数据不合法------>!" + id; }
4、产生效果,访问的参数满足服务要求的逻辑值,但是如果该参数值低于1,程序内部就会抛出异常。
当值小于1时,就会抛出异常,熔断器启动,调用熔断方法。如果失败请求满足一定阈值(比如10秒内20次请求),则断路器启动,访问正确的值都会显示数据不合法,直到再次访问回复正常。如果
服务降级最小案例
开发流程:在user服务中进行
1、添加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
2、properties中开启服务降级配置
#开启服务降级 支持服务降级的技术openfeign feign.hystrix.enabled=true
3、加入访问后台接口,同时注入降级实现类
//服务降级的路由 @GetMapping("/product/break") public String testBreak(@RequestParam("id")int id);//user服务向product服务访问的接口
4、创建服务降级实现类,继承productClient接口
package com.demo.user9998.fallback; import com.demo.user9998.controller.client.ProductClient; import com.demo.user9998.vo.ProductVo; import org.springframework.stereotype.Component; import java.util.Map; @Component public class ProductFallBack implements ProductClient { //只对这个服务进行服务降级 @Override public String testBreak(int id) { return "这个只是测试内容,如果真需要服务降级,就在这里进行具体服务编写"; } @Override public Map<String, Object> findPs() { return null; } @Override public String findById(String productId) { return null; } @Override public String persist(String name) { return null; } @Override public String save(ProductVo productVo) { return null; } }
5、关闭服务熔断注解,服务降级和服务熔断是两个hytrix两个服务处理方式
6、在userController中编写服务降级测试
//测试服务降级 @GetMapping("/user/breakTest") public String breakTest(int id) { String result = productClients.testBreak(id); //感知服务降级 return result; }
7、演示效果
符合正常的传参
异常传参
总结
服务熔断是在被访问的服务上,例如product服务,当服务发生异常的时候,捕捉并且调用fallbackMethod方法,执行熔断方法。这个熔断器如果错误的请求发送一定次数到达阈值,当我们再次发送正确请求的时候,还是会报错。这个时候熔断器需要休息一下才能重新恢复访问。
服务降级是在直接访问服务上,例如user服务,当product服务发生异常的时候,user就会关闭该服务,同时调用的productclient接口的实现类,内部有对该服务的处理方式。这个服务访问的时候是有路由名字的,查看路由对应的方法,找到productclient的方法,调用该实现类同名的方法。开发流程:添加依赖,properties开启服务降级,实现类调用。