Spring Cloud快速入門(5),Hystrix服務熔斷、降級、監控

什麼是Hystrix?

在分佈式系統裡,服務之間會相互依賴,可能存在服務調用失敗,比如超時,異常等,Hystrix能夠保證在一個依賴出現問題的情況下,不會導致整體服務失敗,以提高分佈式系統的彈性。

Hystrix會監控微服務間調用的狀況,當失敗的調用到一定閾值,默認是5秒內20次調用失敗就會啟動熔斷機制,不再調用微服務,而是返回調用方自定義的fallback,不至於把錯誤信息暴露給用戶。

修改訂單服務

  • 添加maven依賴
<code>
<dependency>
\t<groupid>org.springframework.cloud/<groupid>
\t\t<artifactid>spring-cloud-starter-netflix-hystrix/<artifactid>
/<dependency>/<code>
  • 創建ProductClientFallback降級處理類,實現ProductClient接口。
<code>@Component
public class ProductClientFallback implements ProductClient {
@Override
public CommonResult<product> getById(Long id) {
System.out.println("ProductClientFallback");
return CommonResult.failed("服務異常");
}
}/<product>/<code>
  • 修改ProductClient接口上的FeignClient註解,指定fallback為降級處理類
<code>@FeignClient(value = "sales-product-service",fallback = ProductClientFallback.class)/<code>
  • 開啟Feign支持Hystrix,修改application.properties
<code>feign:
hystrix:
enabled: true
client:
config:
default:
connectTimeout: 3000
readTimeout: 3000/<code>
  • OrderController的getOrder方法,增加註解@HystrixCommand(fallbackMethod = "getOrderFail"),微服務調用異常時,會降級處理到getOrderFail,方法定義的參數和返回類型要和getOrder保持一致。
<code>private CommonResult getOrderFail(Long id) {
System.out.println("getOrderFail");
return CommonResult.failed("服務異常");
}/<code>
  • 啟動類增加註解@EnableCircuitBreaker,開啟熔斷降級。

Hystrix測試

訂單服務和產品服務都啟動後,在瀏覽器輸入:http://localhost:8094/order/get/1,可正常返回結果。

關閉產品服務,刷新瀏覽器,返回結果如下:

<code>{"code":500,"message":"服務異常","data":null}/<code>

Hystrix Dashboard監控

Spring Cloud提供hystrix dashboard監控通過hystrix發起的請求信息。

創建sales-hystrix-dashboard工程,繼承sales-parent.

  • 添加maven依賴:
<code><dependency>
\t<groupid>org.springframework.boot/<groupid>
\t\t<artifactid>spring-boot-starter-web/<artifactid>
/<dependency>
<dependency>
\t<groupid>org.springframework.cloud/<groupid>
\t\t<artifactid>spring-cloud-starter-netflix-eureka-client/<artifactid>
/<dependency>

<dependency>
\t\t<groupid>org.springframework.cloud/<groupid>
\t\t\t<artifactid>spring-cloud-starter-netflix-hystrix/<artifactid>
/<dependency>

<dependency>
\t\t<groupid>org.springframework.cloud/<groupid>
\t\t\t<artifactid>spring-cloud-netflix-hystrix-dashboard/<artifactid>
/<dependency>/<code>

配置application.yml

<code>server:
port: ${PORT:8100}
spring:
application:
name: sales-hystrix-dashboard

eureka:
client:
registerWithEureka: true #服務註冊開關
fetchRegistry: true #服務發現開關
serviceUrl: #Eureka客戶端與Eureka服務端進行交互的地址,多箇中間用逗號分隔
defaultZone: http://localhost:8090/eureka/
instance:
prefer-ip-address: true #將自己的ip地址註冊到Eureka服務中
ip-address: ${IP_ADDRESS:127.0.0.1}
instance-id: ${spring.application.name}:${server.port} #指定實例id

/<code>

創建啟動類DashboardApplication,添加註解

@SpringBootApplication

@EnableHystrixDashboard

@EnableDiscoveryClient


  • 調整訂單服務允許被監控,添加maven依賴
<code>
<dependency>
\t<groupid>org.springframework.boot/<groupid>
\t\t<artifactid>spring-boot-starter-actuator/<artifactid>
/<dependency>/<code>

配置bean

<code>\t\t@Bean
public ServletRegistrationBean<hystrixmetricsstreamservlet> getServlet(){
HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
registrationBean.setLoadOnStartup(1);
registrationBean.addUrlMappings("/hystrix.stream");
registrationBean.setName("HystrixMetricsStreamServlet");
return registrationBean;
}/<hystrixmetricsstreamservlet>/<code>

啟動測試:

瀏覽器輸入:http://localhost:8100/hystrix


Spring Cloud快速入門(5),Hystrix服務熔斷、降級、監控

輸入:http://localhost:8094/hystrix.stream,點擊Monitor Stream,進入監控頁面

調用訂單服務的接口,http://localhost:8094/order/get/1,查看監控頁面的變化。

Spring Cloud快速入門(5),Hystrix服務熔斷、降級、監控


分享到:


相關文章: