【应用】SpringCloud -- Gateway

news2024/12/21 20:18:18

SpringCloud -- Gateway

  • Gateway 网关概述
    • Gateway 的功能
    • Gateway 核心概念
  • Gateway 网关搭建
  • Gateway 的配置及使用
    • predicate 断言
    • filter 过滤器
    • GlobalFilter 全局过滤器
  • Gateway 的几点问题
    • 过滤器执行顺序
    • 跨域问题

Gateway 网关概述

Gateway 的功能

在微服务当中,有很多的服务需要进行维护,不同服务都维护着不同的 ip 和路径。为了可以对各种杂乱的服务进行统一的分配和管理,研究人员便研究出 Gateway 网关。网关相当于我们的服务群的统一入口,所有外部的请求都必须通过这个“大门”,并在网关的指导下顺利访问到相应的服务。

Spring Cloud GateWay 基于 Spring5.0 + SpringBoot2.0 + WebFlux 等技术开发,性能高于Zuul,其不仅提供统一的路由方式,还基于 Filter 链的方式提供了网关基本的功能,如鉴权、流量控制、熔断、路径重写、日志监控等。

Gateway 核心概念

  • 路由 route:路由是网关中的核心,所有的配置都在一个路由中进行,路由的信息包括 ID、目的 URL、一组断言工厂以及一过滤器;

  • 断言 predicates:断言定义了 URL 的匹配规则,若断言为真,则当前请求符合该路由规则,规则中的配置则会对该请求生效,断言函数可以由开发者自定义;

  • 过滤器 Filter:过滤器可以对请求和响应进行处理,也可以由开发者自定义;

Gateway 网关搭建

在前文所述的项目 SpringCloudAlibabaDemo(【应用】SpringCloud – Nacos)下创建 gateway9005 微服务模块,引入下列依赖

    <dependencies>
        <!-- SpringCloud alibaba nacos-config -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!-- SpringCloud alibaba nacos discovery-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
    </dependencies>

使用 nacos 作为配置中心,编写 bootstrap.yml 配置 nacos 相关信息

server:
  port: 9005
spring:
  application:
    name: nacos-config-gateway
  cloud:
    nacos:
      discovery:
        server-addr: <nacos-server-ip>:8848 #nacos服务注册中心地址
      config:
        server-addr: <nacos-server-ip>:8848 #nacos作为配置中心地址
        file-extension: yml #指定yml格式的配置
        group: TEST_GROUP # 分组,若不指定则默认为DEFAULT_GROUP
        namespace: 3c0dd568-f5a1-437a-a8c7-1a17125e8e65 # 命名空间,若不指定则默认为public

创建项目的配置文件 application.yml

spring:
  profiles:
    active: dev

在 nacos 下的相应的命名空间的相应分组下按照命名规则创建 gateway 的配置文件,下图为本文配置所对应的配置文件

在这里插入图片描述

最后创建 gateway 微服务启动类,至此一个简单的 gateway 服务搭建完成,其重点在于路由配置以及使用

@SpringBootApplication
public class Gateway9005 {

    public static void main(String[] args) {
        SpringApplication.run(Gateway9005.class);
    }

}

Gateway 的配置及使用

先来看一下 nacos 中一个简单的路由配置

server:
  port: 9005
spring:
  application:
    name: nacos-config-gateway
  cloud:
    nacos:
      server-addr: <nacos-server-ip>:8848
    gateway:
      routes: # 路由数组[路由 就是指定当请求满足什么条件的时候转到哪个微服务]
        - id: test_route # 当前路由的标识, 要求唯一
          uri: lb://nacos-order-consumer # 请求要转发到的地址
          order: 1 # 路由的优先级,数字越小级别越高
          predicates: # 断言(就是路由转发要满足的条件)
            - Path=/gateway/** 
            # - Query=gateway
            # - After=2023-01-20T17:42:47.789-07:00[Asia/Shanghai]
            # - Before=
            # - Between=
            # - Method=POST
            # - Header=Warning,\d+
            # - Host=localhost:9005
          filters: # 过滤器
            - StripPrefix=1 #转发之前去掉1层路径
            - AddRequestHeader=gateway, hello!
            - AddRequestParameter=queryParam, hello222!
            - AddResponseHeader=zzz, cool!
            # - PrefixPath=/gateway
      default-filters: #默认过滤器,会对所有的路由请求都生效
        - AddResponseHeader=zzzz, coolcool!

spring-cloud-gateway中可以配置不同的路由组,对不同的请求进行配置,在每一个路由中,包含由 id、uri、predicates、filters 等设置:

  • id:当前路由的唯一标识,不可重复;

  • uri:匹配该路由的请求的转发地址(此处配合 nacos 使用,lb 代表负载均衡,后面的名字为微服务在 nacos 注册中心中注册的服务名);

  • predicates:断言,若断言为真,则对应请求将遵循该路由组配置;

  • filters:过滤器,处理请求以及响应;

predicate 断言

常用的断言配置如下:附[官方文档]((https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories)

属性说明概述
Path基于请求路径进行判断接收一个或者多个请求路径,判断请求路径是否相符合
Query基于请求参数进行判断接收两个参数,其一为请求的 param,其二为正则表达式,判断接收到的参数是否与正则表达式相匹配
After基于请求时间进行判断接收一个参数,判断请求的时间是否在配置的时间之后
Before基于请求时间进行判断接收一个参数,判断请求的时间是否在配置的时间之前
Between基于请求时间进行判断接收一个参数,判断请求的时间是否在配置的时间之间
Method基于请求方式进行判断接收一个参数,判断请求的方式是否与配置相符合
Header基于请求头进行判断接收两个参数,其一为请求头属性,其二为正则表达式,判断接收到的请求头是否与正则表达式相匹配
Host基于请求主机进行判断接收一个参数主机名,判断请求的 Host 是否与配置相符

附:正则表达式总结

filter 过滤器

常用的过滤器配置如下:附[官方文档](Spring Cloud Gateway)

过滤器说明参数
AddRequestHeader为原始请求添加 HeaderHeader 的名称以及值
AddRequestParameter为原始请求添加请求参数参数名称以及值
AddResponseHeader为原始响应添加 HeaderHeader 的名称以及值
PrefixPath为原始请求路径添加前缀添加的前缀路径
StripPrefix为原始请求去除 x 层路径数值 x 代表去除层数

GlobalFilter 全局过滤器

全局过滤器与上述过滤器最大的区别在于其通过手写代码定义过滤逻辑,而不是在配置文件中进行配置,其过滤逻辑更加多样化。

示例:对请求参数中的Authorization字段进行判断,依据规则判断是否放行请求

@Order(-1) // 多个过滤器存在时该值表现为优先级,该值越小优先级越高
@Component
public class AuthorizationFilter implements GlobalFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 1. 获取请求参数
        ServerHttpRequest request = exchange.getRequest();
        MultiValueMap<String, String> queryParams = request.getQueryParams();
        // 2. 获取对应属性的值
        String auth = queryParams.getFirst("Authorization");
        // 3. 执行判断逻辑
        // 3.1 通过验证,放行
        if ("leo".equals(auth)) {
            return chain.filter(exchange);
        }
        // 3.2 验证失败,进行拦截
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        return exchange.getResponse().setComplete();
    }
}

重新启动代码进行测试,当请求不携带任何参数时,请求被拦截,访问失败

在这里插入图片描述

当请求携带响应参数并符合规则时放行

在这里插入图片描述

Gateway 的几点问题

过滤器执行顺序

在网关中存在着路由过滤器、全局过滤器以及默认过滤器三种类型的过滤器,三种过滤器会按照设置的优先级合并排列在一个过滤器链中,然后依次执行。

每一个过滤器都必须设定 order 值:

  • 全局过滤器的 order 通过注解@order设定;

  • 路由过滤器和默认过滤器的 order 由 Spring 指定,按照声明顺序从 1 递增;

当过滤器的 order 值一样时,会按照默认过滤器 > 路由过滤器 > 全局过滤器的顺序执行。

在这里插入图片描述

跨域问题

跨域:当一个服务请求另一个服务时,两者的协议、域名、端口三者之间任意一个不同都即为跨域

使用 Gateway 配置解决跨域问题

    gateway:
      globalcors:
        cors-configurations:
          '[/**]':
            allowCredentials: true
            allowedOrigins: "*"
            allowedMethods: "*"
            allowedHeaders: "*"  #允许在请求中携带的头信息
            allowCredentials: true  # 是否允许携带cookie
            maxAge: 360000 # 这次跨域检测的有效期

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

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

相关文章

PG15 pg_basebackup 代码解析

背景 先前 PG 版本 pg_basebackup 的代码较为复杂&#xff0c;pg_basebackup 在备份过程中做了很多事情&#xff0c;但这部分代码逻辑没有完全解耦&#xff0c;导致一个文件里包含了很多功能的逻辑&#xff0c;影响了代码的可读性和可修改性。 因此&#xff0c;PG 15 针对这部…

模电学习3. 差模、共模干扰与安规电容

模电学习3. 差模、共模干扰与安规电容一、简介1. 安规2. 电源安规标准二、差模干扰与共模干扰1. 共模干扰2. 差模干扰&#xff08;1&#xff09;定义&#xff08;2&#xff09;来源与特性3. 测量4. 消除电源线路中的差模干扰&#xff08;1&#xff09;差模电容5. 消除电源线路中…

TOOM加强网络舆情监控制定处置预案,抓好舆情监控管理?

舆情预案是指根据对未来舆情发展趋势的预测&#xff0c;制定预先准备的舆情处置方案&#xff0c;以应对可能出现的舆情危机。舆情预案包括舆情预警体系、舆情应对策略、应对措施等内容&#xff0c;旨在在舆情危机发生前进行有效的预防和准备&#xff0c;避免舆情危机扩大&#…

95. BERT预训练数据代码

为了预训练之前实现的BERT模型&#xff0c;我们需要以理想的格式生成数据集&#xff0c;以便于两个预训练任务&#xff1a;遮蔽语言模型和下一句预测。一方面&#xff0c;最初的BERT模型是在两个庞大的图书语料库和英语维基百科的合集上预训练的&#xff0c;但它很难吸引这本书…

Zookeeper 教程

Zookeeper 教程Zookeeper 概述分布式应用Zookeeper 架构图ZooKeeper当中的主从与主备&#xff1a;Zookeeper的特性分布式应用的优点分布式应用的挑战什么是Apache ZooKeeper&#xff1f;ZooKeeper的好处Zookeeper 基础ZooKeeper的架构层次命名空间Znode的类型Sessions&#xff…

九龙证券|外资放大招,400亿巨头狂飙!这只翻倍股却突然崩了

昨日超级“开门红”之后&#xff0c;今天上午港股又有多只重磅个股大幅涨超10%。 今日上午&#xff0c;港股整体窄幅震荡&#xff0c;上午收盘&#xff0c;恒生指数微跌0.05%&#xff0c;恒生科技指数涨0.22%。 职业板块方面&#xff0c;媒体、软件服务、电信等涨幅居前&#…

【BLE】ANCS(Apple Notification Center Service)

目录1. 前言1.1 名词解释1.2 ANCS概述2. ANCS的特征2.1 通知源2.2 控制点和数据源2.3 获取通知属性2.4 获取应用属性2.5 执行通知操作2.6 通知操作3. 更多详情参考1. 前言 1.1 名词解释 NP(Notification Provider)&#xff1a;消息提供者&#xff0c;指的是ANCS服务的生产者&…

【JavaSE】入门概述(1~41)

1.Java视频及配套资料下载指南 2.Java基础学习导读 Java语言的三个层面 基本语法&#xff1a;变量、运算符、流程控制、数组面向对象&#xff1a;把数据及对数据的操作方法放在一起&#xff0c;作为一个相互依存的整体——对象高级应用&#xff1a;多线程、集合、IO流、网络…

性能怪兽-Nginx常用配置指北

目录 安装 Nginx操作命令 https反向代理 负载均衡 轮询 加权轮询 最少连接 加权最少连接 IP Hash 普通 Hash 动静分离 资源压缩 缓冲区 缓存机制 解决跨域 防盗链设计 配置SLL证书 性能优化 打开长连接配置 开启零拷贝技术 开启无延迟或多包共发机制 调整W…

Python连接Liunx中mysql数据库-增删改查

上一篇文章已经讲解了如何连接liunx中的mysql数据库&#xff0c;如果没有连接好数据库的话&#xff0c;可以看这一篇文章 增删改查Mysql中查询操作1.创建游标2.定义一个sql的查询语句3.调用游标内的sql语句执行操作4.打印出查询结果5.完整代码6.指定查询Mysql中新增操作1.单条数…

jupyter 常用记录

安装windows环境下 运行cmd 然后&#xff1a;在命令提示窗口输入pip install jupyter,然后回车&#xff1b;完成后运行 jupyter notebook 前言 提起jupyter notebook&#xff0c;应该很多学习过Python的同学都不陌生。虽然用jupyter notebook的同学相对较少&#xff0c;但是提…

Java多级缓存是为了解决什么的?

前言 提到缓存&#xff0c;想必每一位软件工程师都不陌生&#xff0c;它是目前架构设计中提高性能最直接的方式。 缓存技术存在于应用场景的方方面面。从网站提高性能的角度分析&#xff0c;缓存可以放在浏览器&#xff0c;可以放在反向代理服务器&#xff0c;还可以放在应用…

使用JINJA2模板部署自定义文件(RH294)

在ansible中有许多模板可以用于修改现有的文件比如—— lineinfile和blockinfile但是&#xff01;我们还有一种更加便捷而且牛皮的方法为其构建模板在部署该文件是自动为受管主机自定义次模板配置文件而这些模板中非常有名的就是 JINJA2ansible将Jinja2模板系统用于模板文件 并…

Java设计模式-职责链模式Chain of Responsibility

介绍 职责链模式&#xff08;Chain of Responsibility Pattern&#xff09;, 又叫 责任链模式&#xff0c;为请求创建了一个接收者对象的链(简单示意图)。这种模式对请求的发送者和接收者进行解耦。职责链模式通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理…

C语言#include的用法详解

#include叫做文件包含命令&#xff0c;用来引入对应的头文件&#xff08;.h文件&#xff09;。#include 也是C语言预处理命令的一种。#include 的处理过程很简单&#xff0c;就是将头文件的内容插入到该命令所在的位置&#xff0c;从而把头文件和当前源文件连接成一个源文件&am…

Oracle数据库故障处理-存储单块读hang分析处理

1 故障描述 2023年1月27日下午接到业务反馈数据库存在大量的锁表阻塞信息&#xff0c;并且业务的页面以及数据库的一些查询均处于阻塞状态&#xff0c;简单的查询sql也需要查询很长时间且未返回结果,数据库hang状态。 2 故障原因分析 2.1 数据库层面分析 接到业务反馈后&am…

如果放在几年前,无法想到互联网会蜕变成今天这样一副模样

如果放在几年前&#xff0c;你是万万无法想到互联网会蜕变成今天这样一副模样。尽管如此&#xff0c;这样一种蜕变却在真实地发生着。不知道你有没有发现就连前两年火爆的短视频人们都懒得刷了。所有的这一切都在告诉我们&#xff0c;互联网正在发生一场深刻而又彻底的嬗变。如…

SQL Server数据库版本总结

一、为什么要写这篇文章 之所以专门写一篇文章来整理归纳SQL Server各个版本的功能区别&#xff0c;是因为遇到过两次真实的客户案例&#xff0c;因为数据库版本选取不当&#xff0c;导致生产系统宕机的情况。 案例一 某客户安装了 32位 版本的SQL Server 2008 R2 数据库&…

人工智能轨道交通行业周刊-第31期(2023.1.16-1.29)

本期关键词&#xff1a;磁悬浮原理、小米石、通信铁塔维护、桥隧工巡检、地方铁路十大新闻 1 整理涉及公众号名单 1.1 行业类 RT轨道交通中关村轨道交通产业服务平台人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路…

element 日期组件实现只能选择小时或者只能选择小时、分钟

前言 在使用 element 框架时&#xff0c;总是会有一些满足不了现有项目需求的问题&#xff0c;这个时候就需要我们对 element 的组件进行改造&#xff0c;最近有一个需求就是要求日期组件只能选择年月日时&#xff0c;不要分钟和秒&#xff0c;找了一圈&#xff0c;发现 elemen…