如何自定义zuul网关请求重发规则,首先需弄清楚框架的执行逻辑,https://cloud.tencent.com/developer/article/1034753 这篇文章解读的还不错
zuul也可通过路由,服务,错误码来配置指定重发对象。
-
zuul既定的过滤器:
数字代表顺序,数字越小,加载顺序级别越高。分别对应ZuulFilter核心过滤器中的filterType / filterOrder 值类型 顺序 过滤器 功能 pre (前置过滤器类型) -3 ServletDetectionFilter 标记处理Servlet的类型 pre -2 Servlet30WrapperFilter 包装HttpServletRequest请求 pre -1 FormBodyWrapperFilter 包装请求体 pre 1 DebugFilter 标记调试标志 pre 5 PreDecorationFilter 处理请求上下文供后续使用 route (路由类型) 10 RibbonRoutingFilter serviceId 请求转发 route 100 SimpleHostRoutingFilter url请求转发 route 500 SendForwardFilter forward请求转发 error (错误处理过滤器类型) 0 SendErrorFilter 处理有错误的请求响应 post (后置过滤器类型) 1000 SendResponseFilter 处理正常的请求响应 -
自定义重发请求规则
这里通过继承ZuulFilter来实现。思路是当前会话加载请求重发过滤器之前,截取配置的请求重发规则,对规则进行篡改,实现自定义规则开启或关闭请求重发。
获取到当前会话的RequestContext 内容,然后修改“retryable”属性值,再塞回去@component public class ResendRuleFilter extends ZuulFilter{ @Override public String filterType(){ //前置过滤器类型 return PER_TYPE; } @Override public String filterOrder(){ //优先级要在route之前,在PreDecorationFilter加载之后 return 7; } @Override public boolean shouldFilter(){ //是否加载这个过滤器 return true; } //方法执行体 @Override public Object run(){ RequestContext ctx = RequestContext.getCurrentContext(); /**自定义规则决定什么业务开启重发,什么关闭重发, **/ //关闭请求重发 ctx.set("retryable",false); //返回了也不会搭理你 return null; } }