精通springcloud:提供Hystrix回退bean

Posted jinggege795

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了精通springcloud:提供Hystrix回退bean相关的知识,希望对你有一定的参考价值。

提供Hystrix回退bean

开发人员可能需要为Zuul配置中定义的每个路由提供在电路断开情形下的回退响应。要完成此任务,应该创建一个ZulFallbackProvider (目前已弃用)类型的bean或FallbackProvider.在该实现中,必须指定路由ID模式以匹配应该由回退bean处理的所有路由。第二步则是返回ClientHtpResponse 接口的实现作为fllbackResponse 方法中的响应。

以下就是一个简单的回退bean示例,它将每个异常映射到HTTP状态200OK,并在JSON响应中设置errorCode和errorMessage.该回退将仅对account-service 服务的路由执行。
public class AccountFallbackProvider implements FallbackProvider {
@Override
public String getRoute() 4
return "account-service";
@Override
public ClientHttpResponse fallbackResponse (Throwable cause)(
return new ClientHttpResponse() (
@override
public HttpHeaders getHeaders(){
HttpHeaders headers - new HttpHeaders();
headers . setContentType (MediaType . APPLICATION JSON);
return headers;
@Override 
public InputStream getBody() throws IOException {
AccountFallbackResponse response ! = new
AccountFallbackResponse("1.2". cause.getMessage)) :
return new ByteArrayInputstream (new
ObjectMapper 0) .writevalueAsBytes (response)) ; 
@Override
public String getStatusText() throws IOException {
return "OK";
@Override
public HttpStatus getStatusCode() throws IOException {
return HttpStatus.OK;

}
@Override
public int getRawStatusCode() throws IOException{

return 200;

}
@override 
 public void close (){
          }

    };

}

//...

}
 

Zuul 过滤器

如前文所述,Spring Cloud Zuul默认提供了若干bean,它们是ZulFilter接口的实现。通过将zul.<SimpleClassName.filterType> disable属性设置为true,可以禁用每个内置过滤器。例如,要禁用orgspringfamework. cloud.netix zu.flters. post. SendResponseFilter就必须设置zuul.SendResponse Filter. post. disable-true.

 

开发人员对HTTP过滤机制可能会很熟悉。过滤器将动态拦截请求和响应,以转换或仅使用从HTTP消息中获取的信息。它可以在传入请求或传出响应之前或之后触发。我们可以确定Zuul为Spring Cloud提供的以下几种类型的过滤器。

口预处理过滤器(Pre Filter) :用于在RequestContext中准备初始数据,以便在下游过滤器中使用。主要职责是设置路由过滤器所需的信息。

口路由过滤器( Route Filter):在预过滤器之后调用,负责创建对其他服务的请求。使用它的主要原因是需要使请求或响应适应客户端所需的模型。

口后处理过滤器(Post Filter) :最为常见,它将操纵响应,甚至可能转换响应的正文。

口错误过滤器(Error Filter) :仅在其他过滤器抛出异常时执行。它只有一个内置的错误过滤器实现。如果RequestContext. getThrowable0不为nul,则执行SendErrorFilter.

1.预定义的过滤器

如果使用@EnablezuulProxy注解main 类,则Spring Cloud Zuul 会加载SimpleRouteLocator 和DiscoveryClientRouteLocator使用的过滤器bean.以下是作为普通Spring bean安装的最重要实现的列表。
口ServletDetectinilter: 这是一个 预处理过滤器。它将检查请求是否通过SpringDispatcher,然后它会使用FiterConstants.IS_ DISPATCHER SERVLET_REQUEST_ KEY键设置- -个布尔值。

口FormBodyWrapperFilter: 这是-个预处理过滤器。它将解析表单数据并为下游请求重新编码。

口PreDecorationFilter: 这是一个预处理过滤器。它将根据提供的RouteLocator 确定路由的位置和方式。它还负责设置与代理相关的标头。

口SendForwardFiter: 这是- -个路由过滤器。它将使用RequestDispatcher转发请求。

口RibbonRoutingFilter:这是一个路由过滤器。它将使用Ribbon. Hystrix 和外部HTTP客户端(如Apache HttpClient. OkHtpClient 或Ribbon HTTP客户端)发送请求。服务ID取自请求上下文。

口SimpleHostRoutingFilter: 这是一个路由过滤器。它通过Apache HTTP客户端发送请求到URL。URL位于请求上下文中。

口SendResponseFilter: 这是一个后处理过滤器。它会将代理请求的响应写入当前响应。

2.自定义过滤器实现

除了默认安装的过滤器之外,开发人员还可以创建自定义实现。每个自定义的过滤器都必须实现ZulFiter接口及其4种方法。这些方法负责设置过滤器的类型( flterType)、确定具有相同类型的其他过滤之间的过滤器执行顺序( filterOrder)、启用或禁用过滤器(shouldFilter)以及过滤器逻辑实现(run) 。以下就是一个将X-Response-ID标头添加到响应的示例实现。

public class AddRe sponseIDHeaderFilter extends ZuulFilter {

private int id一1;

@override

public String filterType() {

return "post";

}

@override

public int filterorder() {

return 10;

}

@Override

public boolean shouldFilter() (

return true;

}

@Override

public object run() {

RequestContext context 一RequestContext .getCurrentContext0 ;

HttpServletResponse servletResponse = context .getResponse() ;

servletResponse. addHeader ("X- Response-ID",

String.value0f(id++1);

return null;

      }

}

这并不是全部。事实上,自定义过滤器实现也应该在main类或Spring配置类中声明为@Bean.

@Bean

AddResponseIDHeaderFilter filter() {

return new AddResponseIDHeaderFilter();

}

总结

因为文章包含的内容实在是太多了,就不给大家做过多的介绍了,需要这份文档来学习的小伙伴,可以转发此文关注小编。

扫码来获取就可以了!

以上是关于精通springcloud:提供Hystrix回退bean的主要内容,如果未能解决你的问题,请参考以下文章

精通springcloud:故障和带有Feign的断路器模式

SpringCloud 断路器之Hystrix

深入浅出SpringCloud原理及实战「Netflix系列之Hystrix」针对于限流熔断组件Hystrix的回退降级实现方案和机制

SpringCloud之Hystrix容错处理

精通springcloud:微服务之间的通信,监控延迟和容错

springCloud(16):使用Zuul构建微服务网关-容错回退与高可用