Hystrix熔斷器(六)

1、分佈式面臨的問題

複雜的分佈式體系結構中的應用程序有數十個依賴關係,每一個依賴關係在某些時候將不可避免地失敗雪崩效應多個微服務之間調用的時候,假設服務A調用微服務B和微服務C,java

微服務B和微服務C又調用其餘的微服務,這就是所謂的"扇出".若是扇出的鏈路上某個微服務的調用響應時間過長或者不可用,對微服務A的調用就會愈來愈多的系統資源,進而引發系統崩潰,所謂的"雪崩效應".mysql

若是下圖所示:A做爲服務提供者,B爲A的服務消費者,C和D是B的服務消費者。A不可用引發了B的不可用,並將不可用像滾雪球同樣放大到C和D時,雪崩效應就造成了。web

 

2、熔斷器定義

Hystrix是一個用於處理分佈式系統的延遲和容錯的開源庫,在分佈式系統裏,許多依賴不可避免的會調用失敗,好比超時,異常等,Hystrix可以保證在一個依賴出問題的狀況下,不會致使總體服務的失敗,避免故障,以提升分佈式系統的彈性spring

"斷路器"自己是一種開關裝置,當某個服務單元發送故障以後,經過斷路器的故障監控(相似熔斷保險絲),向調用方向返回一個符合預期的,可處理的備選響應(FallBack),而不是長時間的等待或者拋出調用方法處理的異常,這樣的保證了服務調用方的線程不會被長時間,沒必要要地佔用,從而避免了故障在分佈式系統中的蔓延,乃至雪崩sql

3、服務熔斷

一、熔判定義

熔斷機制是應對雪崩效應的一種微服務鏈路保護機制,當扇出鏈路的某個微服務不可用或者響應時間太長時,會進行服務的降級,進而熔斷該節點微服務的調用,快速返回"錯誤"的響應信息.數據庫

當檢測到該節點微服務調用響應正常後恢復調用鏈路.在spring cloud框架裏熔斷機制經過Hystrix實現.Hystrix會監控微服務調用的情況,當失敗的調用到必定的閾值,api

缺省是5s內20次調用失敗就會啓動熔斷機制.熔斷機制的註解就是@HystrixCommandtomcat

二、新建microservicecloud-provider-dept-hystrix-8001

參考microservicecloud-provider-dept-8001springboot

pom文件服務器

 <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jetty</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <!-- 將微服務provider側註冊進eureka -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <!-- 引入本身定義的api通用包,可使用Dept部門Entity -->
        <dependency>
            <groupId>com.yehui</groupId>
            <artifactId>microservicecloud-api</artifactId>
            <version>${project.version}</version>
            <scope>compile</scope>
        </dependency>
        <!-- hystrix -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        <!-- actuator監控信息完善 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>

yml文件

server: port: 8008 mybatis: config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路徑 type-aliases-package: com.yehui.entity # 全部Entity別名類所在包 mapper-locations: classpath:mybatis/mapper/**/*.xml # mapper映射文件 spring: application: name: microservicecloud-dept datasource: type: com.alibaba.druid.pool.DruidDataSource # 當前數據源操做類型 driver-class-name: org.gjt.mm.mysql.Driver # mysql驅動包 url: jdbc:mysql://localhost:3306/clouddb01 # 數據庫名稱 username: root password: root dbcp2: min-idle: 5 # 數據庫鏈接池的最小維持鏈接數 initial-size: 5 # 初始化鏈接數 max-total: 5 # 最大鏈接數 max-wait-millis: 200 # 等待鏈接獲取的最大超時時間 eureka: client: #客戶端註冊進eureka服務列表內 service-url: defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/,http://eureka7001.com:7001/eureka/ instance: instance-id: providerdept_hystrix_8001 #自定義服務名稱 prefer-ip-address: true #訪問路徑能夠顯示IP地址 #信息的描述 info: app.name: atguigu-microservicecloud company.name: www.atguigu.com build.artifactId: $project.artifactId$ build.version: $project.version$

 4、服務降級

一、定義

總體資源快不夠了,忍痛將某些服務先關掉,待讀過難關,在開啓回來.服務降級處理是在客戶端實現完成的,與服務端沒有關係

在高併發狀況下,防止用戶一直等待,使用服務降級方式(直接返回一個友好的提示給客戶端,調用fallBack方法)

二、修改microservicecloud-api工程

建立一個接口並實現DeptClientService接口

@Component//不忘記打上這個註解
public class KittyProducerHystrix implements DeptClientService { @Override public List<Dept> findAll() { return null; } @Override public Dept findById(Long id) { return new Dept().setDeptno(id).setDname("該ID:" + id + "沒有沒有對應的信息,null--@HystrixCommand") .setDb_source("no this database in MySQL"); } }

修改microservicecloud-api,DeptClientService在註解@FeignClient

@FeignClient(name = "MICROSERVICECLOUD-DEPT",fallback = KittyProducerHystrix.class)//name是一個服務名稱,在註冊中上面
public interface DeptClientService { @RequestMapping(value = "/dept/findAll",method = RequestMethod.GET) public List<Dept> findAll(); @RequestMapping("/dept/findById/{id}") public Dept findById(@PathVariable("id") Long id); }

microservicecloud-consumer-dept-feign工程yml修改

feign: hystrix: enabled: true

microservicecloud-consumer-dept-feign工程pom文件添加依賴

  <!-- hystrix -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>

 主啓動類修改

新增@EnableCircuitBreaker //開啓熔斷機制
@SpringBootApplication @EnableFeignClients(basePackages = "com.yehui.feign")//掃描feignClient提供接口的包
@EnableCircuitBreaker //開啓熔斷機制
public class ConSumeAppStartDeptfeign { public static void main(String[] args) { SpringApplication.run(ConSumeAppStartDeptfeign.class); } }

測試

3eureka先啓動

微服務microservicecloud-provider-dept-8001啓動

microservicecloud-consumer-dept-feign啓動

正常測試

故意關閉微服務microservicecloud-provider-dept-8001

客戶端本身調用提示信息

 

5、服務隔離

由於默認狀況下,只有一個線程池會維護全部的服務接口,若是大量的請求訪問同一個接口,達到tomcat 線程池默認極限,可能會致使其餘服務沒法訪問。

解決服務雪崩效應:使用服務隔離機制(線程池方式和信號量),使用線程池方式實現隔離的原理:  至關於每一個接口(服務)都有本身獨立的線程池,由於每一個線程池互不影響,這樣的話就能夠解決服務雪崩效應。

  線程池隔離:

      每一個服務接口,都有本身獨立的線程池,每一個線程池互不影響。

  信號量隔離:

使用一個原子計數器(或信號量)來記錄當前有多少個線程在運行,當請求進來時先判斷計數器的數值,若超過設置的最大線程個數則拒絕該請求,若不超過則通行,這時候計數器+1,請求返 回成功後計數器-1。

 

 

六·、服務監控HystrixDashboard

一、定義

除了隔離依賴服務的調用之外,Hystrix還提供了準實時的調用監控(Hystrix Dashboard),Hystrix會持續地記錄全部經過Hystrix發起請求的執行信息,

並以統計報表和圖形的形式展現給用戶,包括美妙執行多少請求多少成功,多少失敗等.

Nextflix經過hystrix-metrics-event-stream項目實現了對以上指標的監控.spring cloud 也提供了Hystrix Dashboard的整合,對監控內容轉化成可視化界面

 二、 搭建環境步驟

新建工程microservicecloud-provider-dept-hystrix-dashboard

pom文件

<dependencies>
        <!-- hystrix -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
        </dependency>
        <!-- actuator監控信息完善 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!-- 引入本身定義的api通用包,可使用Dept部門Entity -->
        <dependency>
            <artifactId>microservicecloud-api</artifactId>
            <groupId>com.yehui</groupId>
            <version>${project.version}</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--客戶端依賴-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!-- feign相關 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>

 yml文件

server: port: 9001

啓動類

@SpringBootApplication @EnableHystrixDashboard public class DeptConsumer_DashBoard_App { public static void main(String[] args) { SpringApplication.run(DeptConsumer_DashBoard_App.class); } }

 全部的provider微服務提供類(8001/8002/8003)都須要監控依賴配置

<!-- actuator監控信息完善 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

 microservicecloud-provider-dept-hystrix-8001新增監控地址配置類

@Configuration public class HyStrixConfig { // 此配置是爲了服務監控而配置,與服務容錯自己無關, // ServletRegistrationBean由於springboot的默認路徑不是"/hystrix.stream", // 只要在本身的項目裏配置上下面的servlet就能夠了
 @Bean public ServletRegistrationBean getServlet() { HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet(); ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet); registrationBean.setLoadOnStartup(1); registrationBean.setServlet(streamServlet); registrationBean.addUrlMappings("/hystrix.stream"); registrationBean.setName("HystrixMetricsStreamServlet"); return registrationBean; } } 

啓動microservicecloud-provider-dept-hystrix-dashboard該微服務監控

http://localhost:9001/hystrix

成功:

啓動3eureka集羣

啓動microservicecloud-provider-dept-hystrix-8001

http://localhost:8008/dept/findById/1

訪問http://localhost:8008/hystrix.stream

效果:

啓動相關的微服務工程

 

觀察監控窗口

  填寫監控地址

參數詳解:

Depay:該參數用來監控服務器上的輪詢監控信息的延遲時間,默認爲2000毫秒,能夠經過配置該屬性來下降客戶端網絡和CPU的消耗

Title:該參數對應了頭部標題Hystrix Stream以後的內容,默認會使用具體監控實例的

URL,能夠經過配置該信息來展現更合適的標題 

監控結果

如何看

七色

1

實心圓:共有2種含義.它經過顏色變化表明了實例的健康程度,它的健康度從綠色<黃色<橙色<紅色遞減.

該實心圓除了顏色的變化以外,它的大小會根據實例的請求流量發生變化,流量越大實心圓就越大.因此經過該實心圓

的展現,就能夠在大量的實例中快速發現故障實例和高壓力實例

1

曲線:用來記錄2分鐘內流量的相對變化,能夠經過它來觀察到流量的上升和降低趨勢

總體說明

 

 複雜的:

相關文章
相關標籤/搜索