spring cloud分布式關於熔斷器


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 WebSecurityConfigurerAdapter
public 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熔斷器就說到這里,想了解spring cloud其他內容,請瀏覽我以前博客

若覺得有用點個贊吧(●'◡'●)

歡迎來點評(●'◡'●)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM