网关

前言

本文将介绍什么是微服务网关,为什么要用网关并以 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。过滤器将会对请求和响应进行处理

工作原理


如上图所示,其工作原理可以分为如下几步:

  1. 客户端向 Spring Cloud Gateway 发起请求
  2. 由网关映射处理器映射 Gateway Handler Mapping 确定与请求相匹配的路由,将其发送到网关 Web 处理程序 Gateway Web Handler
  3. 网关 Web 处理程序 Gateway Web Handler 通过指定的 pre 逻辑的过滤器链将请求发送到代理服务
  4. 代理服务 Proxied Service 发起代理请求
  5. 代理服务 Proxied Service 请求后将再次通过指定的 post 逻辑的过滤器链将返回结果发送到网关 Web 处理器 Gateway Web Handler
  6. 最后再到网关处理器映射 Gateway Handler Mapping

路由配置案例


路由规则


配置案例:


官网案例:
https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/#gateway-request-predicates-factories

动态路由

动态路由案例:


但是此刻的路由访问不了 order-service,当然也可以通过再一次配置达到访问的目的:


但是显然,如果随着动态路由的数量增多,那么配置的内容也会随之增加,所以就要遵循约定大于配置,因此有了如下配置:

服务名称转发:


过滤器

为客户端请求的 URL 再次添加前缀、后缀或者替换等操作或为拦截的请求进行额外的业务操作

官方文档:
https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/#gatewayfilter-factories

案例:


自定义网关过滤器设置:



自定义全局过滤器:



网关
https://huajframe.github.io/2022/08/17/Spring-Project/Spring-Cloud/网关/
作者
HuaJFrame
发布于
2022年8月17日
许可协议