》》》》》》spring cloud zuul的回退機制以及ribbon,fegin的回退機制

一.zuul回退機制:

在默認情況下,經過Zuul的請求都會被Hystrix包裹,即Zuul的所有請求在Hystrix Command中執行,所以Zuul本身就具有斷路器的功能。

實現的步驟:

繼承FallbackProvider父類,將實現“getRoute”以及“fallbackResponse”方法。

其中“getRoute”方法返回一個回退時需要用到的路由,也就是我們代理的服務的路由名稱

而“fallbackResponse”方法就是我們需要按照實際需要,給不同的失敗原因,返回不同的響應

實現Zuul的回退,有以下四步:
1、創建一個繼承FallbackProvider回退提供器的父類的子類
2、實現FallbackProvider子類的“getRoute”方法,返回值即是代理的服務的路由地址(默認爲該微服務在Eureka中的應用名)。
3、實現FallbackProvider子類的“fallbackResponse”方法,根據不同的異常類型,返回不同的異常信息。
4、將該FallbackProvider子類的Bean注入到啓動或配置類中
 

二.zuul回退案例:

1.編寫一個自定義的回退邏輯代碼:ZuulFallBackHandler類

package com.ljf.weifuwu.springcloud.zuul.fallback;

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;

@Component
public class ZuulFallBackHandler implements ZuulFallbackProvider {
    @Override
    public String getRoute() {
        return "ms-eureka-provider";
    }

    @Override
    public ClientHttpResponse fallbackResponse() {
        return new ClientHttpResponse() {
            @Override
            public HttpStatus getStatusCode() throws IOException {
                System.out.println("HttpStatus.BAD_REQUEST:"+HttpStatus.BAD_REQUEST);
                return HttpStatus.BAD_REQUEST;
            }

            @Override
            public int getRawStatusCode() throws IOException {
                System.out.println("HttpStatus.BAD_REQUEST.value():"+HttpStatus.BAD_REQUEST.value());
                return HttpStatus.BAD_REQUEST.value();
            }

            @Override
            public String getStatusText() throws IOException {
                System.out.println("HttpStatus.BAD_REQUEST.getReasonPhrase():"+HttpStatus.BAD_REQUEST.getReasonPhrase());
                return HttpStatus.BAD_REQUEST.getReasonPhrase();
            }

            @Override
            public void close() {
            }

            @Override
            public InputStream getBody() throws IOException {
               // return new ByteArrayInputStream(("fallback" + ZuulFallBackHandler.this.getRoute()).getBytes());
                return new ByteArrayInputStream(("fallback( code:" + Integer.toString(this.getRawStatusCode()) + "  message:" + this.getStatusText()+")").getBytes());

            }

            @Override
            public HttpHeaders getHeaders() {
                HttpHeaders headers = new HttpHeaders();
                headers.setContentType(MediaType.APPLICATION_JSON);
                return headers;
            }
        };
    }
}

2.修改pom文件:不然文件ZuulFallbackProvider找不到

Camden.SR1改爲Camden.SR3

3.在啓動類中:將這個類註冊成Javabean對象

 

4.啓動服務:ms-eureka-center(8761)、ms-eureka-provider(7901)、ms-zuul-consumer(8008)

 

關閉:ms-eureka-provider這個提供者:再次訪問

 三.ribbon的回退機制:

對於使用Ribbon組件的微服務,在使用Hystrix時,在需要設置退回響應的服務方法上添加@HystrixCommand註解,然後指定fallbackMethod參數指向的方法名即可:

四.fegin的回退機制:

對於使用Feign組件進行聲明式服務調用的服務,我們在相應的FeignClient接口的@FeignClient註解的fallback參數中指定其回退類(該退回類是該接口的實現類)即可

2.指定fallbackFactory參數,實現一個回退方法工廠類(工廠類的泛型是FeignClient接口):

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章