网关
前言
本文将介绍什么是微服务网关,为什么要用网关并以 Spring Cloud Gateway 为例介绍网关的作用和用途
什么是网关
是出现在系统边界上的一个面向 API 的、串行集中式的强管理服务,这里面的边界是企业 IT 系统的边界,可以理解为企业级应用防火墙
作用是将外部访问与内部系统隔离
API 网关是一个服务器,是系统对外的唯一入口。API 网关封装了系统内部架构,为每个客户端提供定制的 API。
所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理非业务功能
而 API 网关并非微服务场景中的必须组件,如下图:
不管有没有 API 网关,后端微服务均可以支持客户端的访问
但明显的是,当服务数量增加,随之复杂度也会增加,此时引入 API 网关也有如下好处:
- 聚合接口使得服务对调用者透明,客户端与后端的耦合度降低
- 聚合后台服务,节省流量,提高性能,提升用户体验
- 提供安全、流控、过滤、缓存、计费、监控等 API 管理功能
为什么要用网关
单体应用:浏览器发起请求到单体应用所在的机器,应用从数据库查询数据原路放回给浏览器,对于单体应用来说是不需要网关的
微服务:微服务的应用可能部署在不同的机房,不同地区,不同域名下。此时客户端想要请求对应的服务,都需要知道机器的具体 IP 或者域名 URL,当微服务实例众多时,对于客户端来说是非常难记忆的,也是非常难维护的。
有了网关的话,客户端相关的请求直接发送到网关,由网关根据标识解析判断出具体的微服务地址,再把请求转发到微服务实例,这其中就把“记忆”的功能交给了网关,也就降低了客户端与服务之间的耦合
Spring Cloud Gateway
官方文档:
https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html
核心概念
- 路由(Route):路由是网关最基础的部分,路由信息由 ID、目标 URI、一组断言和一组过滤器组成。如果断言路由为真,则说明请求的 URI 和配置相匹配
- 断言(Predicate):Java 8 中的断言函数。Spring Cloud Gateway 中的断言函数输入类型是 Spring 5.0 框架中的 ServerWebExchange。Spring Cloud Gateway 中的断言函数允许开发者去定义匹配来自于 Http Request 中的任何信息,比如请求头和参数等
- 过滤器(Filter):一个标准的 Spring Web Filter。Spring Cloud Gateway 中的 Filter 分为两种类型,分别是 Gateway Filter 和 Global Filter。过滤器将会对请求和响应进行处理
工作原理
如上图所示,其工作原理可以分为如下几步:
- 客户端向 Spring Cloud Gateway 发起请求
- 由网关映射处理器映射 Gateway Handler Mapping 确定与请求相匹配的路由,将其发送到网关 Web 处理程序 Gateway Web Handler
- 网关 Web 处理程序 Gateway Web Handler 通过指定的 pre 逻辑的过滤器链将请求发送到代理服务
- 代理服务 Proxied Service 发起代理请求
- 代理服务 Proxied Service 请求后将再次通过指定的 post 逻辑的过滤器链将返回结果发送到网关 Web 处理器 Gateway Web Handler
- 最后再到网关处理器映射 Gateway Handler Mapping
路由配置案例
路由规则
配置案例:
动态路由
动态路由案例:
但是此刻的路由访问不了 order-service,当然也可以通过再一次配置达到访问的目的:
但是显然,如果随着动态路由的数量增多,那么配置的内容也会随之增加,所以就要遵循约定大于配置,因此有了如下配置:
服务名称转发:
过滤器
为客户端请求的 URL 再次添加前缀、后缀或者替换等操作或为拦截的请求进行额外的业务操作
案例:
自定义网关过滤器设置:
自定义全局过滤器: