diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-hystrix-dashboard/README.md b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix-dashboard/README.md
new file mode 100644
index 0000000..e63b277
--- /dev/null
+++ b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix-dashboard/README.md
@@ -0,0 +1,3 @@
+## hystrix-dashboard
+
+- hystrix 监控面板
\ No newline at end of file
diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-hystrix-dashboard/pom.xml b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix-dashboard/pom.xml
new file mode 100644
index 0000000..8f02a97
--- /dev/null
+++ b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix-dashboard/pom.xml
@@ -0,0 +1,69 @@
+
+
+ 4.0.0
+
+ org.example
+ dev-protocol
+ 1.0-SNAPSHOT
+ ../../pom.xml
+
+
+ dev-protocol-springcloud-hystrix-dashboard
+ 1.0-SNAPSHOT
+ jar
+
+
+ dev-protocol-springcloud-hystrix-dashboard
+ Hystrix Dashboard
+
+
+
+ 8
+ 8
+ UTF-8
+
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.cloud
+ spring-cloud-starter-netflix-hystrix
+
+
+ org.springframework.cloud
+ spring-cloud-starter-netflix-hystrix-dashboard
+
+
+
+
+
+ ${artifactId}
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ repackage
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-hystrix-dashboard/src/main/java/org/example/HystrixDashboardApplication.java b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix-dashboard/src/main/java/org/example/HystrixDashboardApplication.java
new file mode 100644
index 0000000..ce530dc
--- /dev/null
+++ b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix-dashboard/src/main/java/org/example/HystrixDashboardApplication.java
@@ -0,0 +1,21 @@
+package org.example;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
+
+/**
+ *
hystrix dashboard 入口
+ * 控制台页面 http://127.0.0.1:9999/dev-protocol-springcloud-hystrix-dashboard/hystrix/
+ * 需要监控的服务 stream 拼接: http://127.0.0.1:8111/dev-protocol-springcloud-hystrix/actuator/hystrix.stream
+ * */
+@EnableDiscoveryClient
+@SpringBootApplication
+@EnableHystrixDashboard // 开启 Hystrix Dashboard
+public class HystrixDashboardApplication {
+ public static void main(String[] args) {
+
+ SpringApplication.run(HystrixDashboardApplication.class, args);
+ }
+}
\ No newline at end of file
diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-hystrix-dashboard/src/main/resources/bootstrap.yml b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix-dashboard/src/main/resources/bootstrap.yml
new file mode 100644
index 0000000..976837d
--- /dev/null
+++ b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix-dashboard/src/main/resources/bootstrap.yml
@@ -0,0 +1,33 @@
+server:
+ port: 9999
+ servlet:
+ context-path: /dev-protocol-springcloud-hystrix-dashboard
+
+spring:
+ application:
+ name: dev-protocol-springcloud-hystrix-dashboard
+ cloud:
+ nacos:
+ # 服务注册发现
+ discovery:
+ enabled: true # 如果不想使用 Nacos 进行服务注册和发现, 设置为 false 即可
+ server-addr: 127.0.0.1:8848
+ # server-addr: 127.0.0.1:8848,127.0.0.1:8849,127.0.0.1:8850 # Nacos 服务器地址
+ namespace: 1ccc74ae-9398-4dbe-b9d7-4f9addf9f40c
+ metadata:
+ management:
+ context-path: ${server.servlet.context-path}/actuator
+
+hystrix:
+ dashboard:
+ proxy-stream-allow-list: "127.0.0.1"
+
+# 暴露端点
+management:
+ endpoints:
+ web:
+ exposure:
+ include: '*'
+ endpoint:
+ health:
+ show-details: always
diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-hystrix-dashboard/src/main/resources/http/dashboard.http b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix-dashboard/src/main/resources/http/dashboard.http
new file mode 100644
index 0000000..2395cb6
--- /dev/null
+++ b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix-dashboard/src/main/resources/http/dashboard.http
@@ -0,0 +1,31 @@
+### 获取 Token
+POST http://127.0.0.1:9001/dev-protocol-springcloud-gateway/dev-protocol-springcloud-hystrix/communication/token-by-feign
+Content-Type: application/json
+e-commerce-user: eyJhbGciOiJSUzI1NiJ9.eyJlLWNvbW1lcmNlLXVzZXIiOiJ7XCJpZFwiOjEwLFwidXNlcm5hbWVcIjpcIlFpbnlpQGltb29jLmNvbVwifSIsImp0aSI6IjJlMTgwYzA2LWIwZGQtNDJjYy1iNzk5LTZiNGI4N2Q3NTM3NCIsImV4cCI6MTYyNTQxNDQwMH0.P8gKWcwiibEmq80idCl9QzUaqJnQ7FVQ5yxzlMLfRNcG3nWMYh0o1kBO2vKvDGG8BofQ4__xn210R2P7zjH-uEn7hic0jbBt97vLkzvATnFegxaDSjUp9At9BIGl9Ecu7RPCwSQJFdw6NBMBz02Uom8yvHpUJEfv8_jZRurBp94tzES6IAACKC6NFq-3_mQfT4o_zA51U4hBbIBw6qNXvMSqK-VtaqkTNFfJsP_8Y0nmQck0jxmgdtLfRVfZCCp3rhcLNDBX37THQI6U7lvNFETceAKyJ5NFaA8p68lw_3D2IiZER1jEU3M2QIMQGeU0pmQ6IPwGDdA0MP5IKKzj8A
+token: imooc
+
+{
+ "username": "Qinyi@imooc.com",
+ "password": "25d55ad283aa400af464c76d713c07ad"
+}
+
+
+### 根据提供的 serviceId 获取实例信息
+GET http://127.0.0.1:9001/dev-protocol-springcloud-gateway/ecommerce-nacos-client/hystrix/hystrix-command-annotation?serviceId=e-commerce-nacos-client
+Content-Type: application/json
+e-commerce-user: eyJhbGciOiJSUzI1NiJ9.eyJlLWNvbW1lcmNlLXVzZXIiOiJ7XCJpZFwiOjEwLFwidXNlcm5hbWVcIjpcIlFpbnlpQGltb29jLmNvbVwifSIsImp0aSI6IjJlMTgwYzA2LWIwZGQtNDJjYy1iNzk5LTZiNGI4N2Q3NTM3NCIsImV4cCI6MTYyNTQxNDQwMH0.P8gKWcwiibEmq80idCl9QzUaqJnQ7FVQ5yxzlMLfRNcG3nWMYh0o1kBO2vKvDGG8BofQ4__xn210R2P7zjH-uEn7hic0jbBt97vLkzvATnFegxaDSjUp9At9BIGl9Ecu7RPCwSQJFdw6NBMBz02Uom8yvHpUJEfv8_jZRurBp94tzES6IAACKC6NFq-3_mQfT4o_zA51U4hBbIBw6qNXvMSqK-VtaqkTNFfJsP_8Y0nmQck0jxmgdtLfRVfZCCp3rhcLNDBX37THQI6U7lvNFETceAKyJ5NFaA8p68lw_3D2IiZER1jEU3M2QIMQGeU0pmQ6IPwGDdA0MP5IKKzj8A
+token: imooc
+
+
+### 根据提供的 serviceId 获取实例信息
+GET http://127.0.0.1:9001/dev-protocol-springcloud-gateway/ecommerce-nacos-client/hystrix/simple-hystrix-command?serviceId=e-commerce-nacos-client
+Content-Type: application/json
+e-commerce-user: eyJhbGciOiJSUzI1NiJ9.eyJlLWNvbW1lcmNlLXVzZXIiOiJ7XCJpZFwiOjEwLFwidXNlcm5hbWVcIjpcIlFpbnlpQGltb29jLmNvbVwifSIsImp0aSI6IjJlMTgwYzA2LWIwZGQtNDJjYy1iNzk5LTZiNGI4N2Q3NTM3NCIsImV4cCI6MTYyNTQxNDQwMH0.P8gKWcwiibEmq80idCl9QzUaqJnQ7FVQ5yxzlMLfRNcG3nWMYh0o1kBO2vKvDGG8BofQ4__xn210R2P7zjH-uEn7hic0jbBt97vLkzvATnFegxaDSjUp9At9BIGl9Ecu7RPCwSQJFdw6NBMBz02Uom8yvHpUJEfv8_jZRurBp94tzES6IAACKC6NFq-3_mQfT4o_zA51U4hBbIBw6qNXvMSqK-VtaqkTNFfJsP_8Y0nmQck0jxmgdtLfRVfZCCp3rhcLNDBX37THQI6U7lvNFETceAKyJ5NFaA8p68lw_3D2IiZER1jEU3M2QIMQGeU0pmQ6IPwGDdA0MP5IKKzj8A
+token: imooc
+
+
+### 根据提供的 serviceId 获取实例信息
+GET http://127.0.0.1:9001/dev-protocol-springcloud-gateway/ecommerce-nacos-client/hystrix/hystrix-observable-command?serviceId=e-commerce-nacos-client
+Content-Type: application/json
+e-commerce-user: eyJhbGciOiJSUzI1NiJ9.eyJlLWNvbW1lcmNlLXVzZXIiOiJ7XCJpZFwiOjEwLFwidXNlcm5hbWVcIjpcIlFpbnlpQGltb29jLmNvbVwifSIsImp0aSI6IjJlMTgwYzA2LWIwZGQtNDJjYy1iNzk5LTZiNGI4N2Q3NTM3NCIsImV4cCI6MTYyNTQxNDQwMH0.P8gKWcwiibEmq80idCl9QzUaqJnQ7FVQ5yxzlMLfRNcG3nWMYh0o1kBO2vKvDGG8BofQ4__xn210R2P7zjH-uEn7hic0jbBt97vLkzvATnFegxaDSjUp9At9BIGl9Ecu7RPCwSQJFdw6NBMBz02Uom8yvHpUJEfv8_jZRurBp94tzES6IAACKC6NFq-3_mQfT4o_zA51U4hBbIBw6qNXvMSqK-VtaqkTNFfJsP_8Y0nmQck0jxmgdtLfRVfZCCp3rhcLNDBX37THQI6U7lvNFETceAKyJ5NFaA8p68lw_3D2IiZER1jEU3M2QIMQGeU0pmQ6IPwGDdA0MP5IKKzj8A
+token: imooc
diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/NetflixHystrix.md b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/NetflixHystrix.md
index 11924a2..ac687ef 100644
--- a/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/NetflixHystrix.md
+++ b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/NetflixHystrix.md
@@ -21,25 +21,72 @@
- 请求依赖项失败后,可以选择出错或者是兜底回退
### 使用注解方式实现服务的容错、降级
-
+---
+- SpringCloud Netflix Hystrix 的三种模式
+ - Hystrix 的断路器模式和后备策略模式
+ - 断路器模式:设置超时或者失败等熔断策略
+ - 后备策略模式:断路器模式触发之后,如果存在后备策略,则执行后备
+ - Hystrix 的舱壁模式:Hystrix 舱壁模式的启发:货船为了进行防止漏水和火灾的扩散,会将货仓分隔为多个当发生灾害时,将所在货仓进行隔离就可以降低整艘船的风险
+ - 舱壁模式功能就是:我们可以通过为各个服务分别指定线程池
+ - 每一个远程资源调用都被放置在自己的线程池中,每一个线程池只有一定数量的线程来处理远程调用
+ - 一个性能低下的服务,只会影响到同一个线程池中的其他服务调用。所以降低了会产生的负面影响
### 使用编程方式实现服务的容错、降级
- [NacosClientHystrixCommand.java] - [NacosClientHystrixObservableCommand.java]
### 编程方式开启 Hystrix 请求缓存
-
+- Hystrix 的结果缓存指的是在一次 Hystrix 的请求上下文中
+- Hystrix 请求缓存的两种实现方式
+ - 编程(继承 HystrixCommand)方式,重写 getCacheKey 方法即可
+ - 注解方式
+ - @CacheResult:该注解用来标记请求命令返回的结果应该被缓存,它必须与@HystrixCommand注解结合使用, 属性: cacheKeyMethod
+ - @CacheRemove: 该注解用来让请求命令的缓存失效,失效的缓存根据commandKey进行查找。属性: commandKey,cacheKeyMethod
+ - @CacheKey: 该注解用来在请求命令的参数上标记,使其作为cacheKey,如果没有使用此注解则会使用所有参数列表中的参数作为cacheKey, 属性: value
### 注解方式开启 Hystrix 请求缓存
-
-
+-
### 编程方式应用 Hystrix 请求合并
--
-
+- 默认情况下,每一个请求都会占用一个线程和一次网络请求,高并发场景下效率不高\
+- 使用 Hystrix 的请求合并,将多个请求 merge 为一个,提高服务的并发能力
+---
+- 请求合并的适用场景与注意事项
+ - 适用场景:单个对象的查询并发数很高,服务提供方负载较高,就可以考虑使用请求合并
+ - 注意事项
+ - 请求在代码中人为的设置了延迟时间,会降低请求的响应速度
+ - 可能会提高服务提供方的负载,因为返回 List 结果数据量偏大
+ - 实现请求合并比较复杂
### 注解方式应用 Hystrix 请求合并
- 使用注解的方式比较多
### OpenFeign 集成 Hystrix 开启后备模式
-
-
+- OpenFeign 集成 Hystrix 的步骤
+ - 在配置文件中开启 Hystrix 的熔断功能:feign.hystrix.enabled: true
+ - @FeignClient 注解的 fallback 和 fallbackFactory 属性
+ - fallback 和 fallbackFactory 都是用于配置响应回退,但是不可以同时使用
+ - fallbackFactory 能够获取到 OpenFeign 调用抛出的异常
### 使用 Hystrix 监控面板监测客户端容错
-
-### SpringCloud Netflix Hystrix 容错组件总结
\ No newline at end of file
+- Hystrix Dashboard 是一个单独的应用,用来实时的对 Hystrix 的『使用情况』进行实时的监控
+### SpringCloud Netflix Hystrix 容错组件总结
+- ![Hystrix工作流程图.png](pic/Hystrix工作流程图.png)
+---
+- Hystrix 完整的工作流程
+ - 构造-个 HystrixCommand 或者 HystrixObservableCommand 对象
+ - 表示对一个对依赖项请求的包装
+ - 执行命令获取响应
+ - execute():阻塞,直到收到响应或者抛出异常, 同步执行的, 调用的是 queue().get()
+ - queue():返回一个 Future, 异步执行的, 调用的是 observable.toBlocking().toFuture()
+ - observe():订阅代表响应的 Observable
+ - toObservable():返回一个 Observable,当你订阅它以后,将会执行Hystrix 命令并且推送它的响应
+ - 总结: 最终每一个 HystrixCommand, 都是 Observable 的实现
+ - 响应是否已经被缓存
+ - 如果请求在缓存中的结果是存在的, 该请求在缓存中对应的结果是可用的, 缓存就会立即以一个 Observable 的形式被返回
+ - 断路器是否打开
+ - 缓存不存在的时候, 当你执行命令的时候, Hystrix 检查断路器是否打开, 如果打开, 不会执行任何命令, 执行回退逻辑, 如果是关闭, 检查容量是否可用
+ - 线程池、信号量是否已经使用率 100%
+ - 判断, 线程池和信号量是否已经满了, 如果满了, 不会执行命令, 立马执行回退逻辑
+ - HystrixObservableCommand.construct() or HystrixCommand.run()
+ - 对依赖项的调用请求, 真正的逻辑编写在这里, run 会返回一个响应, 或者抛出一个异常, construct 会返回一个 Observable 对象, 会推送一个响应或者一个 ERROR 通知, 会抛出一个 Timeout 异常
+ - 计算电路健康
+ - Hystrix 报告成功, 失败, 拒绝, 超时给断路器, 断路器会维护一组计算统计的计数器, 断路器会用这些统计数据来决定, 什么时候要跳闸, 后续的所有请求都会被短路, 直到一个恢复周期耗尽以后, 在第一次检查健康检查之后, 才会重新打开电路
+ - 回退或返回成功响应
+ - 一, 当你失败以后, HystrixCommand 会回退一个单一的回退值, HystrixObservableCommand 会返回一个或者多个回退值, 通过 fallback, 当 fallback 有异常也会被进一步抛出, 给调用者发送 ERROR 通知, 命令调用者进行处理
+ - 二, 成功会直接抛出响应给调用者, 返回一个 Observable
\ No newline at end of file
diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/pic/Hystrix工作流程图.png b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/pic/Hystrix工作流程图.png
new file mode 100644
index 0000000..639892f
Binary files /dev/null and b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/pic/Hystrix工作流程图.png differ
diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/src/main/java/org/example/service/AuthorityFeignClientHystrixDemo.java b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/src/main/java/org/example/service/AuthorityFeignClientHystrixDemo.java
index bc684ae..02cedd5 100644
--- a/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/src/main/java/org/example/service/AuthorityFeignClientHystrixDemo.java
+++ b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/src/main/java/org/example/service/AuthorityFeignClientHystrixDemo.java
@@ -1,6 +1,7 @@
package org.example.service;
import org.example.service.hystrix.bak.AuthorityFeignClientFallback;
+import org.example.service.hystrix.bak.AuthorityFeignClientFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -12,8 +13,8 @@ import org.springframework.web.bind.annotation.RequestMethod;
@FeignClient(
// contextId 是对 FeignClient 的声明, 每一个进行的通信都要进行定义, value 表示需要进行通信的服务id是什么
contextId = "AuthorityFeignClient", value = "e-commerce-authority-center",
- fallback = AuthorityFeignClientFallback.class
-// fallbackFactory = AuthorityFeignClientFallbackFactory.class
+// fallback = AuthorityFeignClientFallback.class, // fixme fallback 和 fallbackFactory 只能使用一个
+ fallbackFactory = AuthorityFeignClientFallbackFactory.class
)
public interface AuthorityFeignClientHystrixDemo {
diff --git a/pom.xml b/pom.xml
index 3d14b7d..d1d50db 100644
--- a/pom.xml
+++ b/pom.xml
@@ -62,6 +62,7 @@
dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk
dev-protocol-springcloud/dev-protocol-springcloud-project-goods-service
dev-protocol-springcloud/dev-protocol-springcloud-hystrix
+ dev-protocol-springcloud/dev-protocol-springcloud-hystrix-dashboard