Gateway核心架构

2023-09-11 12:40:45

1 Gateway核心架构

1.1 基本概念

        路由(Route) 是 gateway 中最基本的组件之一,表示一个具体的路由信息载体。主要定义了下面的几个信息:

  • id,路由标识符,区别于其他 Route。
  • uri,路由指向的目的地 uri,即客户端请求最终被转发到的微服务。
  • order,用于多个 Route 之间的排序,数值越小排序越靠前,匹配优先级越高。
  • predicate,断言的作用是进行条件判断,只有断言都返回真,才会真正的执行路由。
  • filter,过滤器用于修改请求和响应信息。

1.2 执行流程

执行流程大体如下:
(1) Gateway Client向Gateway Server发送请求
(2) 请求首先会被HttpWebHandlerAdapter进行提取组装成网关上下文
(3)然后网关的上下文会传递到DispatcherHandler,它负责将请求分发RoutePredicateHandlerMapping
(4) RoutePredicateHandlerMapping负责路由查找,并根据路由断言判断路由是否可用
(5)如果过断言成功,由FilteringWebHandler创建过滤器链并调用

(6)请求会一次经过PreFilter--微服务--PostFilter的方法,最终返回响应

2 断言

Predicate(断言, 谓词) 用于进行条件判断,只有断言都返回真,才会真正的执行路由。
断言就是说: 在 什么条件下 才能进行路由转发

2.1 内置路由断言工厂

        SpringCloud Gateway包括许多内置的断言工厂,所有这些断言都与HTTP请求的不同属性匹配。具体如下:

  • 基于Datetime类型的断言工厂

        此类型的断言根据时间做判断,主要有三个:
        AfterRoutePredicateFactory: 接收一个日期参数,判断请求日期是否晚于指定日期
        BeforeRoutePredicateFactory: 接收一个日期参数,判断请求日期是否早于指定日期
        BetweenRoutePredicateFactory: 接收两个日期参数,判断请求日期是否在指定时间段内

-After=2019-12-31T23:59:59.789+08:00[Asia/Shanghai]

  • 基于远程地址的断言工厂 RemoteAddrRoutePredicateFactory:接收一个IP地址段,判断请求主机地址是否在地址段中

-RemoteAddr=192.168.1.1/24

  • 基于Cookie的断言工厂
    CookieRoutePredicateFactory:接收两个参数,cookie 名字和一个正则表达式。 判断请求
    cookie是否具有给定名称且值与正则表达式匹配。
-Cookie=chocolate, ch.
  • 基于Header的断言工厂
    HeaderRoutePredicateFactory:接收两个参数,标题名称和正则表达式。 判断请求Header是否具有给定名称且值与正则表达式匹配。
-Header=X-Request-Id, \d+
  • 基于Host的断言工厂
    HostRoutePredicateFactory:接收一个参数,主机名模式。判断请求的Host是否满足匹配规则。
-Host=**.testhost.org
  • 基于Method请求方法的断言工厂
    MethodRoutePredicateFactory:接收一个参数,判断请求类型是否跟指定的类型匹配。
-Method=GET
  • 基于Path请求路径的断言工厂
-Path=/foo/{segment}


PathRoutePredicateFactory:接收一个参数,判断请求的URI部分是否满足路径规则。

  • 基于Query请求参数的断言工厂
    QueryRoutePredicateFactory :接收两个参数,请求param和正则表达式, 判断请求参数是否具有给定名称且值与正则表达式匹配。
-Query=baz, ba.
  • 基于路由权重的断言工厂
    WeightRoutePredicateFactory:接收一个[组名,权重], 然后对于同一个组内的路由按照权重转发
routes:
-id: weight_route1 uri: host1 predicates:
-Path=/product/**
-Weight=group3, 1
-id: weight_route2 uri: host2 predicates:
-Path=/product/**
-Weight= group3, 9

内置路由断言工厂的使用
接下来我们验证几个内置断言的使用:

server:
port: 7000
spring:
application:
 name: api-gateway
cloud:
 nacos:
  discovery:
   server-addr: 127.0.0.1:8848
 gateway:
  discovery:
   locator:
    enabled: true
  routes:
   - id: product_route
    uri: lb://service-product
    predicates:
     - Path=/product-serv/**
     - Before=2019-11-28T00:00:00.000+08:00 #限制请求时间在2019-11-28之前
     - Method=POST #限制请求方式为POST
    filters:
     - StripPrefix=1

更多推荐

[2023.09.21]:源码已上传,供大家了解Rust Yew的前后端开发

这个资源是Rust的源代码压缩包,供大家了解RustYew的前后端开发。资源中的代码非常简洁易懂,虽然离商用场景还有一段距离,但是涵盖了前端的组件搭建、事件通信和反向代理,以及后端的RestfulAPI的路由、功能实现和数据库访问。此外,还包括了postgres数据库的初始化脚本和docker部署脚本,方便您快速搭建环

前端版本更新提示

前端版本更新提示前言:最近项目发布比较频繁、导致每次都要主动告知用户/测试去刷新清除页面缓存、从而防止发了新功能之后、用户因为没有刷新页面/清除缓存,一直使用的还是旧版本。所以就着手写一个检测到发布了新版本就自动提醒用户去刷新页面的功能。一、思路:我们可以通过每次打包构建(npmrunbuild)之后给包打一个唯一标识

企业为什么做数字化转型?

数字化转型是一个战略性的、势在必行的过程,企业利用技术和数字工具从根本上改变其运营方式,为客户提供价值,并在现代商业环境中保持竞争力。企业踏上数字化转型之旅有几个令人信服的理由:1.提高效率和生产力:数字工具和自动化可以简化流程、减少手动工作并提高整体运营效率。这使得组织能够用更少的资源做更多的事情并更有效地分配资源。

进程同步与互斥

目录进程同步与互斥(1)第一节、进程间相互作用一、相关进程和无关进程二、与时间有关的错误第二节、进程同步与互斥一、进程的同步二、进程的互斥三、临界区进程同步与互斥(2)三、信号量与P、V操作的物理含义四、用P、V操作实现进程间的互斥五、用P、V操作实现进程间的同步六、信号量及P、V操作总结进程同步与互斥(3)第四节经典

MyBatis基础之动态SQL

文章目录动态SQLif元素choose-when-otherwise元素where元素set元素foreach元素动态SQL简而言之,动态SQL就是在Mapper中使用分支、循环等逻辑。常见的动态SQL元素包括:if元素choose-when-otherwise元素where元素set元素foreach元素if元素<i

第二章 物理层

引言如果这篇文章对您有帮助的话,希望您能点赞、收藏、加关注!您的鼓励就是我前进的动力!本文所参考的教材为:谢希仁.计算机网络.北京:电子工业出版社,2021.重要知识点总结三种通信方式:单向通信、双向交替通信、双向同时通信。两大类调制:基带调制(编码),带通调制。常用的四种编码方式:不归零制、归零制、曼彻斯特编码、差分

Jenkins :添加node权限获取凭据、执行命令

拥有Jenkinsagent权限的账号可以对node节点进行操作,通过添加不同的node可以让流水线项目在不同的节点上运行,安装Jenkins的主机默认作为master节点。1.Jenkins添加node获取明文凭据通过添加node节点,本地监听ssh认证,选则凭据(明文)进行ssh认证,拿到密码。1.新建节点-man

在 Vue3 项目中如何关闭 ESLint

介绍ESLint是一个用于检查JavaScript代码质量的工具,它可以帮助开发者遵循一致的编码规范,并发现潜在的错误和问题。然而,在某些情况下,我们可能希望关闭ESLint,例如在一些小型项目中或者在特定的开发阶段。本文将介绍如何在Vue3项目中关闭ESLint。步骤第一步:找到配置文件在Vue3项目中,ESLint

Android Studio导入aosp源码

1、在Ubuntu系统下,进入源码根目录,运行如下命令:sourcebuild/envsetup.sh#初始化环境变量。lunchsdk_phone_x86_64makeidegen-j6#六核编译idegen模块忽略此命令:mmmdevelopment/tools/idegen/#此命令可以不执行(同makeideg

竞赛 基于机器视觉的行人口罩佩戴检测

简介2020新冠爆发以来,疫情牵动着全国人民的心,一线医护工作者在最前线抗击疫情的同时,我们也可以看到很多科技行业和人工智能领域的从业者,也在贡献着他们的力量。近些天来,旷视、商汤、海康、百度都多家科技公司研发出了带有AI人脸检测算法的红外测温、口罩佩戴检测等设备,依图、阿里也研发出了通过深度学习来自动诊断新冠肺炎的医

DockerCompose

DockerComposeDockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器!初识DockerComposeCompose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。格式如下:version:"3.8"services:mysql:image:m

热文推荐