簡介:Hystix 是 Netflix 開源的一個(gè)延遲和容錯(cuò)庫瑟捣,用于隔離訪問遠(yuǎn)程服務(wù)馋艺、第三方庫,防止出現(xiàn)級(jí)聯(lián)失斅跆住(雪崩)捐祠。
Hystix 主要功能
?隔離
? ? ?1、線程池隔離
? ? ? 2桑李、信號(hào)量隔離
?降級(jí)
?熔斷
?限流
一雏赦、隔離
(1)線程池隔離
不進(jìn)行隔離時(shí),當(dāng)服務(wù)請(qǐng)求A芙扎,線程池進(jìn)行調(diào)用星岗,調(diào)用完需要?dú)w還給線程池。假如C無響應(yīng)戒洼,則線程池100個(gè)線程全給到C俏橘,則其他線程不夠用。
而Hystrix自動(dòng)進(jìn)行線程池隔離圈浇,對(duì)請(qǐng)求會(huì)進(jìn)行分配寥掐,一個(gè)服務(wù)失敗,只會(huì)把分配給它的線程使用完磷蜀,不會(huì)占用其他線程召耘。
(2)信號(hào)量隔離
? ?如:限制對(duì)其中一個(gè)服務(wù)的訪問次數(shù),訪問人數(shù)
二褐隆、熔斷
假如某服務(wù)一直錯(cuò)污它,把所有服務(wù)全熔斷。還有恢復(fù)機(jī)制,等服務(wù)恢復(fù)時(shí)衫贬,讓整個(gè)服務(wù)恢復(fù)德澈。
三、降級(jí)
Hystix 降級(jí):當(dāng)服務(wù)發(fā)生異彻坦撸或調(diào)用超時(shí)梆造,返回默認(rèn)數(shù)據(jù)。
降級(jí)思路:
(1)Hystrix 降級(jí) – 服務(wù)提供方
? ? ? ?1.在服務(wù)提供方葬毫,引入 hystrix 依賴
????????2.定義降級(jí)方法
????????3.使用 @HystrixCommand 注解配置降級(jí)方法
????????4.在啟動(dòng)類上開啟Hystrix功能:@EnableCircuitBreaker
(2)Hystrix 降級(jí) – 服務(wù)消費(fèi)方
????????1.feign 組件已經(jīng)集成了 hystrix 組件镇辉。
????????2.定義feign 調(diào)用接口實(shí)現(xiàn)類,復(fù)寫方法贴捡,即 降級(jí)方法
????????3.在 @FeignClient 注解中使用 fallback 屬性設(shè)置降級(jí)處理類摊聋。
????????4.配置開啟 feign.hystrix.enabled = true
代碼舉例:
?Goods Controller 服務(wù)提供方Hystrix降級(jí):
@RestController
@RequestMapping("/goods")
public class GoodsController {
? ? @Autowired
? ? private GoodsService goodsService;
? ? @Value("${server.port}")
? ? private int port;
? ? /**
? ? * 降級(jí):
? ? *? 1. 出現(xiàn)異常
? ? *? 2. 服務(wù)調(diào)用超時(shí)
? ? *? ? ? * 默認(rèn)1s超時(shí)
? ? *
? ? *? @HystrixCommand(fallbackMethod = "findOne_fallback")
? ? *? ? ? fallbackMethod:指定降級(jí)后調(diào)用的方法名稱
? ? */
? ? @GetMapping("/findOne/{id}")
? ? @HystrixCommand(fallbackMethod = "findOne_fallback",commandProperties = {
? ? ? ? ? ? //設(shè)置Hystrix的超時(shí)時(shí)間,默認(rèn)1s
? ? ? ? ? ? @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value = "3000")
? ? })
? ? public Goods findOne(@PathVariable("id") int id){
? ? ? ? //1.造個(gè)異常
? ? ? ? // int i = 3/0;
? ? ? ? try {
? ? ? ? ? ? //2. 休眠2秒
? ? ? ? ? ? Thread.sleep(2000);
? ? ? ? } catch (InterruptedException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? ? ? Goods goods = goodsService.findOne(id);
? ? ? ? goods.setTitle(goods.getTitle() + ":" + port);//將端口號(hào)栈暇,設(shè)置到了 商品標(biāo)題上
? ? ? ? return goods;
? ? }
? ? /**
? ? * 定義降級(jí)方法:
? ? *? 1. 方法的返回值需要和原方法一樣
? ? *? 2. 方法的參數(shù)需要和原方法一樣
? ? */
? ? public Goods findOne_fallback(int id){
? ? ? ? Goods goods = new Goods();
? ? ? ? goods.setTitle("降級(jí)了~~~");
? ? ? ? return goods;
? ? }
}
消費(fèi)者端 調(diào)用服務(wù)的降級(jí):
GoodsFeignClient.java:
@FeignClient(value = "HYSTRIX-PROVIDER",fallback = GoodsFeignClientFallback.class)
public interface GoodsFeignClient {
? ? @GetMapping("/goods/findOne/{id}")
? ? public Goods findGoodsById(@PathVariable("id") int id);
}
GoodsFeignClientFallback.java:
/**
* Feign 客戶端的降級(jí)處理類
* 1. 定義類 實(shí)現(xiàn) Feign 客戶端接口
* 2. 使用@Component注解將該類的Bean加入SpringIOC容器
*/
@Component
public class GoodsFeignClientFallback implements GoodsFeignClient {
? ? @Override
? ? public Goods findGoodsById(int id) {
? ? ? ? Goods goods = new Goods();
? ? ? ? goods.setTitle("又被降級(jí)了~~~");
? ? ? ? return goods;
? ? }
}
四、熔斷
可修改默認(rèn)參數(shù)箍镜,修改熔斷監(jiān)控時(shí)間和次數(shù):
@GetMapping("/findOne/{id}")
? ? @HystrixCommand(fallbackMethod = "findOne_fallback",commandProperties = {
? ? ? ? ? ? //設(shè)置Hystrix的超時(shí)時(shí)間源祈,默認(rèn)1s
? ? ? ? ? ? @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value = "3000"),
? ? ? ? ? ? //監(jiān)控時(shí)間 默認(rèn)5000 毫秒
? ? ? ? ? ? @HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds",value = "5000"),
? ? ? ? ? ? //失敗次數(shù)。默認(rèn)20次
? ? ? ? ? ? @HystrixProperty(name="circuitBreaker.requestVolumeThreshold",value = "20"),
? ? ? ? ? ? //失敗率 默認(rèn)50%
? ? ? ? ? ? @HystrixProperty(name="circuitBreaker.errorThresholdPercentage",value = "50")
? ? })