zuul動態路由整合hystrix實現熔斷保護並整合feign實現宣告式服務呼叫
阿新 • • 發佈:2018-12-06
上一篇中。將userService提供服務的返回時間延遲4000ms。導致feign在呼叫時候出發熔斷。直接返回fallback回撥。
這一篇中加入zuul實現動態路由功能。並加入ZuulFilter的前置過濾功能。zuul整合hystrix預設在早期版本是開啟的。但在後期
版本就關閉了自動開啟功能,需要手動配置開啟。這一點需要注意
測試程式碼如下:
1:引入相關的依賴:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency>
2:配置路由檔案:
zuul: routes: #serviceId可以隨便寫只要唯一就行。一般寫呼叫的服務的spring.application.name對應的值 microservice-consumer-movie-feign: #攔截的url path: /feign/** #去掉字首,例如請求的url:/fegin/user/1,那麼請求的http://xxxx:xx/feigin/user/1,如果沒有下面的**/fegin/fegin/user/1 stripPrefix: false
3:zuul整合hystrix預設的超時時間是1s。所以這裡要配置相應的超時時長
#zuul整合hystrix預設1s.這裡如果不設定超時時間就會報錯 ribbon: ReadTimeout: 1000 ConnectTimeout: 500 #熔斷機制 hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 25000
上面兩個配置。同時起作用。一般hystrix的超時時間要大於ribbon的時間。如果超時就回觸發zuul的回撥機制。下面編寫zuul
的回撥函式
package com.itmuch.cloud.microserviceconsumermoviezuul.controller; import org.springframework.cloud.netflix.zuul.filters.route.ZuulFallbackProvider; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.client.ClientHttpResponse; import org.springframework.stereotype.Component; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; /** * : 描述資訊 * * @author liyy * @date 2018-12-03 20:03 */ @Component public class UserServiceFallbackProvider implements ZuulFallbackProvider { @Override public String getRoute() { return "microservice-consumer-movie-feign"; } @Override public ClientHttpResponse fallbackResponse() { return new ClientHttpResponse() { @Override public HttpStatus getStatusCode() throws IOException { return HttpStatus.OK; } @Override public int getRawStatusCode() throws IOException { return this.getStatusCode().value(); } @Override public String getStatusText() throws IOException { return this.getStatusCode().getReasonPhrase(); } @Override public void close() { } @Override public InputStream getBody() throws IOException { return new ByteArrayInputStream("Service-user不可用".getBytes()); } @Override public HttpHeaders getHeaders() { HttpHeaders headers = new HttpHeaders(); MediaType mt = new MediaType("application", "json", Charset.forName("UTF-8")); headers.setContentType(mt); return headers; } }; } }
springboot2.0版本以後。ZuulFallbackProvider 這個類已經沒喲了。但是FallbackProvider這個類還是可以用。
如果出現超時。這回觸發回到。返回
Service-user不可用的結果。