玩转微服务-GateWay

目录

  • 一. 背景
  • 二. API网关
    • 1. 概念
    • 2. API网关定义
    • 3. API网关的四大职能
    • 4. API网关分类
    • 5. 开源API网关介绍
    • 6. 开源网关的选择
  • 三. Spring Cloud Gateway
    • 1. 文档地址
    • 2. 三个核心概念
    • 3. 工作流程
    • 4. 运行原理
      • 4.1 路由原理
      • 4.2 RouteLocator
    • 5. Predicate 断言
    • 6. 过滤器 Filter
      • 6.1. 过滤器的生命周期
      • 6.2 过滤器类型
        • 6.2.1 局部过滤器
        • 6.2.3 全局过滤器

一. 背景

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

  • 每个服务中维护调用服务的信息,交互错杂,维护困难;
  • 每个服务需要进行身份认证,每个服务都需要进行独立认证;
  • 在某些场景下存在跨域的问题;
  • 服务之间耦合性较高,扩展及重构复杂;
  • 容易受到网络请求策略影响,访问上会有一定的问题。

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

  1. 易于监控,记录每个服务的请求信息,记录日志;
  2. 统一认证,认证通过后才可访问资源服务;
  3. 限制并避免了应用直接交互带来的管理问题。

二. API网关

1. 概念

  • API网关的观念其实和当前流行的SOA架构和微服务架构模式有关。在传统大型企业比较流行的SOA架构中,有一个企业服务总线(ESB)的概念,再ESB中融合了管理、注册、中介、编排、治理等功能,是一个访问高度频繁、功能高度集中的地方,因此常常也是性能瓶颈所在。而在微服务架构中,伴随着去中心化的理念,几乎没有EBS的的概念,分布式服务架构技术不再依赖于具体的服务中心容器技术( ESB),而是将服务寻址和调用完全分开,这样就不需要通过容器作为服务代理,在运行期实现最高效的直连调用。
  • 在微服务架构中,服务的粒度被进一步细分,各个业务服务可以被独立的设计、开发、测试、部署和管理。各个独立部署单元可以用不同的开发测试团队维护,可以使用不同的编程语言和技术平台进行设计,这就要求必须使用一种语言和平台无关的服务协议作为各个单元间的通讯方式。而REST API 由于其简单、高效、跨平台、易开发、易测试、易集成,成为了不二选择。此时如果都是采用客户端和服务器直连的话,那么此时系统就会出现大量的冗余代码和功能,维护起来工作量巨大,而且随着服务增多,出错性也大大的增加。因此一个类似综合前置的系统就产生了,这就是 API 网关(API Gateway)。API 网关作为分散在各个业务系统微服务的 API 聚合点和统一接入点,外部请求通过访问这个接入点,即可访问内部所有的 REST API 服务。

2. API网关定义

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

  • API 网关是一个处于应用程序或服务(提供 REST API 接口服务)之前的系统,用来管理授权、访问控制和流量限制等,这样 REST API 接口服务就被 API 网关保护起来,对所有的调用者透明。因此,隐藏在 API 网关后面的业务系统就可以专注于创建和管理服务,而不用去处理这些策略性的基础设施。
  • 通俗的说API网关中就是做一些通用的基础设施功能。类似AOP中的横切关注点概念,把业务系统中涉及的一些通用功能(日志分析、鉴权、路由等)抽取到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. 开源网关的选择

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

  • (1)Kong 的性能非常不错,非常适合做流量网关,并且对于 service、route、upstream、consumer、plugins 的抽象,也是自研网关值得借鉴的。对于复杂系统,不建议业务网关用 Kong,或者更明确的说是不建议在 Java 技术栈的系统深度定制 Kong 或 OpenResty,主要是工程性方面的考虑。毕竟维护lua脚本的工作量和成本不低。
  • (2)pring Cloud Gateway/Zuul2 对于 Java 技术栈来说比较方便,可以依赖业务系统的一些 common jar。Lua 不方便,不光是语言的问题,更是复用基础设施的问题。另外,对于网关系统来说,性能不是差一个数量级,问题不大,多加 2 台机器就可以搞定。
  • (3)目前来看 Zuul2 的坑还是比较多的,因此作为java技术栈,比较建议使用 Spring Cloud Gateway 作为基础骨架。

三. 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. 三个核心概念

  • Route(路由):路由是网关最基础的部分,路由信息由一个 ID、一个目的 URL、一组断言工厂和一组 Filter 组成。如果断言为真,则说明 请求 URL 和配置的路由匹配。

  • 断言(predicates):Java8 中的断言函数,SpringCloud Gateway 中的断言函数输入类型是 Spring 5.0 框架中的 ServerWebExchange。SpringCloud Gateway 中的断言函数允许开发者去定义匹配来自 HttpRequest 中的任何信息,比如请求头和参数等。

  • 过滤器(Filter):一个标准的 Spring WebFilter,SpringCloud Gateway 中的 Filter 分为两种类型,分别是 Gateway Filter 和 Global Filter。过滤器 Filter 可以对请求和响应进行处理

3. 工作流程

请添加图片描述

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

4. 运行原理

4.1 路由原理

请添加图片描述

流程图如下:

请添加图片描述

GateWay接收请求的流程如图所示

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

4.2 RouteLocator

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

请添加图片描述

Gateway主要通过接口RouteLocator接口来获取路由配置,RouteLocator代码如下:

public interface RouteLocator {Flux<Route> getRoutes();}

在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。

  • 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 内部也是通过一系列的内置全局过滤器对整个路由转发进行处理,如下:

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/22069.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[图解]建模相关的基础知识-02

1 00:00:01,530 --> 00:00:05,200 第2个概念&#xff0c;谓词&#xff0c;Predicate 2 00:00:07,530 --> 00:00:10,800 或者叫断言&#xff0c;翻译各种各样都有 3 00:00:12,830 --> 00:00:15,050 实际上就是前面命题 4 00:00:15,060 --> 00:00:16,610 相当于常…

记录Nuxt 3 官网项目的一次部署

本来以为就是一次简单的部署&#xff0c;之前也是部署过几次nuxt项目了&#xff0c;所以&#xff0c;并没有要记录的想法。但是过程出现了很多问题&#xff0c;最后考虑还是写下来吧。留个记录&#xff08;完整的配置部署过程&#xff09; 这里我将要说明两种部署方式以供选择&…

开源网安软件安全国产化替代解决方案亮相2024澳门万讯论坛

近日&#xff0c;2024万讯论坛在澳门成功举办。本次论坛由万讯电脑科技主办&#xff0c;旨在引进国内尖端科技厂商&#xff0c;提供全方位的信创解决方案&#xff0c;分享信创化过程中所面临的挑战及阶段性转换经验。开源网安作为拥有软件安全领域全链条产品的厂商&#xff0c;…

Analytical Model(分析模型)和Compact model(紧凑模型)有什么不同

Analytical Model&#xff08;分析模型&#xff09; 和 Compact Model&#xff08;紧凑模型&#xff09; 在电子工程和半导体物理领域有着不同的应用和特点&#xff1a; Analytical Model&#xff08;分析模型&#xff09;: 理论基础&#xff1a;分析模型基于物理原理和数学公…

jeecg dictText字典值

前端列表的字典值回显&#xff0c;配置了数据字典后&#xff0c;在本地测试可以回显中文的数据&#xff0c; 但在线上服务器不能正常回显出来&#xff1b; 原因是在前端拿到records的列表值时可以拿到dictText的字典&#xff0c;但是线上服务器没有dictText的值&#xff1b; …

聚焦 Navicat 17 新特性 | 模型设计优化与创新

随着 Navicat 17 的正式发布&#xff0c;受到了广泛的关注和讨论。Navicat 产品力又一次大跃迁。新引入的特性显著增强了用户的数据库管理和数据分析体验&#xff0c;包括&#xff1a;模型设计与同步、数据字典、数据分析&#xff08;data profiling&#xff09;、用户体验、查…

共享门店模式:快速打造连锁实体店

在数字化浪潮的冲击下&#xff0c;许多线下实体店正面临前所未有的挑战。然而&#xff0c;在这个变革的时代&#xff0c;共享门店模式&#xff0c;也被称为“共享股东”&#xff0c;正以其独特的魅力&#xff0c;为实体店带来新的生机。 一、共享门店模式的崭新定义 共享门店…

​水经微图Web版1.8.0发布

让每一个人都有自己的地图&#xff01; 水经微图&#xff08;简称“微图”&#xff09;新版已上线&#xff0c;在该版本中主要新增了注册登录功能&#xff0c;线与面图层新增矩形、圆或军标等绘制功能&#xff0c;以及其它功能的优化。 现在&#xff0c;为你分享一下本轮迭代…

PostgreSQL调优工具:PGTune

PostgreSQL调优工具&#xff1a;PGTune 1&#xff0c;PGTune网址 https://pgtune.leopard.in.ua/#/ 参数解释&#xff1a; DB Version&#xff1a;数据库版本 OS Type&#xff1a;操作系统 DB Type&#xff1a;数据库类型&#xff0c;一般默认即可 Total Memory (RAM)&#x…

巨详细Linux安装MySQL

巨详细Linux安装MySQL 1、查看是否有自带数据库或残留数据库信息1.1检查残留mysql1.2检查并删除残留mysql依赖1.3检查是否自带mariadb库 2、下载所需MySQL版本&#xff0c;上传至系统指定位置2.1创建目录2.2下载MySQL压缩包 3、安装MySQL3.1创建目录3.2解压mysql压缩包3.3安装解…

2 - 力扣高频 SQL 50 题(基础版)

2.寻找用户推荐人 考点: sql里面的不等于&#xff0c;不包含null -- null 用数字判断筛选不出来 select name from Customer where referee_id !2 OR referee_id IS NULL;

UML行为图-状态图

概述 创建 UML 状态图的目的是研究类、角色、子系统或组件的实时行为。状态图不仅可用于描述用户接口、设备控制器和其他具有反馈的子系统&#xff0c;还可用于描述在生命期中跨越多个不同性质阶段的被动对象的行为&#xff0c;在每一阶段该对象都有自己特殊的行为。 一、状态…

2024最全软件测试面试八股文(答案+文档+视频讲解)

Part1 1、你的测试职业发展是什么&#xff1f; 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前3年积累测试经验&#xff0c;按如何做好测试工程师的要点去要求自…

Python-3.12.0文档解读-内置函数zip()详细说明+记忆策略+常用场景+巧妙用法+综合技巧

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 详细说明 基本用法 示例 特性 高级用法 注意事项 版本更新 示例代码 记忆策略…

UI的学习(一)

UI的学习(一) 文章目录 UI的学习(一)UIlabelUIButtonUIButton的两种形式UIButton的事件触发 UIView多个视图之间的关系 UIWindowUIViewController一个视图推出另一个视图 定时器和视图移动UISwitchUISlider和UIProgressSlid步进器与分栏控制器UITextFieldUIScrollView有关实现它…

个人笔记-随意记录

常见问题&#xff1f; 1.linux重启服务 端口被占用如何解决&#xff1f; 查看某个端口被占用的进程 netstat -tulnp | grep :23454 强制杀死进程 kill -9 1776 重启服务即可

解决Chat打开时Unable to load conversation 的问题

在开梯子的情况下打开chat依然很卡&#xff0c;这里选择edge的浏览器无痕模式&#xff08;新建InPrivate窗口&#xff09;&#xff0c;在无痕窗口下打开chat就可以了。

python ---requests

python包管理工具 pip 若发现报错&#xff0c;则可以通过 -i 命令指定软件源 requests库安装 通过 pip &#xff0c;如上 或通过 pycharm 搜索 requests &#xff0c;并安装即可 下载成功的证明 requests库使用 模拟 http 重要参数如下 如何模拟发包 支持模拟各种 http meth…

SpringMVC:消息转换器

1. HttpMessageConvertor 简介 HttpMessageConverter是Spring MVC中非常重要的一个接口。翻译为&#xff1a;HTTP消息转换器。该接口下提供了很多实现类&#xff0c;不同的实现类有不同的转换方式。 转换器 如上图所示&#xff1a;HttpMessageConverter接口的可以将请求协议转…

基于ESP32-S3芯片的通用型无线模组方案,启明云端乐鑫一级代理商

随着物联网技术的飞速发展&#xff0c;智能设备正以前所未有的速度进入到我们的日常生活中&#xff0c;AIoT&#xff08;人工智能物联网&#xff09;已成为智能家居、智能设备、智能安防等领域的核心技术。 作为乐鑫一级代理商&#xff0c;基于ESP32-S3芯片&#xff0c;启明云…