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=張三,顯示如下圖,就證明斷路器已經啟動
我們在啟動Member服務再看下傳回結果: