渔樵耕读四人紧赶慢赶地开始了网关的设计和开发,他们倒也算劳逸结合,中间休息了,或到山涧里徒手抓鱼,或放开喉咙唱着歌,或摇头晃脑地吟几首诗,一日晚间,武三通躺在牛背上,看着天上的云层发呆。
“师弟,天上没月亮,也没嫦娥,发什么呆呀?” 朱子柳走过来道。
“师兄,最近不是在开发网关吗,有几处想不明白,正要请教呢?”
“你说。“朱子柳笑道。
”我看zuul的相关文档,还有那张图和表。” 武三通指着图示的位置。
spring cloud zuul核心过滤器:
类型顺序过滤器功能pre-3ServletDetectionFilter主要用来检测当前请求是通过Spring的DispatcherServlet处理运行,还是通过ZuulServlet来处理运行的pre-2Servlet30WrapperFilter主要为了将原始的HttpServletRequest包装成Servlet30RequestWrapper对象pre-1FormBodyWrapperFilter将符合要求的请求体包装成FormBodyRequestWrapper对象pre1DebugFilter标记调试标志,根据配置参数zuul.debug.request和请求中的debug参数来决定是否执行过滤器中的操作pre5PreDecorationFilter处理请求上下文供后续使用route10RibbonRoutingFilterserviceId请求转发route100SimpleHostRoutingFilterurl请求转发route500SendForwardFilterforward请求转发post0SendErrorFilter处理有错误的请求响应post500SendForwardFilter处理forwardpost1000SendResponseFilter处理正常的请求响应
武三通接着道:“我们开发主要做的不就是继承ZuulFilter,然后实现相关方法吗?这个ZuulFilter与servlet filter的好类似呀,这两者有什么区别吗?”
朱子柳嘿嘿笑道:“你是刚接触不久,时间长了,不久会知道,这两者还是大不一样的,zull filter当然可以用java写,有时候为了动态修改filter,zuul利用了groovy,它是一门基于jvm的语言,语法简单且和java很类似,,它是可以动态加载的,应用发布到线上后可以在不重启情况下对业务逻辑进行修改。你看示例代码。”
public class ExampleSurgicalDebugFilter extends ZuulFilter {
@Override
String filterType() {
return "pre"
}
@Override
int filterOrder() {
return 96
}
@Override
boolean shouldFilter() {
RequestContext.currentContext.getRequest().getRequestURI().matches("/api/test.*")
}
@Override
Object run() {
RequestContext.currentContext.routeHost = new URL("http://example.com");
if (HTTPRequestUtils.getInstance().getQueryParams() == null) {
RequestContext.getCurrentContext().setRequestQueryParams(new HashMap<String, List<String>>());
}
HTTPRequestUtils.getInstance().getQueryParams().put("debugRequest", ["true"])
RequestContext.currentContext.setDebugRequest(true)
RequestContext.getCurrentContext().zuulToZuul = true