ToB企服应用市场:ToB评测及商务社交产业平台

标题: 玩转微服务-GateWay [打印本页]

作者: 乌市泽哥    时间: 2024-6-21 15:35
标题: 玩转微服务-GateWay
一. 背景

在微服务架构中,1个系统会被拆分为了很多个服务,每个服务之间需要相互调用,相互共同来完成整体的业务功能,那么如此举行调用,它就会存在以下几个题目:

微服务网关就可以解决以上题目,介于客户端与服务器之间的中间层,所有的外部哀求都会先经过微服务网关。客户端只需要与网关交互,简化了开辟同时兼具以下几个特点:
二. API网关

1. 概念


2. API网关定义

网关的角色是作为一个 API 架构,用来保护、加强和控制对于 API 服务的访问。

3. API网关的四大职能

**哀求接入:**作为所有 API 接口服务哀求的接入点,管理所有的接入哀求;
**业务聚合:**作为所有后端业务服务的聚合点,所有的业务服务都可以在这里被调用;
**中介计谋:**实现安全、验证、路由、过滤、流控,缓存等计谋,举行一些必要的中介处理;
**统一管理:**提供配置管理工具,对所有 API 服务的调用生命周期和相应的中介计谋举行统一管理。
4. API网关分类


面临互联网复杂的业务系统,基本可以将API网关分成两类:流量网关和业务网关。
**流量网关:**跟具体的后端业务系统和服务完全无关的部分,比如安全计谋、全局性流控计谋、流量分发计谋等。流量网关的功能跟 Web 应用防火墙(WAF)非常类似。WAF一般是基于 Nginx/OpenResty 的 ngx_lua 模块开辟的 Web 应用防火墙。
**业务网关:**针对具体的后端业务系统,或者是服务和业务有一定关联性的部分,并且一般被直接摆设在业务服务的前面。业务网关一般摆设在流量网关之后,业务系统之前,比流量网关更靠近系统。我们大部分环境下说的 API 网关,狭义上指的是业务网关。并且假如系统的规模不大,我们也会将两者合二为一,使用一个网关来处理所有的工作
5. 开源API网关先容

**Nginx+lua:**Open Resty、Kong、Orange、Abtesting gateway 等
**Java:**Zuul/Zuul2、Spring Cloud Gateway、Kaazing KWG、gravitee、Dromara soul 等
**Go:**Janus、fagongzi、Grpc-gateway
**Dotnet:**Ocelot
**NodeJS:**Express Gateway、Micro Gateway
6. 开源网关的选择

脱离场景谈性能,脱离业务谈架构,都是耍流氓。

三. Spring Cloud Gateway

Spring Cloud Gateway 是 SpringCloud 的一个全新项目,基于 Spring5、SpringBoot2 和 Project Reactor 等技术开辟的网关,它旨在提供一种简答有效的统一的 API路由管理方式。SpringCloud Gateway 作为 SpringCloud 生态系统中的网关,目的是代替 Zuul,在 SpringCloud 2.0 以上版本中,没有对新版本的 Zuul 2.0 以上的最新高性能版本举行集成,仍然还是使用的 Zuul 1.x 非 Reactor 模式的老版本,而为了提升网关的性能,SpringCloud Gateway 是基于 WebFlux 框架实现的,而 WebFlux 框架底层则使用了高性能的 Reactor 模式通信框架 Netty。SpringCloud Gateway 的目的提供统一的路由方式且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标和限流。
1. 文档地址

https://spring.io/projects/spring-cloud-gateway
2. 三个核心概念


3. 工作流程


客户端向 SpringCloud Gateway 发出哀求,然后在 Gateway Handler Mapping 中找到与哀求相匹配的路由,将其发送到 Gateway Web Handler。Handler 再通过指定的过滤器链来将哀求发送到我们现实的服务实行业务逻辑,然后返回。过滤器之间用虚线分开是因为过滤器可能会在发送代理哀求之前(“pre”)或之后(“post”)实行业务逻辑。Filter 在“pre”范例的过滤器中可以做参数校验、权限校验、流量监控、日志输出、协议转换等。在“post”范例的过滤器中可以做响应内容、响应头的修改,日志的输出,流量监控等。
4. 运行原理

4.1 路由原理


流程图如下:

GateWay接收哀求的流程如图所示
  1. 1. Gateway Client 向 Spring Cloud Gateway 发送请求
  2. 2. 请求首先会被Netty的服务端HttpServerHandle处理
  3. 3. 然后被HttpWebHandlerAdapter 进行提取组装成网关上下文,组装ServerWebExchange类型的exchange对象;ServerWebExchange是一个HTTP请求-响应交互的契约。存放着重要的请求-响应属性、请求实例和响应实例,提供对HTTP请求和响应的访问,并公开额外的服务器端处理相关属性和特性,如请求属性等等,有点像 Context 的角色。
  4. 4. 接着网关的上下文会传递到 DispatcherHandler ,它负责将请求分发给 RoutePredicateHandlerMapping
  5. RoutePredicateHandlerMapping 负责路由查找,并根据路由断言判断路由是否可用
  6. 如果过断言成功,由FilteringWebHandler 创建过滤器链并调用;
  7. 这个handler在Gateway启动时会将所有的 GlobalFilter 构建一个GatewayFilterAdapter(内部类),而GatewayFilterAdapter对象仅持有GlobalFilter接口方法,GatewayFilterAdapter对象在转换成OrderedGatewayFilter后也持有了getOrder方法,根据getOrder方法的返回值顺序组成ArrayList。处理请求时会调用DefaultGatewayFilterChain 用来处理filter,DefaultGatewayFilterChain 类持有了filter链;整个过滤链都是在这个过滤器中进行的,过滤器的执行顺序由order决定。
  8. 通过特定于请求的 Fliter 链运行请求,Filter可以在发送代理请求之前(pre)和之后(post)运行逻辑
  9. 执行所有pre过滤器逻辑,然后进行代理请求;发出代理请求后,将运行post过滤器逻辑。
  10. 处理完毕之后将 Response 返回到 Gateway 客户端。
复制代码
4.2 RouteLocator

一个Route重要包含以下几个属性:

Gateway重要通过接口RouteLocator接口来获取路由配置,RouteLocator代码如下:
  1. public interface RouteLocator {
  2.         Flux<Route> getRoutes();
  3. }
复制代码
在Gateway的源码中,RouteLocator的实现类重要有:RouteDefinitionRouteLocator、CompositeRouteLocator、CachingRouteLocator。它们之间的关系如下图所示:

RouteDefinitionLocator 提供RouteDefinition ,由 RouteDefinition 构造路由。可以存在多个RouteLocator ,这些实例提供的路由终极会由 CompositeRouteLocator 整合,再由 CachingRouteLocator 缓存。CachingRouteLocator 会把下层的 RouteLocator 返回的路由缓存起来,后续直接返回使用,同时监听RefreshRoutesEvent来定时革新缓存的路由。
5. Predicate 断言

Spring Cloud Gateway将路由匹配作为Spring WebFlux HandlerMapping基础架构的一部分。
Spring Cloud Gateway包括很多内置的Route Predicate工厂。所有这些Predicate都与HTTP哀求的差别属性匹配。多个Route Predicate工厂可以举行组合
Spring Cloud Gateway 创建 Route 对象时, 使用 RoutePredicateFactory 创建 Predicate 对象,Predicate 对象可以赋值给 Route。
所有这些 Predicate 都匹配HTTP哀求的差别属性。多种 Predicate Factory 可以组合,并通过逻辑 and。
内置断言:

6. 过滤器 Filter

路由过滤器可用于修改进入的HTTP哀求和返回的HTTP响应,路由过滤器只能指定路由举行使用。Spring Cloud Gateway 内置了多种路由过滤器,它们都由GatewayFilter的工厂类来产生。
6.1. 过滤器的生命周期

SpringCloud Gateway 的 Filter 的生命周期只有两个:“pre”和“post”。
PRE:这种过滤器在哀求被路由之前调用。我们可以使用这种过滤器实现身份验证、在集群中选择哀求的微服务、记录调试信息等。
POST:这种过滤器在路由到微服务以后实行。这种过滤器可用来为响应添加标准的 HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。
6.2 过滤器范例

SpringCloud Gateway 的 Filter 从作用范围可分为另外两种 GatewayFilter 和 GlobalFilter。

6.2.1 局部过滤器

局部过滤器(GatewayFilter),是针对单个路由的过滤器,可以对访问的 URL 过滤,举行切面处理。在 SpringCloud Gateway 中通过 GatewayFliter 的情势内置了很多差别范例的局部过滤器。这里简朴将 SpringCloud Gateway 内置的所有过滤器工厂整理成了一张表格,虽然不是很详细,但能作为速览使用。如下:
xxxxxxxxxxxxxxxxxxxxxx
每一个过滤器工厂都对应一个实现类,并且这些类的名称必须以 GatewayFilterFactory 末端,这是 SpringCloud Gateway 的一个约定,例如 AddRequestHeader 对应的实现类为 AddRequestHeaderGatewayFilterFactory。
6.2.3 全局过滤器

全局过滤器(GlobalFilter)作用于所有路由,SpringCloud Gateway 定义了 GlobalFilter 接口,用户可以自定义实现本身的 Global Filter。通过全局过滤器可以实现对权限的统一校验,安全性验证等功能,并且全局过滤器也是步伐员使用比较多的过滤器。
SpringCloud Gateway 内部也是通过一系列的内置全局过滤器对整个路由转发举行处理,如下:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4