简介
为微服务架构提供简单,有效且统一的API路由管理方式。包括协议适配,安全策略,防刷,流量,监控日志等功能。
网关对外暴露的URL或者接口信息,统称为路由信息。
路由(rout)路由是网关最基础的部分,路由信息由一个ID,一个目的url,一组断言工厂和一组filter组成。如果路由断言为真,则说明请求的url和配置的路由匹配。
断言(Predicate)java8中的断言函数。Spring Cloud Gateway中的断言函数输入类型是Spring 5.0框架中的ServerWebExchange。断言函数允许开发者去定义匹配来自HttpRequest 中的任何信息,比如请求头和参数等等。
过滤器(filter)一个标准的Spring webFilter.Spring Cloud Gateway中的filter分为两种类型的filter,分别是Gateway Filter和Global Filter.过滤器会对请求和响应进行修改处理。
工作原理
Gateway的客户端会向Spring Cloud Gateway发起请求,请求首先会被HttpWebHandlerAdapter进行提取组装成网关的上下文,然后网关的上下文会传递到DispatcherHandler。DispatcherHandler是所有请求的分发处理器,DispatcherHandler主要负责分发请求对应的处理器,比如将请求分发到对应的RoutePredicateHandlerMapping(路由断言处理映射器)路由断言处理器主要用于路由的查找,以及找到路由后返回对应的FilterWebHandler。FilterWebHandler主要负责组装Filter链表并调用Filter执行一系列的Filter处理,然后把请求转到后端对应的代理服务处理,处理完毕之后,将Response返回到Gateway客户端。
基于服务发现的路由规则
如果把Gateway注册到Eureka上,通过网关转发服务调用,访问网关的URL是http://Gateway_HOST:Gateway_PORT/大写的serviceId/*,其中服务名默认必须是大写,否则会抛404错误,如果服务名要用小写访问,可以在属性配置文件里面加spring.cloud.gateway.discovery.locator.lowerCaseServiceId=true配置解决。
自定义Global Filter案例 鉴权
全局过滤器的处理逻辑是通过从Gateway的上下文ServerWebExchange对象获取authToken对应的值是否合法。
动态路由
网关中有两个重要的概念,路由配置和路由规则。路由配置是指配置某请求路径路由到指定的目的地址,而路由规则是指匹配到路由配置之后,再根据路由规则进行转发处理。Spring Cloud Gateway作为所有请求流量的入口,在实际生产环境中为了保证高可靠和高可用,以及避免重启,需要实现Spring Cloud Gateway动态路由配置,做到不重启网关就可以动态地对应路由的配置和规则进行增加,修改和删除。
Spring Cloud Gateway源码篇笔记
1.httpWebHandlerAdapter:构件组装网关请求的上下文
2.DispatcherHandler:所有请求的分发处理器,负责分发请求到对应的处理器
3.RoutePredicateHandlerMapping:路由断言处理映射器,用于路由的查找,以及找到路由后返回对应的WebHandler,DispatcherHandler会依次遍历HandlerMapping集合进行处理
4.FilteringWebHandler:创建过滤器链,使用Filter链表处理请求。RoutePredicateHandlerMapping找到路由后返回对应的FilterWebHandler后对请求进行处理,FilteringWebHandler负责组装Filter链表并调用Filter处理请求。
Gateway中ServerWebExchange(网关上下文)构件分析
1.入口HttpServerRequest和ServerResponse转换
把接收到的HttpServerRequest或者最终需要返回的HttpServerResponse包装转换为ReactorServerHttpRequest和ReactorServerHttpResponse
2.构造Spring Cloud gateway的上下文ServerWebExchange
HttpWebHandlerAdapter中,createExchange()方法将ServerHTTPRequest与ServerHttpResponse构建成网关上下文ServerWebExchange。
DispatcherHandler源码分析
DispatcherHandler实现了WebHandler和ApplicationContextAware接口,用于Http请求处理器/控制器的中央分发处理器,把请求分发给已经注册的处理程序处理。
DispatcherHandler的Handler执行顺序如下:
1.校验handlerMapping
2.遍历Mapping对应的Handler,并通过RoutePredicateHandlerMapping获取handler
3.通过handler对应的handlerAdapter对handler进行调用,即FilteringWebHandler与SimpleHandlerAdapter对应。
RoutePredicateHandlerMapping源码分析
RoutePredicateHandlerMapping的执行顺序是先通过路由定位器获取全部路由,然后通过路由断言过滤掉不匹配的路由信息,找到路由信息之后将路由信息设置到上下文中,最后返回gateway固定的webHandler,即FilteringWebHandler.
FilteringWebHandler源码分析
FilteringWebHandler的执行顺序是先构建一个包含全局过滤器的集合,获取上下文中的路由信息,然后将路由里的过滤器添加到集合中,对过滤器集合进行排序,通过过滤器集合组装Filter链并调用Gateway默认的Filter链,最后通过过滤器来处理请求并转发到代理服务中。