2--SpringCloud熔斷器hystrix
什麼是斷路器
“斷路器”本身是一種開關裝置,用於在電路上保護線路過載,當線路中有電器發生短路時,“斷路器”能夠及時的切斷故障電路,防止發生過載、發熱、甚至起火等嚴重後果。
在分散式架構中,斷路器模式的作用也是類似的,當某個服務單元發生故障(類似用電器發生短路)之後,通過斷路器的故障監控(類似熔斷保險絲),向呼叫方返回一個錯誤響應,而不是長時間的等待。這樣就不會使得執行緒因呼叫故障服務被長時間佔用不釋放,避免了故障在分散式系統中的蔓延。
在Spring Cloud中使用了Hystrix 來實現斷路器的功能。Hystrix是Netflix開源的微服務框架套件之一,該框架目標在於通過控制那些訪問遠端系統、服務和第三方庫的節點,從而對延遲和故障提供更強大的容錯能力。Hystrix具備擁有回退機制和斷路器功能的執行緒和訊號隔離,請求快取和請求打包,以及監控和配置等功能。
使用斷路器
首先在上一文中已經實現了
eureka.server工程:服務註冊中心 埠1111
eureka.provider工程:服務提供者 埠2222
eureka.customer工程:服務消費者 埠3333
首先我們在eureka.customer工程服務的消費者的pom檔案裡面加上hystrix依賴
<!-- 新增斷路器hystrix的依賴 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency>
然後我們在啟動主類上面新增@EnableCircuitBreaker
註解開啟斷路器功能:
package com; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; import org.springframework.cloud.client.discovery.EnableDiscoveryClient;import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; @SpringBootApplication @EnableDiscoveryClient @EnableCircuitBreaker//開啟斷路器 public class RibbonApplication { @Bean @LoadBalanced//負載均衡的開啟 RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(RibbonApplication.class, args); } }
新增server業務處理類去呼叫COMPUTE-SERVICE裡面的add方法,在處理方法上面加上@HystrixCommand註解 裡面的addServiceFallback表示出錯後回撥的方法,回撥方法必須和呼叫者在同一類中。
package com; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; @Service public class ConsumerService { @Autowired RestTemplate restTemplate; @HystrixCommand(fallbackMethod = "addServiceFallback")//如果呼叫服務失敗的話,呼叫方法addServiceFallback public String addService() { return restTemplate.getForEntity("http://COMPUTE-SERVICE/add?a=10&b=20", String.class).getBody(); } public String addServiceFallback() { return "error"; } }
修改ConsumerController
package com; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController public class ConsumerController { @Autowired private ConsumerService server; @RequestMapping(value = "/add", method = RequestMethod.GET) public String add() { return server.addService(); } // }
這樣依次啟動按道理說應該就實現了hystrix的斷路器的功能。
但是我的 服務提供者並沒有下線,中間也沒有拋錯,也順利的執行了add方法,但是返回的確實錯誤回撥方法的error
然後我想到可能是服務在呼叫的時候發生了超時,hystrix的預設超時時間是1秒鐘,可能是機器太慢發生超時。
可以在配置檔案裡面設定超時時間,單位是毫秒
#設定斷路器超時時間 hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 5000
這下就正常了。