》》》》》》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接口):

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