SpringCloud廢話入門04:Hystrix熔斷器及監控

      網友投稿 840 2022-05-28

      1.斷路器(Circuit Breaker)模式

      在上文中,我們人為停掉了一個provider,在實際的生產環境中,因為意外某個服務down掉,甚至某一層服務down掉也是會是有發生的。一旦發生這種情況,我們需要將損失減少到最低限度。

      那怎么減少損失。在電力系統中,如果某個電器發生過載等問題,該段電路的繼電器中的保險絲就會熔斷。在分布式系統中,我們也可以設計這樣的模式,并為它賦有專有名詞:斷路器(Circuit Breaker)模式。

      其基本模式在Martin Fowler的一篇文章中進行過專有描述,其大概的架構圖如下:

      它描述了兩個狀態:close、open,以及一個動作:trip,

      close狀態下, client通過熔斷器向supplier發起的服務請求, supplier的返回值經過熔斷器返回client。

      open狀態下,c client通過熔斷器向supplier發起的服務請求,熔斷器直接返回值給client, client和supplier之間被隔斷。

      Trip動作: 如果在close狀態下, supplier持續超時報錯, 熔斷器就進行trip,然后熔斷器將狀態從close進入open。

      除了基本模式,Martin Fowler還描述了一種擴展模式。即熔斷器定期探測supplier的服務的狀態, 一旦服務恢復, 就將狀態設置回close,并且熔斷器進行重試時的狀態為half-open狀態。

      對于熔斷器模式,不再詳細展開。接下來我們看看在springCloud的系統中,熔斷器是怎么提供的。

      2.Hystrix熔斷與服務降級

      SpringCloud Netflix實現的熔斷器叫Hystrix。我們首先看看微服務架構下, 瀏覽器如何訪問后臺服務,

      然后,服務異常情況下,Hystrix通過提供Fallback進行了熔斷的保護,

      Hystrix設定的熔斷閾值是:5秒之內發生20次調用失敗,然后熔斷器就會被處于open狀態, 在熔斷狀態下,服務不再被調用, Hystrix提供一個Fallback回調。當然,這個回調可以由我們實現。

      Fallback是一種降級操作,這種行為我們定義為:服務降級。

      3.實現

      首先,在服務接口的聲明中,加入FeignClient注解的fallback屬性,

      package com.zuikc;

      import org.springframework.cloud.openfeign.FeignClient;

      import org.springframework.web.bind.annotation.RequestMapping;

      @FeignClient(value = "hello-service",fallback = FeignFallBack.class)

      public interface HelloService {

      //服務中方法的映射路徑

      @RequestMapping("/hello")

      String hello();

      }

      注意,假設這里我們沒有使用FeignClient注解,而是原先那種url方式來啟動LB的話,那么,那么就需要在具體的service中直接使用注解:@HystrixCommand(fallbackMethod = "helloFallBack"),來實現熔斷和服務降級。helloFallBack可以是具體服務類中的一個指定的方法。

      接下來,然后接著說FeignClient,實現該FeignFallBack類,

      package com.zuikc;

      import org.springframework.stereotype.Component;

      /**

      * @ClassName FeignFallBack

      * @Description 我們提供咨詢和培訓服務,關于本文有任何困惑,請關注并聯系“碼農星球”

      * @Author 碼農星球

      **/

      @Component

      public class FeignFallBack implements HelloService {

      //實現的方法是服務調用的降級方法

      @Override

      public String hello() {

      return "error";

      }

      }

      這個類實現了HelloService。如果provider調用失敗,就會執行該類的實現。

      最后,還得配置,

      server:

      port: 9291

      spring:

      application:

      name: Ribbon-Consumer

      eureka:

      client:

      service-url:

      defaultZone: http://localhost:9091/eureka/

      #providers這個是自己命名的,ribbon,listOfServer這兩個是規定的

      providers:

      ribbon:

      listOfServers: http://localhost:9191/eureka,http://localhost:9192/eureka

      feign:

      hystrix:

      enabled: true

      粗體部分就是新加的配置。Feign默認禁用熔斷器,所以我們需要配置為enabled。

      經過以上功能的改進后,停止provider吧,看看結果是什么呢?

      4.監控

      SpringCloud做的比dubbo好的一點就是其監控非常的明了。我們可以用hystrix的監控方便的看到熔斷器的數據指標。

      要想監控這些數據,我們還得繼續改造我們的項目。

      首先,在provider的pom中加入依賴:

      org.springframework.boot

      spring-boot-actuator

      其次,在我們ribbon項目中,加入依賴:

      com.netflix.hystrix

      hystrix-javanica

      RELEASE

      org.springframework.cloud

      spring-cloud-netflix-hystrix-dashboard

      第一個依賴表示我們得有監控,第二個依賴表示我們得有一個儀表盤。

      接著,讓我們在ribbon的啟動類中加入一個servlet,如下:

      package com.zuikc;

      import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet;

      import org.springframework.boot.SpringApplication;

      import org.springframework.boot.autoconfigure.SpringBootApplication;

      import org.springframework.boot.web.servlet.ServletRegistrationBean;

      import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;

      import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

      import org.springframework.cloud.client.loadbalancer.LoadBalanced;

      import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;

      import org.springframework.cloud.openfeign.EnableFeignClients;

      import org.springframework.context.annotation.Bean;

      import org.springframework.web.client.RestTemplate;

      /**

      * @ClassName ServiceRibbonApplication

      * @Description 我們提供咨詢和培訓服務,關于本文有任何困惑,請關注并聯系“碼農星球”

      * @Author 碼農星球

      **/

      SpringCloud無廢話入門04:Hystrix熔斷器及監控

      @SpringBootApplication

      @EnableDiscoveryClient

      @EnableFeignClients

      @EnableCircuitBreaker

      @EnableHystrixDashboard

      public class ServiceRibbonApplication {

      public static void main(String[] args) {

      SpringApplication.run(ServiceRibbonApplication.class, args);

      }

      @Bean

      @LoadBalanced

      RestTemplate restTemplate() {

      return new RestTemplate();

      }

      @Bean

      public ServletRegistrationBean getServlet(){

      HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();

      ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);

      registrationBean.setLoadOnStartup(1);

      registrationBean.addUrlMappings("/actuator/hystrix.stream");

      registrationBean.setName("HystrixMetricsStreamServlet");

      return registrationBean;

      }

      }

      在這個啟動類中,除了這個servlet要注冊之外,就是加入

      @EnableCircuitBreaker

      @EnableHystrixDashboard

      這兩個注解了。注意,由于hystrix默認就是支持熔斷器的,所以@EnableCircuitBreaker注解之前我們并沒有加。但是,這里要使用監控了,就必須要加入這個注解了。

      以上都操作完畢。來打開:http://localhost:9291/hystrix。

      然后在出來的如下界面中,首先填入servlet的地址,其次點擊下面的monitor按鈕,

      最終進入到如下這個監控儀表盤界面。每一次對provider的調用,都會清清楚楚被儀表盤呈現出來。

      Ok。本章告一段落。

      感謝關注“碼農星球”。本文版權屬于“碼農星球”。我們提供咨詢和培訓服務,關于本文有任何困惑,請關注并聯系我們。

      本文的參考1:

      https://martinfowler.com/bliki/CircuitBreaker.html

      本文的參考2:

      http://cloud.spring.io/spring-cloud-netflix/multi/multi__circuit_breaker_hystrix_clients.html

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:如何看懂音樂簡譜
      下一篇:Java基礎 第四節 第八課
      相關文章
      vvvv99日韩精品亚洲| avtt天堂网手机版亚洲| 亚洲色丰满少妇高潮18p| 亚洲毛片免费视频| 老汉色老汉首页a亚洲| 亚洲激情在线视频| 亚洲国产精品乱码一区二区| 色噜噜亚洲精品中文字幕| 亚洲高清免费视频| 亚洲国产中文字幕在线观看| 亚洲第一成人影院| 亚洲欧洲精品成人久久曰影片| 亚洲第一黄色网址| 亚洲AV中文无码乱人伦| 亚洲黄黄黄网站在线观看| 亚洲一本大道无码av天堂| 亚洲一级片内射网站在线观看| 亚洲AV无码一区二区三区在线观看 | 亚洲神级电影国语版| 亚洲精品国产手机| 亚洲精品中文字幕无乱码| 亚洲精品日韩中文字幕久久久| 77777_亚洲午夜久久多人| 亚洲视频在线不卡| 亚洲区精品久久一区二区三区| 久久精品亚洲AV久久久无码| 2017亚洲男人天堂一| 亚洲国产精品无码久久久秋霞1| 亚洲欧好州第一的日产suv| 亚洲成av人片天堂网无码】| 亚洲AV无码一区二区三区性色| 国产成人不卡亚洲精品91| 麻豆亚洲AV成人无码久久精品| 亚洲 无码 在线 专区| 久久精品国产亚洲7777| 亚洲综合精品网站| 精品亚洲综合在线第一区| 亚洲视频国产视频| 亚洲欧洲日韩国产一区二区三区| 亚洲精品无码专区| 亚洲国产精品一区二区三区久久 |