1. 程式人生 > 其它 >Hystrix-服務降級

Hystrix-服務降級

目錄

服務降級:

服務熔斷是服務端出現異常或服務響應超時,對方法進行熔斷及使用備用

服務降級是客戶端從整體網站請求負載考慮,當某個服務熔斷或關閉之後,服務將不再被呼叫,此時在客戶端,我們可以準備一個FallbackFactory,返回一個預設值(預設值)做出處理不影響客戶端執行使用,服務水平降低,但比直接掛掉好

使用Feign的服務端:

建立降級服務類,實現降級工廠介面FallbackFactory,重寫方法,方法返回客戶端介面

工廠介面是feign.hystrix包內的

package com.stt.springcloud.service;

import com.stt.springcloud.pojo.Dept;
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;

import java.util.List;

// 降級
@Component  // 注入容器
public class DeptClientServiceFallbackFactory implements FallbackFactory<DeptClientService> {
    @Override
    public DeptClientService create(Throwable throwable) {
        // 返回介面實現方法,並提示降級資訊
        return new DeptClientService() {
            @Override
            public Dept queryById(Long id) {
                return new Dept()
                        .setDeptno(id)
                        .setDname("id=>"+id+"沒有對應資訊,客戶端提供了降級提示資訊,這個服務已經關閉")
                        .setDb_source("沒有資料");
            }

            @Override
            public List<Dept> queryAll() {
                return null;
            }

            @Override
            public boolean addDept(Dept dept) {
                return false;
            }
        };
    }
}

介面:

在註解@FeignClient內新增降級提示類

@Component                                       // 指定降級的類
@FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT", fallbackFactory = DeptClientServiceFallbackFactory.class)
public interface DeptClientService {

    @GetMapping("/dept/get/{id}")
    public Dept queryById(@PathVariable("id") Long id);

    @GetMapping("/dept/list")
    public List<Dept> queryAll();

    @PostMapping("/dept/add")
    public boolean addDept(Dept dept);
}

配置類:

# 開啟降級feign.hystrix
feign:
  hystrix:
    enabled: true

小結:

Feign對服務提供者宣告可以是用的介面有哪些,服務消費者通過Feign可以呼叫提供者的介面方法,Hystrix服務降級對這些宣告的介面做故障處理,在服務提供者發生故障,而消費者通過Feign可以得到預設值。表示服務不可用。

Dashboard流監控:

建立hystrix-dashboard監控客戶端:

匯入依賴:

主要Hystrix依賴與dashboard監控頁面依賴

<!--實體類+web-->
    <dependencies>
        <!--Hystrix依賴-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>
        <!--dashboard監控頁面依賴-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>com.stt</groupId>
            <artifactId>springcloud-api</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--熱部署工具-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
        <!--ribbon依賴-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>
        <!--Eureka-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>

    </dependencies>

配置檔案修改埠號

啟動類:

註解@EnableHystrixDashboard開啟監控頁面

@SpringBootApplication
@EnableHystrixDashboard  // 開啟監控頁面
public class DeptConsumerDashboard_9001 {
    public static void main(String[] args) {
        SpringApplication.run(DeptConsumerDashboard_9001.class, args);
    }
}

服務提供者匯入依賴:

若提供者能被監控需要匯入依賴

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

<!--Hystrix依賴-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-hystrix</artifactId>
    <version>1.4.6.RELEASE</version>
</dependency>

服務提供者啟動類:

是在使用Hystrix的服務提供者的啟動類中增加一個servlet配合監控使用,固定寫法

@SpringBootApplication
@MapperScan("com.stt.springcloud.dao")
@EnableEurekaClient
@EnableDiscoveryClient  // 服務發現
@EnableCircuitBreaker  // 新增對熔斷支援
public class DeptProviderHystrix_8001 {
    public static void main(String[] args) {
        SpringApplication.run(DeptProviderHystrix_8001.class, args);
    }

    // 增加一個servlet,固定寫法,配合監控使用
    @Bean
    public ServletRegistrationBean hystrixMetricsStreamServlet(){
        ServletRegistrationBean registrationBean = new ServletRegistrationBean(new HystrixMetricsStreamServlet());
        // 新增訪問路徑
        registrationBean.addUrlMappings("/actuator/hystrix.stream");
        return registrationBean;
    }

測試:

若連線不上重啟或等待

瀏覽器服務提供者訪問 /actuator/hystrix.stream檢視連線是否ping通

監控頁面輸入地址http://localhost:8001/actuator/hystrix.stream檢視監控情況

監控頁面: