Spring Cloud【服务网关Gateway(三大核心概念、入门案例、路由规则 、Java API构建路由、动态路由、断言功能详解)】(六)

news2024/11/26 21:21:58

 

目录

服务网关Gateway_三大核心概念

服务网关Gateway_入门案例

服务网关Gateway_路由规则 

服务网关Gateway_Java API构建路由

服务网关Gateway_动态路由

服务网关Gateway_断言功能详解


服务网关Gateway_三大核心概念

路由(Route) 

这是网关的基本构建块。它由一个ID,一个目标URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配。

断言(predicate) 

输入类型是一个ServerWebExchange。我们可以使用它来匹配来自 HTTP请求的任何内容,例如headers或参数。

过滤(filter) 

可以在请求被路由前或者之后对请求进行修改。

举个例子: 你想去动物园游玩,那么你买了一张熊猫馆的门票,只能进入熊猫馆的区域,而不能去犀牛管瞎转。因为没有犀牛馆的门票,进不去,就算走到门口,机器也不能识别。这里门票就相当于请求URL,熊猫馆相当于路由,而门口识别门卡的机器就是断言。然后我进入熊猫馆里面看到工作人员我想很有可能是过滤器,结果还真是,他在我进入馆之前拿手持设备对我全身扫描看看有没有危险品(请求前改代码),并且在我出熊猫馆之后要求再次检察看看我是否携带熊猫出馆(请求后改动代码)。这个工作人员相当于过滤器。 

总结 

首先任何请求进来,网关都会把它们拦住。根据请求的URL把它们分配到不同的路由上,路由上面会有断言,来判断请求能不能进来。进来之后会有一系列的过滤器对请求被转发前或转发后进行改动。 具体怎么个改动法,那就根据业务不同而自定义了。一般就是监控,限流,日志输出等等。

实时效果反馈

1.服务网关Gateway中路由作用是____。

A 路径匹配

B 匹配请求内容

C 被路由前或者之后对请求进行修改

D 以上都是错误

2.服务网关Gateway中断言作用是____。

A 路径匹配

B 匹配请求内容

C 被路由前或者之后对请求进行修改

D 以上都是错误 

服务网关Gateway_入门案例

创建cloud-gateway-gateway9527工程

pom文件引入依赖 

<dependencies>
        <!--   引入网关Gateway依赖     -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
        </dependency>
    </dependencies>

新增application.yml

server:
 port: 9527
spring:
 cloud:
   gateway:
     routes:
        # 路由ID,没有固定规则但要求唯一,建议配合服务名
       - id: payment_provider
          # 匹配后提供服务的路由地址
         uri: http://localhost:8001
          # 断言
         predicates:
            # 路径相匹配的进行路由
           - Path=/payment/get/**

主启动类

@Slf4j
@EnableEurekaClient
@SpringBootApplication
public class GatewayMain {
    public static void main(String[] args) {
        SpringApplication.run(GatewayMain.class,args);
        log.info("********** GatewayMain 服务启动成功 *********");
   }
}

测试

启动注册中心 7001,7002

启动服务提供者8001

启动网关服务9527

请求http://localhost:9527/payment/index

 

服务网关Gateway_路由规则 

Gateway 的路由规则主要有三个部分,分别是路由、断言(谓词)和过滤器。 

路由

路由是 Gateway 的⼀个基本单元。

断言

也称谓词,实际上是路由的判断规则。一个路由中可以添加多个谓词的组合。 

 提示: 打个比方,你可以为某个路由设置⼀条谓词规则,约定访问路径的匹配规则为 Path=/bingo/*,在这种情况下只有以 /bingo 打头的请求才会 被当前路由选中。

过滤器 

Gateway 组件使用了⼀种 FilterChain的模式对请求进行处理,每⼀个服务请求(Request)在发送到目标标服务之前都要被⼀串 FilterChain处理。同理,在 Gateway接收服务响应(Response) 的过程中也会被 FilterChain 处理⼀把。 

 实时效果反馈

1.Spring Cloud Gateway 中断言主要作用_____。

A 判断规则

B 注册发现服务

C 过滤请求

D 以上都不是

服务网关Gateway_Java API构建路由

代码注入RouteLocator 

@Configuration
public class GatewayConfig {
    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){
        RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
        //设置路由
        routes.route("path_rote",r -> r.path("/guonei").uri("http://news.baidu.com
/guonei")).build();
        return routes.build();
   }
    
}

测试

 实时效果反馈

1.服务网关Gateway通过Java API构建时需要实现__接口构建路由规则。

A Route

B RouteLocator

C RouteLocatorBuilder

D Builder

服务网关Gateway_动态路由

默认情况下Gateway会根据注册中心的服务列表,以注册中心上微服务名为路径创建动态路由进行转发,从而实现动态路由的功能。 

<!-- 引入Eureka client依赖   -->
<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

添加yml配置

spring:
 cloud:
   gateway:
     routes:
        # 路由ID,没有固定规则但要求唯一,建议配合服务名
       - id: payment_provider
          # 匹配后提供服务的路由地址 lb后跟提供服务的微服务的名
         uri: lb://CLOUD-PAYMENT-PROVIDER
          # 断言
         predicates:
            # 路径相匹配的进行路由
           - Path=/payment/**

注意: 需要注意的是uri的协议lb,表示启用Gateway的负载均衡的功能。

服务提供者payemt8001和payment8002工程controller添加方法 

@Value("${server.port}")
private String port;
/**
* 测试动态负载均衡
* @return
*/
@GetMapping("lb")
public String lb() {
   return port;
}

测试  

1、启动eureka服务注册发现 7001,7002

2、启动服务提供者payment8001,8002

3、启动网关服务测试

 

实时效果反馈

1.服务网关Gateway配置中lb指__。

A 过滤器

B 路由

C 目标地址

D 提供服务的微服务的名 

服务网关Gateway_断言功能详解

一个请求在抵达网关层后,首先就要进行断言匹配,在满足所有断言之后才会进入Filter阶段。说白了Predicate就是一种路由规则, 通过Gateway中丰富的内置断言的组合,我们就能让一个请求找到对应的Route来处理。 

After路由断言 Factory 

After Route Predicate Factory采用一个参数——日期时间。在该日期时间之后发生的请求都将被匹配。

YML文件添加配置 

predicates:
   # 路径相匹配的进行路由
   - Path=/payment/**
   - After=2030-02-15T14:54:23.317+08:00[Asia/Shanghai]

注意: UTC时间格式的时间参数。

UTC时间格式的时间参数时间生成方法

public static void main(String[] args) {
    ZonedDateTime now = ZonedDateTime.now();
    System.out.println(now);
}

Before路由断言 Factory

Before Route Predicate Factory采用一个参数——日期时间。在该日期时间之前发生的请求都将被匹配。

YML文件添加配置

predicates:
   - Before=2030-02-15T14:54:23.317+08:00[Asia/Shanghai]

Between 路由断言 Factory

Between 路由断言 Factory有两个参数,datetime1和datetime2。 在datetime1和datetime2之间的请求将被匹配。datetime2参数的实际时间必须在datetime1之后。

predicates:
   - Between=2030-02-15T14:54:23.317+08:00[Asia/Shanghai],2030-02-15T14:54:23.317+08:00[Asia/Shanghai]

 Cookie路由断言 Factory

顾名思义,Cookie验证的是Cookie中保存的信息,Cookie断言和上面介绍的两种断言使用方式大同小异,唯一的不同是它必须连同属性值一同验证,不能单独只验证属性是否存在。

YML文件添加配置 

predicates:
    # 路径相匹配的进行路由
   - Cookie=username,zzyy

使用postman测试

Header路由断言 Factory 

这个断言会检查Header中是否包含了响应的属性,通常可以用来验证请求是否携带了访问令牌。

YML文件添加配置 

# 请求头要有X-Request-Id属性并且值为整数的正则表达
式
predicates:
 - Header=X-Request-Id, \d+

测试

Host路由断言 Factory 

Host 路由断言 Factory包括一个参数:host name列表。使用Ant 路径匹配规则, . 作为分隔符。访问的主机匹配http或者https, baidu.com 默认80端口, 就可以通过路由。 多个 , 号隔开。

YML文件添加配置 

predicates:
- Host=tong

Host文件新增配置

127.0.0.1 tong

Method路由断言 Factory

这个断言是专门验证HTTP Method的,在下面的例子中,我们把 Method断言和Path断言通过一个and连接符合并起来,共同作用于路由判断,当我们访问“/gateway/sample”并且HTTP Method是 GET的时候,将适配下面的路由。

YML文件添加配置 

spring:
 cloud:
   gateway:
     routes:
        # 路由ID,没有固定规则但要求唯一,建议配合服务名
       - id: payment_provider
          # 匹配后提供服务的路由地址
         uri: lb://CLOUD-PAYMENT-PROVIDER
          # 断言
         predicates:
            # 路径相匹配的进行路由
           - Path=/payment/**
           - Method=GET

Query路由断言 Factory

请求断言也是在业务中经常使用的,它会从ServerHttpRequest中的Parameters列表中查询指定的属性,有如下两种不同的使用方式。

 YML文件添加配置

spring:
 cloud:
   gateway:
     routes:
        # 路由ID,没有固定规则但要求唯一,建议配合服务名
       - id: payment_provider
          # 匹配后提供服务的路由地址
         uri: lb://CLOUD-PAYMENT-PROVIDER
          # 断言
         predicates:
            # 路径相匹配的进行路由
           - Path=/payment/**
            # 要有参数名称并且是正整数才能路由
           - Query=username,\d+

测试

实时效果反馈

1.服务网关Gateway中在该日期时间之后发生的请求都将被匹配, 使用路由断言。

A After

B Before

C Cookie

D Header

2.服务网关Gateway中检查Header中是否包含了响应的属性,使用路由断言。

A After

B Before 

C Cookie

D Header

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

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

相关文章

小程序自定义导航栏

效果图 代码 app.json文件下 "window":{"navigationStyle": "custom" //增加此属性},app.js文件 //计算高度 App({onLaunch() {wx.getSystemInfo({ // 获取设备信息success: (res) > {this.globalData.systeminfo res//导航栏let statusB…

springboot整合quartz通过数据库配置任务调度简单办法

简介 Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目&#xff0c;它可以与J2EE与J2SE应用程序相结合也可以单独使用。在java企业级应用中&#xff0c;Quartz是使用最广泛的定时调度框架。 在Quartz中的主要概念&#xff1a; Scheduler&#xff1a;调度任务…

C语言中文件的读写

不争输赢&#xff0c;只问对错 文章目录 一、文件的概述 二、什么是读写文件 三、文件处理的函数 1.文件的打开与关闭 2.文件的顺序读写 文件的顺序读写相关函数 scanf 和 printf 家族的对比及其区分 3.文件的随机读写 文件的随机读写函数 四、文件缓冲区 五…

【el-tree查询并高亮】vue使用el-tree组件,搜索展开并选中对应节点,高亮搜索的关键字,过滤后高亮关键字,两种方法

第一种&#xff08;直接展开并高亮关键字&#xff09; 效果图这样的&#xff0c;会把所有的有这些关键字的节点都展开 代码&#xff1a; 这里的逻辑就是通过递归循环把所有和关键字匹配的节点筛选出来 然后通过setCheckedKeys方法把他展开选中 然后通过filterReal把关键字高亮…

Hadoop——DataGrip连接MySQL|Hive

1、下载 DataGrip下载&#xff1a;DataGrip: The Cross-Platform IDE for Databases & SQL by JetBrains 2、破解 破解链接&#xff1a;https://www.cnblogs.com/xiaohuhu/p/17218430.html 3、启动环境 启动Hadoop&#xff1a;到Hadoop的sbin目录下右键管理员身份运行…

数学建模学习(2):数学建模各类常用的算法全解析

一、评价类算法 常见的评价算法 1.层次分析法 基本思想 是定性与定量相结合的多准则决策、评价方法。将决策的有关元素分解成 目标层、准则层和方案层 &#xff0c;并通过人们的 判断对决策方案的 优劣进行排序 &#xff0c;在此基础上进行定性和定量分析。它把人的思维过程…

预处理详解

目录 一、预定义符号 二、#define 1.认识#define 2.使用#define 2.1#define定义常量 2.2#define定义宏 2.3#define的替换规则 三、宏定义的其他内容 1.#和## 1.1# 1.2## 2.宏的副作用 3.宏的命名规则 4.undef 5.条件编译 一、预定义符号 #include<stdio.h> int…

通过FPGA实现基于RS232串口的指令发送并控制显示器中目标位置

目录 1.算法理论概述 串口通信模块 指令解析模块 位置控制模块 显示器驱动模块 2.部分核心程序 3.算法运行软件版本 4.算法运行效果图预览 5.算法完整程序工程 1.算法理论概述 通过FPGA实现基于RS232串口的指令发送并控制显示器中目标位置是一种常见的应用场景&#x…

双向不循环链表的认识和基础操作(节点创建,头插头删,尾插尾删,输出和逆置)

头定义&#xff1a; typedef char datatype[20];//datatypechar[20] typedef struct Node {//数据域 数据元素datatype data;//指针域 下一个节点地址struct Node* next;//指针域 上一个节点地址struct Node* prev; }*DoubleLink; 创建节点&#xff1a; DoubleLink create_n…

校园电气安全风险分析及预防措施 安科瑞 许敏

摘要:校园属于人员密集场所&#xff0c;若安全风险排查、管控不到位&#xff0c;可能导致安全事故发生&#xff0c;造成严重事故后果。校园电气设备设施引起的电气火灾和触电等事故&#xff0c;是构成校园安全威胁之一&#xff0c;笔者通过对校园发生的电气安全事故案例原因分析…

一次线上OOM问题的个人复盘

我们一个java服务上线后&#xff0c;偶尔会发生内存OOM(Out Of Memory)问题&#xff0c;但由于OOM导致服务不响应请求&#xff0c;健康检查多次不通过&#xff0c;最后部署平台kill了java进程&#xff0c;这导致定位这次OOM问题也变得困难起来。 最终&#xff0c;在多次review代…

react目录结构

比较全面的react目录结构。 目录详解 assets&#xff1a;放置原始资源文件。 components&#xff1a;存放全局组件。 contants&#xff1a;常量文件夹&#xff0c;存放常量。 i18n&#xff1a;i18n国际化&#xff0c;各种语言的翻译。 pages&#xff1a;页面文件夹。 r…

es添加索引命令行和浏览器添加索引--图文详解

一、添加索引 创建索引 curl -X PUT "localhost:9200/my-index-00001?pretty" 获取索引 curl -X GET "localhost:9200/my-index-000001?pretty" 获取全部的索引 curl -X GET "http://localhost:9200/_cat/indices?v" 获取索引映射 cur…

2023 Pycharm 给项目配置解释器 基于已经创建的conda虚拟环境

我在2019年开始使用Pycharm作为python的IDE&#xff0c;最近配置解释器时&#xff0c;法线网上的方法大概过时了&#xff0c;自己尝试了好多次才发现新版本的Pycharm的解释配置方法&#xff0c;故记于此 背景描述&#xff1a; 我是用conda管理环境的&#xff0c;我已经创建好一…

C++ 单例模式(介绍+实现)

文章目录 一. 设计模式二. 单例模式三. 饿汉模式四. 懒汉模式结束语 一. 设计模式 单例模式是一种设计模式 设计模式(Design Pattern)是一套被反复使用&#xff0c;多数人知晓的&#xff0c;经过分类的&#xff0c;代码设计经验的总结。 为什么要有设计模式 就像人类历史发展会…

Docker容器网络和资源管理控制

Docker容器网络 一、Docker 网络实现原理二、Docker 的网络模式网络模式详解&#xff1a;①host模式②container模式③none模式④bridge模式⑤自定义网络 三、资源控制Ⅰ、CPU资源控制Ⅱ、对内存使用的限制Ⅲ、对磁盘IO配额控制&#xff08;blkio&#xff09;的限制 一、Docker…

前端vue uni-app仿美团下拉框下拉筛选组件

在前端Web开发中&#xff0c;下拉筛选功能是一种非常常见的交互方式&#xff0c;它可以帮助用户快速选择所需的选项。本文将介绍如何利用Vue.js和uni-app框架来实现一个高效的下拉筛选功能。通过使用这两个强大的前端框架&#xff0c;我们可以轻松地创建具有响应式用户操作的下…

Hbuildx下载内置浏览器失败

问题描述 刚开始接触Hbulidx&#xff0c;在下载内置浏览器时&#xff0c;报错 " Hbulidx内置浏览器下载失败 " 原因分析 从网上搜索相关的解决方法&#xff0c;一般都是说检查网络&#xff0c;或者关闭杀毒软件。这并没有解决问题&#xff0c;所以&#xff0c;我就…

【C++】STL之容器适配器——使用deque适配stack和queue

个人主页&#xff1a;&#x1f35d;在肯德基吃麻辣烫 分享一句喜欢的话&#xff1a;热烈的火焰&#xff0c;冰封在最沉默的火山深处。 文章目录 前言一、什么是容器适配器&#xff1f;二、stack的基本函数和模拟实现三、queue的基本函数和模拟实现 四、deque4.1deque的底层结构…

如何解决 Git 合并冲突

在遇到合并冲突时&#xff0c;请不要惊慌。通过一些娴熟的技巧协商&#xff0c;你可以解决任何冲突。 假设你和我正在共同编辑同一个名称为 index.html 的文件。我对文件进行了修改&#xff0c;进行了提交&#xff0c;并将更改推送到 Git 远程仓库。你也对同一个文件进行了修改…