SpringCloud Gateway
2021-10-27 16:27:34 39 举报
Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,取代Zuul网关。它基于Spring 5.0+Spring Boot 2.0和Project Reactor等技术开发,性能高于Zuul 10倍以上。Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。 Spring Cloud Gateway作为Spring Cloud生态系中的网关,目标是替代Netflix ZUUL,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。
作者其他创作
大纲/内容
处理handler流程
接口规范
WebHandlerorg.springframework.web.reactive.DispatcherHandler#handle接受请求 : 并且通过流式处理来确定步骤,这里一定要关注这里,不然容易被reactor绕晕。1. 获取处理器2. 如果处理器为空的情况3. 执行处理器4. 处理结果
org.springframework.cloud.gateway.filter.NettyWriteResponseFilter#filter结果返回给客户端
org.springframework.web.reactive.result.SimpleHandlerAdapter
LoadBalancerClientFilter : 负责重写请求路径,通过在注册中心获取地址然后根据负载均衡算法确定其中一台服务
org.springframework.cloud.gateway.route.RouteRefreshListener#onApplicationEvent负责消费HeartbeatEvent事件
GlobalFilter : 全局过滤器
1. 接受到请求之后,交给分发处理器。------------------------------ HandlerMapping ----------------------------2. 分发处理器负责根据URL来确定接下来要执行handler》 稍微解释下确认handler的场景:- 首先会从RouterFunctionMapping查找,这个是路由函数,可以自己做计算的,如果有定义那么尝试以它为主- 其次会从RequestMappingHandlerMapping查找,这个好理解,就好比你自己在服务中定义了controller的路径,默认从容器中消化掉- 然后会从注册中心查找RoutePredicateHandlerMapping,匹配路径。------------------------------- HandlerAdapter ------------------------------------3. 查找到对应的handler之后,需要执行- 这个时候通常会使用一个责任链模式,目的就是为了执行多数GatewayFilter。而我们要做的就是把一个个业务逻辑编写成一个个GatewayFilter让他们来处理,这里稍微要注意一下顺序。PS : 其中转发和结果都是以Filter来处理的。4. 后续还有一些关于结果集处理的,因为转发之后的结果也可能要改变。但是我目前调试的版本貌似没进行到这一步,而是在filter中也被处理了
上面最终会确定用哪个WebHandler去执行,cloud的话通常是FilteringWebHandler
org.springframework.cloud.gateway.filter.NettyRoutingFilter#filter最终的转发
以上操作属于计算请求,会将结果以键值对的方式存储到Request中的Attribute属性中,方便Filter中进行获取并改造。
org.springframework.cloud.gateway.route.CachingRouteLocator#onApplicationEvent负责消费RefreshRoutesEvent事件,并且缓存到本地
核心流程梳理
RoutePredicateHandlerMapping: 默认的映射器,会返回一个webHandler
到达网关
FilteringWebHandler : 链路handler处理器,负责执行一个个GatewayFilter过滤器
请求流程
执行handler
HandlerAdapter : 处理器适配
RouteLocatororg.springframework.cloud.gateway.handler.RoutePredicateHandlerMapping#getHandlerInternal获取内部处理逻辑: 1. 获取路由注册表2. 匹配传递进来的路径 : org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory#apply3. 确定转发的URL
执行FilteringWebHandler,先查找属性gatewayRoute得到Route对象,这个对象会持有GatewayFilter对象,并会将GlobalFilter对象适配成GatewayFilter对象,先执行拦截器
RouteLocator : 远程路径匹配器
HandlerMapping : 请求路径映射器
org.springframework.cloud.gateway.handler.FilteringWebHandler.DefaultGatewayFilterChain#filter拦截链执行
HandlerResultHandler: 得到结果集之后的后置处理
HttpHeadersFilter: 转发前的header处理器
org.springframework.cloud.netflix.eureka.CloudEurekaClient#onCacheRefreshedHeartbeatEvent
Request中的Attributes属性进行修改类型的拦截器
推送事件 : HeartbeatEvent
HandlerMappingorg.springframework.web.reactive.handler.AbstractHandlerMapping#getHandler接受请求
com.netflix.discovery.DiscoveryClient.CacheRefreshThread#run负责执行刷新工作com.netflix.discovery.DiscoveryClient#refreshRegistry
寻找handler
注册中心变更推送
HandlerMappingorg.springframework.cloud.gateway.handler.RoutePredicateHandlerMapping#getHandlerInternalspan style=\"font-size: inherit;\
http://localhost:5555/ELAB-DAMAI-USER/demo/login
com.netflix.discovery.DiscoveryClient#initScheduledTasks
推送一个RefreshRoutesEvent事件
GatewayFilter : 网关过滤器
WebHandler : web请求处理器
GatewayFilterAdapter强行适配
0 条评论
下一页