精通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原理及实战「Netflix系列之Hystrix」针对于限流熔断组件Hystrix的回退降级实现方案和机制