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