版本:2.2.9.RELEASE
一、基本介绍与简单使用
什么是网关?
网关是整个微服务 API 请求的入口,负责拦截所有请求,分发到服务上去。可以实现日志拦截、权限控制、解决跨域问题、限流、熔断、负载均衡,隐藏服务端的ip,黑名单与白名单拦截、授权等,常用的网关有 Zuul (netflix 已经停更)和 SpringCloud Gateway。SpringCloud Gateway是一个全新的项目,其基于 Spring5.0 以及 SpringBoot2.0 和 Webflux 等技术开发的网关,其主要的目的是为微服务架构提供一种简单有效的API路由管理方式。
名词解释
官方:
-
Route: 组成网关的最基本模块,由路由 ID(确保唯一)、目标 URI、predicates 与 filters 集合组成,如果 predicate 为 true,则表示路由匹配,并访问目标 URI。
-
Predicate: 这是一个 Java 8 的 Predicate,入参为 Spring 框架的 ServerWebExchange,可以使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数。
-
Filter: GatewayFilter 的实例,可以在发送下游请求之前或之后修改请求和响应。
白话:
元素 概念 作用 Route 网关的基本组成,由路由id(唯一)以及一系列的断言与过滤器组成 根据断言转发到对应的 uri 上,支持注册中心 Predicate 断言目前 SpringCloud Gateway 支持多种方式,常见如:Path、Query、Method、Header等,写法必须遵循 key=vlue的形式 路由转发的判断条件 Filter 过滤器是路由转发请求时所经过的过滤逻辑 可用于修改请求、响应内容;如 日志记录获取请求与响应内容 Example application.yml
spring: cloud: gateway: routes: - id: reform-pinoint uri: lb://reform-pinpoint predicates: - Path=/app/pinpoint/** filters: - RewritePath=/app/pinpoint/(?<remaining>.*), /${ remaining}
上面配置的意思是当访问 http://localhost:18000/app/pinpoint/login 时,会被路由到 reform-pinpoint 服务的 login 接口。filters 配置了一个重写路径的方法,将原本访问 http://localhost:18000/app/pinpoint/login 的 URL 修改为 http://localhost:18000/login,否则如果 reform-pinpoint 没有 /app/pinpoint/login 这个 URI 时将会出现 404。
上面的配置有一点其实是有错误的,在 yml 文档中 $ 要写成 $\ ,因此 ${remaining} 应该改为 $\ {remaining}
更多配置请参考:Gateway Config
二、整体流程
-
请求处理流程 UML 图
从 UML 图可以看得出来 gateway 使用了与 Spring Mvc 类似的处理逻辑,即适配器模式;先从 Mapping 中匹配到适配器,然后使用适配器调用 handler。
-
官网流程图
-
针对路由的 UML 时序图
整体流程是:
- 请求从 DispatcherHandler 进来
- 循环遍历所有的 HandlerMapping 并找到合适的 Handler(可能有多个)
- 遍历所有的适配器 Adapter,找到能够支持执行 Handler 的适配器
- 通过适配器 Adapter 去执行 Handler
Talk is cheap. Show me the code.
@Override public Mono<Void> handle(ServerWebExchange exchange) { if (this.handlerMappings == null) { return createNotFoundError(); } // 遍历所有 HandlerMapping 并找到处理器适配器,再执行 handler return Flux.fromIterable(this.handlerMappings) .concatMap(mapping -> mapping