關於Zuul前2篇java
1. 分佈式04-Spring Cloud Zuul Api網關 一 spring
2. 分佈式04-Spring Cloud Zuul 二 Zuul攔截器json
回退機制只有針對於服務出現故障,Zuul作的一些後續操做。app
代碼分佈式
package com.cloud.config; import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider; 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; @Component public class TestFallbackProvider implements FallbackProvider { @Override public String getRoute() { //處理全部的服務 // return "*"; // 代表是爲哪一個微服務提供回退,*表示爲全部微服務提供回退 return "eureka-server"; } @Override public ClientHttpResponse fallbackResponse(String route, Throwable cause) { //回退時的HTTP Status Code return this.response(HttpStatus.NOT_FOUND); } private ClientHttpResponse response(final HttpStatus status) { return new ClientHttpResponse() { @Override public HttpStatus getStatusCode() throws IOException { return status; } @Override public int getRawStatusCode() throws IOException { return status.value(); } @Override public String getStatusText() throws IOException { return status.getReasonPhrase(); } @Override public void close() { } @Override public InputStream getBody() throws IOException { //回退操做 return new ByteArrayInputStream("eureka-server服務不可用,請稍後再試。".getBytes()); } @Override public HttpHeaders getHeaders() { // headers設定 HttpHeaders headers = new HttpHeaders(); MediaType mt = new MediaType("application", "json", Charset.forName("UTF-8")); headers.setContentType(mt); return headers; } }; } }
application.propertieside
zuul.routes.eureka-server.path=/public/* zuul.routes.eureka-server.service-id=eureka-server server.port= 12003 eureka.instance.hostname=localhost eureka.client.service-url.defaultZone= http://${eureka.instance.hostname}:12000/eureka/ eureka.client.healthcheck.enabled=true spring.application.name=eureka-Zuul
啓動Zuul 和測試用的2個應用,打開Eureka,咱們看到2個提供服務的應用eureka-server微服務
eureka-server 提供一個 返回端口的接口測試
/** * http://localhost:12001/public/getPort * @param pageable * @return * @throws Exception */ @RequestMapping(value = "/getPort", method = RequestMethod.GET ) public Msg getport(Pageable pageable, String operatorId) throws Exception{ return Msg.MsgSuccess(port); }
調用 http://localhost:12003/public/getPort ,這個是經過咱們的Zuul網關去調用 eureka-server的接口this
這是正常訪問的,時候咱們能夠看到getPort返回了2個應用的端口,並且 http 的status 是200.url
如今咱們終止掉端口爲12001的應用。這時候Eureka尚未反應過來12001的應用已經沒法提供服務,全部Zuul仍是會調用12001的應用,這時候就會觸發咱們設置的回退機制。
能夠看到12000的服務依然能夠使用,而12001觸發了咱們的回退機制。