1. 程式人生 > >Spring Cloud Turbine聚合Hystrix

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/getProviderDatahttp://localhost:8099/getHelloService時,由於註冊中心的定時任務,服務還沒有註冊在eureka上,你訪問的時候會看到有點方法出現100%,然後前面有一個1,說明失敗請求這個方法1次。反覆請求,1會增加到2……,但是停止訪問,過一會又變回0和0.0%。這裡告訴大家這裡記錄的都是失敗的請求和最近10秒內的錯誤比率,曲線是2分鐘內流量的變化趨勢,所以前言我們說,很多時候這個聚合監控頁面很少使用的原因:

1.錯誤資訊保留時間短,甚至有的時候沒來得及反應就消失了。

2.即使出現錯誤也不能自己修復和解決,hystrix已經有修復功能了,要你何用,用來看嗎?

注:對本文有異議或不明白的地方微信探討,wx:15524579896