SpringCloud学习笔记(三)-网关Zuul(下)

简介: Zuul在SpringCloud中起到网关的作用,可用于请求路由转发、过滤、安全检查等作用,通过@EnableZuulProxy来开启网关的配置。

3:控制器


Http请求被控制器拦截后交给ZuulServlet处理。

@Bean
public ZuulController zuulController() {
        return new ZuulController();
}


执行顺序越小会越先执行,所有pre过滤器执行完成,才会执行route过滤器,同样所有的post过滤器都会再route过滤器之后执行。(zuulFileter的compareTo方法会比较Order大小,执行过程中,从注册的过滤器列表中获取到相关类型的过滤器,根据优先级从小到大排序。)


image.png


大概整理了下zuul自带的一些过滤器


过滤器类型 名称 执行顺序 功能
pre ServletDetectionFilter -3 判断请求头来源是zuulServlet还是DispatcherServlet,决定后续的处理机制
pre FormBodyWrapperFilter -1 解析表单数据重新包装,提供给下游服务使用
pre DebugFilter 1 是否开启调试标志
pre Servlet30WrapperFilter -2 包装为符合servlet3.0规范的请求体
pre PreDecorationFilter 5 路由转发前基本信息配置
post SendResponseFilter 1000 处理正常的请求响应
error SendErrorFilter 0 错误请求响应,早起版本是post的一种,新版本单独列为一种
post LocationRewriteFilter 900 重写位置头信息为zuul url
route SendForwardFilter 500 处理内部转发
route RibbonRoutingFilter 10 使用Ribbon, Hystrix转发请求
route SimpleHostRoutingFilter 100 普通请求转发


二、ZuulServlet执行过程


前面说过ZuulServlet是Http请求的处理入口,类似用SpringMVC的请求转发器DispatcherServlet,当有Http请求到来时,会先交给ZuulServlet。


ZuulServlet继承HttpServlet,所以大概过程也是初始化-调用service()-销毁。


从service方法可以看出,按pre过滤器-route过滤器-postRoute顺序执行,如果出现错误会调用filterType为error的过滤器处理。


前置过滤器出现错误,会调用error过滤器处理后再交给post过滤器处理。


route过滤器出现错误,也是会先调用error过滤器处理再交给post过滤器处理。


而当post过滤器出现错误,直接调用error过滤器处理,结束流程。

public class ZuulServlet extends HttpServlet {
    private static final long serialVersionUID = -3374242278843351500L;
    private ZuulRunner zuulRunner;
    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        String bufferReqsStr = config.getInitParameter("buffer-requests");
        boolean bufferReqs = bufferReqsStr != null && bufferReqsStr.equals("true") ? true : false;
        zuulRunner = new ZuulRunner(bufferReqs);
    }
    @Override
    public void service(javax.servlet.ServletRequest servletRequest, javax.servlet.ServletResponse servletResponse) throws ServletException, IOException {
        try {
            init((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse);
            // Marks this request as having passed through the "Zuul engine", as opposed to servlets
            // explicitly bound in web.xml, for which requests will not have the same data attached
            RequestContext context = RequestContext.getCurrentContext();
            context.setZuulEngineRan();
            try {
                preRoute();
            } catch (ZuulException e) {
                error(e);
                postRoute();
                return;
            }
            try {
                route();
            } catch (ZuulException e) {
                error(e);
                postRoute();
                return;
            }
            try {
                postRoute();
            } catch (ZuulException e) {
                error(e);
                return;
            }
        } catch (Throwable e) {
            error(new ZuulException(e, 500, "UNHANDLED_EXCEPTION_" + e.getClass().getName()));
        } finally {
            RequestContext.getCurrentContext().unset();
        }
    }
...
}


所有过滤器的执行都是通过FilterProcessor来完成,这是过滤器执行的核心类,FilterProcessor是一个单例对象,会根据传入的过滤器类型,获取相关过滤器,根据order排序后依次执行。


相关文章
|
19天前
|
算法 NoSQL API
SpringCloud&Gateway网关限流
SpringCloud&Gateway网关限流
41 7
|
1月前
|
缓存
SpringCloud Gateway 网关的请求体body的读取和修改
SpringCloud Gateway 框架中,为了处理请求体body,实现多次读取与修改,创建了一个名为`RequestParamGlobalFilter`的全局过滤器。这个过滤器使用`@Component`和`@Slf4j`注解,实现了`GlobalFilter`和`Ordered`接口,设置最高优先级以首先读取body。它通过缓存请求体并创建装饰过的`ServerHttpRequest`来实现body的动态获取。
67 4
|
5天前
|
负载均衡 Java 网络架构
在SpringCloud2023中快速集成SpringCloudGateway网关
本文主要简单介绍SpringCloud2023实战中SpringCoudGateway的搭建。后续的文章将会介绍在微服务中使用熔断Sentinel、鉴权OAuth2、SSO等技术。
30 2
在SpringCloud2023中快速集成SpringCloudGateway网关
|
2月前
|
SpringCloudAlibaba Java 持续交付
【构建一套Spring Cloud项目的大概步骤】&【Springcloud Alibaba微服务分布式架构学习资料】
【构建一套Spring Cloud项目的大概步骤】&【Springcloud Alibaba微服务分布式架构学习资料】
195 0
|
20天前
|
Java Nacos 开发者
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
|
1月前
|
开发框架 负载均衡 Java
Spring boot与Spring cloud之间的关系
总之,Spring Boot和Spring Cloud之间的关系是一种构建和扩展的关系,Spring Boot提供了基础,而Spring Cloud在此基础上提供了分布式系统和微服务架构所需的扩展和工具。
23 4
Spring boot与Spring cloud之间的关系
|
1月前
|
Java Maven 微服务
使用Spring Cloud Gateway构建微服务网关
以上简要示例介绍了使用Spring Cloud Gateway构建微服务网关的基本步骤,包括添加依赖、配置路由、编写过滤器等。通过配置和自定义过滤器,可以实现请求转发、过滤、鉴权等功能。
51 5
|
2月前
|
SpringCloudAlibaba 负载均衡 Java
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(目录大纲)
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(目录大纲)
71 1
|
2月前
|
Java Nacos Sentinel
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(九)Nacos+Sentinel+Seata
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(九)Nacos+Sentinel+Seata
237 0
|
2月前
|
消息中间件 SpringCloudAlibaba Java
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(八)Config服务配置+bus消息总线+stream消息驱动+Sleuth链路追踪
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(八)Config服务配置+bus消息总线+stream消息驱动+Sleuth链路追踪
790 0