1. 程式人生 > >spring cloud分布式關於熔斷器

spring cloud分布式關於熔斷器

響應 pro request 原因 ros arch ont erp border

spring cloud分布式中,熔斷器就是斷路器,其實都是一個意思。

為什麽要使用熔斷器呢?

在分布式中,我們會根據業務或功能將項目拆分為多個服務單元,各個服務單元之間通過服務註冊和訂閱的方式相互依賴和調用功能,隨著項目和業務的不斷拓展,服務單元數量也逐漸增多,相互之間的依賴關系也越來越復雜,這時候,可能會某個服務單元出現問題或網絡原因依賴調用出錯或延遲,此時如果調用該依賴的請求不斷增加,那麽要調用該服務的服務將都會等待或者出現故障,如果後續連鎖反應越來越多,Servlet容器的線程資源會被消耗完畢,導致服務癱瘓。服務與服務的依賴會導致服務之間的故障傳播,從而迎來“雪崩效應“。為了解決這種每個點或多個點的故障,就有了熔斷器的出現。

什麽是熔斷器?

熔斷器就相當於電路中的保險絲、保護器,它可以實現快速失敗,如果它在某一段時間裏偵測到許多類似的錯誤,它將不再訪問遠程服務器,會強迫以後的訪問都會快速失敗,從而防止某個服務不斷地嘗試執行可能會失敗的操作,它會使服務繼續執行而不用等待修正錯誤,或者浪費CPU時間去等到長時間的超時產生,從而進入回路方法。熔斷器也可以使服務能夠診斷錯誤是否已經修正,如果已經修正,服務會再次嘗試調用操作。

技術分享圖片

1.在調用服務方加入熔斷器依賴jar包:

 // https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-hystrix
    compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-hystrix'

2.在Controller中:

@Controller//@EnableWebSecurity 安全檢查controller還要繼承extends WebSecurityConfigurerAdapterpublic class PageController   {    public static Logger logger=LoggerFactory.getLogger(PageController.class);    @Autowired
    private RestTemplate restTemplate;    @HystrixCommand(fallbackMethod = "toIndex1")//斷路器進入回路方法
    @RequestMapping("/toIndex1")
    public String toIndex(Model model){

        System.out.println("進入toIndex");
        logger.info("執行調用");
        String msg=restTemplate.getForEntity("http://project-solr/SolrSearch",String.class).getBody();//project-solr是調用註冊中心裏的名字
        logger.info("調用結束");
        model.addAttribute("msg",msg);        return "index";
    }    public String toIndex1(Model model){
        System.out.println("進入回路方法");
        model.addAttribute("msg","服務不可用,請稍後重試");        return "index";
    }
}

註意:在調用方服務Controller中的方法上加上@HystrixCommand(fallbackMethod = "回路方法")

這裏我讓回路方法調用的是toIndex1,要註意回路方法返回值,參數要與原方法一致

在被調用方的方法中制造故障:

技術分享圖片

3.在調用方的啟動類加註解@EnableCircuitBreaker啟動熔斷器

啟動:

技術分享圖片

技術分享圖片

可以看到進入了回路方法

當然還可以在調用方進行配置:

hystrix:  command:    default:     execution:      isolation:        thread:         timeoutInMilliseconds: 2000 #請求響應時間 如果過了這個時間就會進入回路方法     circuitBreaker:          requestVolumeThreshold: 2 # 服務降級:此請求連續多少次響應過慢或崩潰 系統就默認把它當成一個崩潰的方法 在一定時間內調用此方法會直接進入回路方法 這樣執行更快 默認值是20 請求該方法20次 如果崩潰或響應過慢率大於百分之八十 就會默認它是一個崩潰方法       #timeout:        #enabled: false #取消超時檢查 無論線程運行多久 只要不崩潰就不進入回路方法 一般情況不使用

配置完後運行:

技術分享圖片

運行好幾次發現它會前兩次會訪問並等待相應結果,後面不再訪問就直接回應結果進入回路方法

當然這是根據配置:

技術分享圖片


spring cloud分布式關於熔斷器