# :-: 熔斷機制 Hystrix
## Hystrix簡介

* hystrix對應的中文名字是“豪豬”,豪豬周身長滿了刺,能保護自己不受天敵的傷害,代表了一種防御機制。
* 這與hystrix本身的功能不謀而合,因此Netflix團隊將該框架命名為Hystrix,并使用了對應的卡通形象做作為logo。
* 在一個分布式系統里,許多依賴不可避免的會調用失敗,比如超時、異常等,如何能夠保證在一個依賴出問題的情況下,不會導致整體服務失敗,這個就是Hystrix需要做的事情。
* Hystrix提供了熔斷、隔離、Fallback、cache、監控等功能,能夠在一個、或多個依賴同時出現問題時保證系統依然可用。
## 代碼示例
1. 在`applets-demo-api`中新建Hystrix類,命名為`BlogClientFallback`

2. 同樣實現`BlogClient`接口,只是此時只需返回對應數據即可,不需要再定義為`Controller`
3. 代碼如下
~~~
package org.springblade.demo.feign;
import org.springblade.core.tool.api.R;
import org.springblade.demo.entity.Blog;
import java.time.LocalDateTime;
public class BlogClientFallback implements BlogClient {
@Override
public R<Blog> detail(Integer id) {
Blog blog = new Blog();
blog.setBlogTitle("Hystrix");
blog.setBlogContent("FallBack Success");
blog.setBlogDate(LocalDateTime.now());
blog.setIsDeleted(0);
return R.data(blog);
}
}
~~~
4. 修改BlogClient,增加Hystrix配置
~~~
@FeignClient(
//定義Feign指向的service-id
value = CommonConstant.APPLICATION_DEMO_NAME,
//定義hystrix配置類
fallback = BlogClientFallback.class
)
public interface BlogClient {
/**
* 接口前綴
*/
String API_PREFIX = "/api/blog";
/**
* 獲取詳情
*
* @param id 主鍵
* @return
*/
@GetMapping(API_PREFIX + "/detail")
R<Blog> detail(@RequestParam("id") Integer id);
}
~~~
5. 增加`FallBack`自動配置(**不新建配置,直接在BlogClientFallback類上加@Component注解也可以**)

6. 這時我們去`blade-demo`的`BlogClientImpl`模擬異常
~~~
@RestController
@AllArgsConstructor
public class BlogClientImpl implements BlogClient {
private BlogService service;
@Override
@GetMapping(API_PREFIX + "/detail")
public R<Blog> detail(Integer id) {
int cnt = 100 / 0;
return R.data(service.getById(id));
}
}
~~~
7. 使用Postman調用API查看,發現Hystrix配置生效
## 結束語
* 開發初探的教程就到這兒了,想必有一些開發經驗的小伙伴會很容易上手,掌握了這些基礎核心,日后勤看文檔,多深入學習,相信大家都能很輕松的完成絕大部分開發任務了。
* 下面一章,讓我們來學習`開發進階`,會逐步講一些架構級別的知識點或一些高級用法。
- 序
- 快速開始
- 環境要求
- 環境準備
- 工程導入
- 工程運行
- 技術基礎
- Java8
- Lambda
- Lambda 受檢異常處理
- Stream 簡介
- Stream API 一覽
- Stream API(上)
- Stream API(下)
- Optional 干掉空指針
- 函數式接口
- 新的日期 API
- Lombok
- SpringMVC
- Swagger
- Mybaties
- Mybaties-plus
- 開發初探
- 新建微服務工程
- 第一個API
- API鑒權
- API響應結果
- Redis 緩存
- 第一個CRUD
- 建表
- 建Entity
- 建Service和Mapper
- 新增API
- 修改API
- 刪除API
- 查詢API
- 單條查詢
- 多條查詢
- 分頁
- 微服務遠程調用
- 聲明式服務調用Feign
- 熔斷機制 Hystrix
- 開發進階