Spring Cloud Turbine聚合Hystrix
前言
前面文章提到了使用了Feign整合的Hystrix做了一個簡單的實戰練習,成功的進行了服務降級和失敗快速返回。下面我要對熔斷器監控進行頁面化,並將多個服務的的熔斷器監控頁面進行聚合,方便管理,也是實際生產最典型的例子。當然這種做法最系統最合理,但是我個人以及周圍的朋友在平時討論的結果看,熔斷器的聚合以及頁面化管理應用概率並不多,即使在生產環境也很少使用,下面我邊講解邊解釋原因。
正文
首先,大家都知道一個服務需要依賴spring-cloud-starter-netflix-hystrix才可以實現熔斷器功能,需要依賴spring-cloud-starter-netflix-hystrix-dashboard才可以使用熔斷器監控頁面。想要聚合所有服務熔斷器的監控頁面需要spring-cloud-starter-netflix-turbine。
第一步
還是跟以前一樣,我們準備一個父專案,還有一個eureka-server,程式碼在上文已經貼出來過,沒有什麼變化。
第二步
準備兩個客戶端一個叫sc-hello-service,另一個叫sc-provider-service
下面貼出sc-hello-service專案的程式碼,首先我把專案的目錄給大家,下面貼的程式碼比較多,每塊程式碼都有類名,大家對照著類名把程式碼塊對號入座(截圖中的配置檔案的程式碼我合成了一個程式碼塊貼出來的)。
@RestController public class HelloController { @Autowired private IHelloService userService; @GetMapping("/getProviderData") public List<String> getProviderData(){ return userService.getProviderData(); } /** * * @return */ @RequestMapping(value = "/helloService", method = RequestMethod.GET) public String getHelloServiceData() { return "hello Service"; } }
@FeignClient(name = "sc-provider-service")
public interface ProviderService {
@RequestMapping(value = "/getDashboard", method = RequestMethod.GET)
public List<String> getProviderData();
}
@Component public class HelloService implements IHelloService{ @Autowired private ProviderService dataService; @Override public List<String> getProviderData() { return dataService.getProviderData(); } }
public interface IHelloService {
public List<String> getProviderData();
}
@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrix
@EnableFeignClients
public class HelloServiceApplication {
public static void main(String[] args) {
SpringApplication.run(HelloServiceApplication.class, args);
}
}
server:
port: 9091
spring:
application:
name: sc-hello-service
eureka:
client:
serviceUrl:
defaultZone: http://${eureka.host:127.0.0.1}:${eureka.port:8761}/eureka/
instance:
prefer-ip-address: true
management:
security:
enabled: false
endpoints:
web:
exposure:
include: hystrix.stream
feign:
hystrix:
enabled: true
ribbon:
ConnectTimeout: 6000
ReadTimeout: 6000
MaxAutoRetries: 0
MaxAutoRetriesNextServer: 0
hystrix:
command:
default:
execution:
timeout:
isolation:
thread:
timeoutInMilliseconds: 15000
<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-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
</dependencies>
下面貼出sc-provider-service專案的程式碼,首先我把專案的目錄給大家,下面貼的程式碼比較多,每塊程式碼都有類名,大家對照著類名把程式碼塊對號入座(截圖中的配置檔案的程式碼我合成了一個程式碼塊貼出來的)。
@RestController
public class ProviderController {
@Autowired
private ConsumerService consumerService;
@GetMapping("/getDashboard")
public List<String> getProviderData(){
List<String> provider = new ArrayList<String>();
provider.add("hystrix dashboard");
return provider;
}
@GetMapping("/getHelloService")
public String getHelloService(){
return consumerService.getHelloServiceData();
}
}
@FeignClient(name = "sc-hello-service")
public interface ConsumerService {
@RequestMapping(value = "/helloService", method = RequestMethod.GET)
public String getHelloServiceData();
}
server:
port: 8099
spring:
application:
name: sc-provider-service
eureka:
client:
serviceUrl:
defaultZone: http://${eureka.host:127.0.0.1}:${eureka.port:8761}/eureka/
instance:
prefer-ip-address: true
feign:
hystrix:
enabled: true
management:
security:
enabled: false
endpoints:
web:
exposure:
include: hystrix.stream
<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-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
</dependencies>
@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrix
public class ProviderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderServiceApplication.class, args);
}
}
第三步
建立一個聚合工程sc-turbine-dashboard,程式碼很簡單除了一個啟動類就是一個配置檔案
下面依次貼出來,重點就是啟動類加入類加入@EnableTurbine,
turbine: appConfig: sc-hello-service,sc-provider-service的意思是把這兩個應用的服務聚合在一起,在一個頁面顯示。
@SpringBootApplication
@EnableDiscoveryClient
@EnableTurbine
@EnableHystrixDashboard
public class TurbineApplication {
public static void main(String[] args) {
SpringApplication.run(TurbineApplication.class, args);
}
}
server:
port: 9088
spring:
application:
name: sc-turbine-dashboard
eureka:
client:
serviceUrl:
defaultZone: http://${eureka.host:127.0.0.1}:${eureka.port:8761}/eureka/
instance:
prefer-ip-address: true
management:
security:
enabled: false
endpoints:
web:
exposure:
include: hystrix.stream
turbine:
appConfig: sc-hello-service,sc-provider-service
clusterNameExpression: "'default'"
第四步
依次啟動eureka-service,兩個客戶端sc-hello-service,sc-provider-service最後啟動sc-turbine-dashboard,
第一個是預設叢集監控,第二個是指定的叢集,第三個是單個應用監控。
這裡我們在下面的位址列選擇第一種方法,輸入http://localhost:9088/turbine.stream
,這回再回頭看你的聚合監控頁面
這裡面有很多引數,我不做講解了,有時間我會單獨發文說明這些引數代表說明意思。
下面我們來色是一下被呼叫的服務宕掉的 情況,可以發現頁面引數的變化
在你訪問http://localhost:9091/getProviderData和http://localhost:8099/getHelloService時,由於註冊中心的定時任務,服務還沒有註冊在eureka上,你訪問的時候會看到有點方法出現100%,然後前面有一個1,說明失敗請求這個方法1次。反覆請求,1會增加到2……,但是停止訪問,過一會又變回0和0.0%。這裡告訴大家這裡記錄的都是失敗的請求和最近10秒內的錯誤比率,曲線是2分鐘內流量的變化趨勢,所以前言我們說,很多時候這個聚合監控頁面很少使用的原因:
1.錯誤資訊保留時間短,甚至有的時候沒來得及反應就消失了。
2.即使出現錯誤也不能自己修復和解決,hystrix已經有修復功能了,要你何用,用來看嗎?
注:對本文有異議或不明白的地方微信探討,wx:15524579896