分佈式04-Spring Cloud Zuul 三 Fallback 回退機制

關於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觸發了咱們的回退機制。

相關文章
相關標籤/搜索