天天看點

SpringCloud五大元件Hystrix

SpringCloud五大元件Hystrix

分布式系統環境下,服務間類似依賴非常常見,一個業務調用通常依賴多個基礎服務。如下圖,對于同步調用,當庫存服務不可用時,商品服務請求線程被阻塞,當有大批量請求調用庫存服務時,最終可能導緻整個商品服務資源耗盡,無法繼續對外提供服務。并且這種不可用可能沿請求調用鍊向上傳遞,這種現象被稱為雪崩效應。

一、在原有的user服務上進行改造,添加Hystrix斷路器,pom配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>父GroupId</groupId>
        <artifactId>父ArtifactId</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.lezhu.cloud</groupId>
    <artifactId>user</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>user</name>
    <packaging>pom</packaging>
    <dependencies>
        <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-zipkin</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-netflix-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>

</project>
           

二、user服務yml配置,配置如下:

spring:
  application:
    name: user
server:
  port: 28666
eureka:
  instance:
    #開啟IP注冊
    prefer-ip-address: true
    #位址名稱
    instance-id: ${spring.cloud.client.ip-address}:${server.port}
    #心跳
    lease-renewal-interval-in-seconds: 5
    #無心跳,十秒踢出
    lease-expiration-duration-in-seconds: 10
    #擷取此執行個體的相對健康檢查URL路徑。 健康檢查頁面URL,然後構造出主機名和通信的類型 - 安全或不安全,如securePort和nonSecurePort規定。 它通常用于制造基于執行個體的健康做出明智的決策 - 例如,它可以被用來确定是否進行部署到整個伺服器場或停止部署,而不會造成進一步的損害。
    health-check-url-path: /actuator/health
    #擷取與此執行個體相關聯的中繼資料名稱/值對。 該資訊被發送到伺服器eureka,可以通過其他情況下使用。
    metadata-map:
      user.name: ${spring.security.user.name}
      user.password: ${spring.security.user.password}
  client:
    #表示的頻率(以秒為機關)來從eureka伺服器系統資料庫的資訊
    registryFetchIntervalSeconds: 5
    service-url:
      defaultZone: ${EUREKA_SERVICE_URL:http://127.0.0.1:28001}/eureka/
### Feign 配置
feign:
  compression:
    request:
      # 開啟請求壓縮
      enabled: true
      # 配置壓縮的 MIME TYPE
      mime-types: text/xml,application/xml,application/json
      # 配置壓縮資料大小的下限
      min-request-size: 2048
    response:
      # 開啟響應壓縮
      enabled: true
  hystrix:
    #斷路器打開  feign開啟熔斷器必須加這句話,不然無法使用,直接報500狀态碼
    enabled: true
           

三、我們使用Feign來斷路,User服務Feign接口改造,代碼如下:

隻需要在FeignClient的MemberServiceFeign接口的注解中加上fallback的指定類就行了

@FeignClient(value = "member",fallback = MemberServiceFeignHystric.class)
public interface MemberServiceFeign {

    /**
     * 遠端調用會員接口
     *
     * @param name
     * @return
     */
    @GetMapping("/member/sayHiMember")
    String sayHiMember(@RequestParam(value = "name") String name);

    /**
     * 遠端調用接口
     *
     * @param name
     * @return
     */
    @GetMapping("/member/port")
    String port(@RequestParam(value = "name") String name);

}
           

四、我們接下來建立一個接口實作類,代碼如下:

我們在這裡需要實作MemberServiceFeign接口并注入到Ioc容器中

@Component
public class MemberServiceFeignHystric implements MemberServiceFeign {
    @Override
    public String sayHiMember(String name) {
        return "FeignSayHiMember使用了斷路器【熔斷器】,限制服務處于熔斷狀态,運作了類似于抛出異常的方法,時間=" + new Date();
    }

    @Override
    public String port(String name) {
        return "FeignPort使用了斷路器【熔斷器】,限制服務處于熔斷狀态,運作了類似于抛出異常的方法,時間=" + new Date();
    }
}

           

五、啟動類添加@EnableHystrix注解,進行開啟斷路器,代碼如下:

@EnableEurekaClient
@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
@EnableHystrix
public class ServiceUserApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceUserApplication.class, args);
    }

    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

}
           

六、我們先啟動User服務,然後不去啟動Member服務,現在我們在網址上輸入這個位址:http://127.0.0.1:28666/user/userInfo?name=張三,顯示如下圖,就證明斷路器已經啟動

SpringCloud五大元件Hystrix

我們在啟動Member服務再看下傳回結果:

SpringCloud五大元件Hystrix

SpringCloud五大元件之一Hystrix斷路器已到此結束

繼續閱讀