【微服务笔记17】微服务组件之Gateway实现动态路由、配置路由规则、路由过滤器

news2024/11/18 15:25:41

这篇文章,主要介绍微服务组件之Gateway实现动态路由、配置路由映射规则、路由过滤器。

目录

一、动态路由配置

1.1、动态URI路由配置

(1)引入eureka客户端依赖

(2)添加路由配置

1.2、服务名称转发配置

二、断言配置规则

2.1、路由断言工厂类

2.2、Path路径匹配

2.3、Query请求参数匹配

2.4、Method请求方式匹配

2.5、RemoteAddr远程地址匹配

2.6、Header请求头匹配

三、路由过滤器

3.1、Path路径过滤器

(1)RewritePath重写路径

(2)PrefixPath路径前缀

(3)StripPrefix分隔前缀

(4)SetPath路径参数

3.2、Parameter参数过滤器

3.3、Status状态过滤器

3.4、自定义网关过滤器

(1)实现GatewayFilter接口

(2)配置自定义过滤器

3.5、自定义全局过滤器

(1)实现GlobalFilter接口


一、动态路由配置

1.1、动态URI路由配置

前一篇文章介绍了Gateway服务网关的基础环境搭建,在基础环境中,我们的路由地址uri是直接在application.yml配置文件中写死的,这种方式不太灵活,因为一旦微服务的IP和端口改变,此时就需要修改Gateway工程中的配置文件,然后重新启动网关工程。为了解决能够让路由不依赖于具体的IP和端口,这里就需要实现一个动态路由的功能。

动态路由,借助于eureka注册中心就能够实现,在Gateway工程中引入eureka-client客户端依赖,从注册中心获取微服务可用列表,根据微服务名称实现路由的配置。

(1)引入eureka客户端依赖

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

(2)添加路由配置

  • 动态路由配置中,必须使用【lb://微服务名称】这种格式,【lb】是LoadBalanced的缩写,表示负载均衡。
  • 动态路由本质上就是根据配置的微服务名称,去注册中心获取到对应微服务的IP地址和Port端口。
server:
  port: 9999
spring:
  application:
    name: gateway-eureka-server
  # 配置 gateway 路由信息
  cloud:
    gateway:
      # 指定路由信息
      routes:
        - id: consumer-client # 路由唯一标识,一般和微服务应用名称相同即可
          # 目标路由的服务名称,这里采用的是动态路由,格式必须是:【lb://微服务名称】
          uri: lb://consumer-client
          # 配置断言,也就是请求的URI满足哪些规则,才可以匹配当前这个routes路由信息
          predicates:
            # 这里使用路由断言,所有 /api/consumer 开头的请求,都将转发到 http://localhost:8081/ 这个服务上面
            - Path=/api/consumer/**

# eureka 配置
eureka:
  instance:
    prefer-ip-address: true # 开启采用 IP 注册形式
    # ${spring.cloud.client.ip-address} 这个属性可以获取到当前机器的 IP 地址
    instance-id: ${spring.cloud.client.ip-address}:${server.port} # 设置当前服务的实例ID,采用:IP+端口形式
  client:
    # 从 eureka 服务端获取注册信息
    fetch-registry: true
    # 将自身注册到 eureka 服务端
    register-with-eureka: true
    service-url:
      # eureka 服务端地址
      defaultZone: http://localhost:8761/eureka/

到这里,动态URI路由就配置成功啦。

1.2、服务名称转发配置

第一种动态路由的配置方式中,每次新增一个微服务应用都需要在Gateway工程的配置文件里面,新增一个路由配置信息,这样也太麻烦了,Gateway还提供了一种动态路由方式,叫做:服务名称转发。这种动态路由的方式是将eureka注册中心中的微服务名称作为请求URI的前缀,然后客户端访问的时候,需要在对应的请求接口地址中带上微服务名称,Gateway通过微服务名称就可以实现服务的转发功能。

spring:
  application:
    name: gateway-eureka-server
  # 配置 gateway 路由信息
  cloud:
    gateway:
      # 动态服务转发
      discovery:
        locator:
          enabled: true # 启用动态路由服务名称转发功能
          lower-case-service-id: true # 开启服务名称小写

采用上面这种动态路由配置方式,在访问的时候,就需要指定微服务名称,例如:【http://localhost:9999/consumer-client/api/consumer/getUserInfo?username=csdn2023】,这里访问的时候,就是需要指定访问的是【consumer-client】这个微服务应用,然后Gateway就可以根据这个微服务名称将这个请求转发到这个应用程序里面。

二、断言配置规则

2.1、路由断言工厂类

Gateway支持多种断言方式,也就是支持多种路由配置规则,断言是采用工厂模式创建的,这个工厂接口是RoutePredicateFactory,这个有很多个实现类,每一个实现类就是一种路由配置规则,常见的有下面这些:

使用最多的应该是Path路径匹配。

2.2、Path路径匹配

Path是根据请求的URI进行规则匹配,路径匹配支持正则表达式,配置规则如下所示:

2.3、Query请求参数匹配

Gateway可以根据请求URI中的参数来进行规则匹配,这种方式叫做:Query。Query参数匹配的格式:

  • Query=参数名称1,参数名称2,...(多个参数采用逗号分隔)。
  • 这种匹配模式下,如果请求的URI中包含对应的参数(只要包含其中一个参数,就可以匹配成功),就会满足匹配规则。
  • 注意:需要注意的是,这种只能够对URI中的请求参数生效。
  • Query模式也支持正则表达式。

2.4、Method请求方式匹配

Method是根据HTTP接口的请求方式来进行匹配。

Method匹配规则中,如果访问的接口地址不满足Gateway的匹配规则,则会报错404;如果是满足Gateway匹配规则,但是服务提供者这不满足调用方式,此时会报错405(表示请求方式不正确)。

2.5、RemoteAddr远程地址匹配

RemoteAddr是指定哪些IP地址可以访问Gateway网关,也就是说,Gateway会匹配对应的IP地址来判断是否满足规则。

2.6、Header请求头匹配

Header规则是根据请求中,是否包含指定的Header请求头字段,并且还可以设置请求字段的值是否满足规则,例如:【\d+】表示数字。

三、路由过滤器

Gateway中提供了两种类型的过滤器,分别是:Gateway Filter网关过滤器和Global Filter全局过滤器。GatewayFilter网关过滤器需要在application.yml配置文件中,使用【spring.cloud.gateway.routes.filters】属性进行配置;GlobalFilter全局过滤器不需要在配置文件中设置,它是作用于所有的路由上面。

3.1、Path路径过滤器

Path路径过滤器可以对请求的URI路径进行一些操作,例如:重写路径。

(1)RewritePath重写路径

路径重写可以将客户端的请求URI重新转换成另外一个请求URI,例如:将【/api-gateway/api/consumer/demo】路径重写成【/api/consumer/demo】路径,Gateway将采用重写之后的请求,去调用下游系统,从而实现接口的调用。

(2)PrefixPath路径前缀

PrefixPath是路径前缀过滤器,这个过滤器可以为请求添加URI前缀,例如:当我们请求【/consumer/demo】接口的时候,并且设置PrefixPath等于【/api】,那么这个过滤器最终形成的请求将是【/api/consumer/demo】,Gateway会通过【/api/consumer/demo】调用下游系统的接口。

(3)StripPrefix分隔前缀

StripPrefix是一个用于分隔路径的过滤器,它会根据【/】斜杠将请求分隔成一个数组,StripPrefix的参数值就是将前面几个元素删除,只保留剩余的路径。例如:请求【/api/api/api/consumer/demo】接口,设置【StripPrefix=2】,表示将接口前两个路径分割掉,最终得到的路径是【/api/consumer/demo】。

(4)SetPath路径参数

SetPath用于路径参数的一个过滤器,它可以将URI路径中的路径参数采用map保存起来,然后在过滤器中可以通过【{segment}】获取出来。

3.2、Parameter参数过滤器

Parameter参数过滤器,可以对网关接收到的请求添加、删除一些参数信息。

3.3、Status状态过滤器

Status状态过滤器,是用于设置接口响应状态码的一个过滤器。正常情况下,接口调用成功之后,都是返回200的状态码,我们可以通过Status过滤器,修改返回的状态码。

3.4、自定义网关过滤器

自定义网关过滤器,只需要编写一个类实现【GatewayFilter】接口,重写其中的方法即可。

(1)实现GatewayFilter接口

package com.gitee.demo.filter;

import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.core.Ordered;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * @version 1.0.0
 * @Date: 2023/4/19 21:12
 * @Copyright (C) ZhuYouBin
 * @Description: 自定义网关过滤器
 */
public class CustomGatewayFilter implements GatewayFilter, Ordered {
    
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("执行自定义GatewayFilter网关过滤器......");
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

(2)配置自定义过滤器

这里通过配置类的形式将我们自定义的网关过滤器加入到Gateway里面。

package com.gitee.demo.config;

import com.gitee.demo.filter.CustomGatewayFilter;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @version 1.0.0
 * @Date: 2023/4/19 21:15
 * @Copyright (C) ZhuYouBin
 * @Description: Gateway 网关路由配置类
 */
@Configuration
public class GatewayRouteConfig {
    
    @Bean
    public RouteLocator routeLocator(RouteLocatorBuilder builder) {
        // 要按照顺序调用
        return builder.routes().route(r -> r
                .path("/**")
                .uri("lb://consumer-client")
                .filters(new CustomGatewayFilter())
                .id("consumer-client")).build();
    }
    
}

启动工程,访问接口,查看控制台输出日志。

3.5、自定义全局过滤器

Gateway已经给我们提供了一些全局过滤器,不需要配置,因为这些默认的过滤器都是全局生效的,但是Gateway也允许我们自定义全局过滤器,通过自定义全局过滤器,可以实现一些功能,例如:统一鉴权、访问限流。

(1)实现GlobalFilter接口

package com.gitee.demo.filter;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * @version 1.0.0
 * @Date: 2023/4/19 21:24
 * @Copyright (C) ZhuYouBin
 * @Description: 全局过滤器
 */
// 这里通过注解将其注入 IOC 容器里面即可
@Component
public class CustomGlobalFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("执行全局过滤器......");
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

启动工程,访问任意接口,此时都会执行全局过滤器。

到此,Gateway动态路由、配置路由规则就介绍完啦。

综上,这篇文章结束了,主要介绍微服务组件之Gateway实现动态路由、配置路由映射规则、路由过滤器。

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

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

相关文章

基于 Windows 安装 ESP32 Arduino 软件开发环境

ESP32 Arduino 源码库&#xff1a;arduino-esp32ESP32 Arduino 环境搭建说明&#xff1a;About Arduino ESP32 其他软件环境需求&#xff1a; Git 环境 1、安装 Arduino 软件 可在 Arduino 官网 获取 Windows 端 Arduino 安装包&#xff0c;如下&#xff1a; 使用如下 .exe 一…

JVM类加载过程

文章目录 1、加载2、链接2.1 验证2.2 准备2.3 解析 3、初始化3.1 类初始化练习3.2 懒汉式单例练习 4、类加载器4.1 启动类加载器4.2 扩展类加载器4.3 双亲委派模式4.4 线程上下文类加载器4.4 自定义类加载器 5、运行时优化5.1 即时编译逃逸分析方法内联&#xff08;Inlining&am…

StressAppTest的简介

StressAppTest的全称是Stressful Application Test (stressapptest) 的简称http://code.google.com/p/stressapptest/ 这里我们可以将其简化为SAT。 SAT试图让来自处理器和I/O到内存的数据尽量随机化,以创造出模拟现实的环境来测试现在的硬件设备是否稳定。 SAT的大概作用如…

【Mysql 学习笔记】

Mysql 笔记记录 MySQL学习笔记一、 DDL1. DDL 查询和创建数据库2. DDL 修改、删除、使用数据库3. DDL 查询数据表4. DDL 创建数据表5. DDL 修改数据表6. DDL 删除数据表 二、DML MySQL学习笔记 一、 DDL 1. DDL 查询和创建数据库 #查询所有数据库 SHOW DATABASES; #查询某个数…

PMP项管2023年5月的备考准备攻略!现在看还来得及!

2023年共有4次PMP考试&#xff0c;分别是3月、5月、8月、11月&#xff0c;由于3月份考试不开放新报名&#xff0c;所以第一次备考PMP的同学可以选择参加5月份考试。那么&#xff0c;现在备考5月份PMP考试还来得及吗&#xff1f; 现在开始备考5月PMP考试&#xff0c;时间是非常…

蓝牙技术|消息称三星正研发智能戒指Galaxy Ring

根据韩媒 MT 报道&#xff0c;三星内部正在开发继 Galaxy Watch、Galaxy Fit 之后的另一款健康追踪设备 Galaxy Ring。 报道称这款智能戒指配备 PPG&#xff08;光电容积脉搏波&#xff09;传感器和 ECG&#xff08;心电图&#xff09;传感器&#xff0c;可以准确追踪佩戴者的…

云智慧助力MLOps加速落地

背景 随着数字化和计算能力的发展&#xff0c;机器学习&#xff08;Machine Learning&#xff09;技术在提高企业生产力方面所涌现的潜力越来越被大家所重视&#xff0c;然而很多机器学习的模型及应用在实际的生产环境并未达到预期&#xff0c;大量的ML项目被证明是失败的。从…

云计算中的网络安全技术及其应用

云计算已经成为当今企业信息化的主要选择之一。它提供了可靠的数据存储和处理能力&#xff0c;同时降低了企业的IT成本。然而&#xff0c;云计算的安全问题也随之而来。网络安全技术的应用对于保护云计算的安全至关重要。本文将探讨云计算中的网络安全技术及其应用&#xff0c;…

Golang每日一练(leetDay0041) 股票买卖4题

目录 121. 买卖股票的最佳时机 &#x1f31f; 122. 买卖股票的最佳时机 II &#x1f31f;&#x1f31f; 123. 买卖股票的最佳时机 III &#x1f31f;&#x1f31f;&#x1f31f; 188. 买卖股票的最佳时机 IV &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每…

2023第六届世界燕窝及天然滋补品博览会

2023上海燕窝展|上海燕博会|虫草节、鱼胶、灵芝、海参、滋补品展|滋补大会 摘要&#xff1a;燕博会、上海燕窝展、上海燕博会、2023上海燕博会、2023上海燕窝展、2023中国燕窝展、2023燕窝展&#xff0c;2023原装进口燕窝展&#xff0c;2023干制燕窝展,2023即食燕窝展,2023燕窝…

前端开发中有哪些常用的数组操作方法?

javascript数组 简介 JavaScript 数组用于在单一变量中存储多个值。 JavaScript数组是无类型的&#xff0c;数组元素可以是任意类型&#xff0c;并且同一个数组中元素类型也可以不同。 实例 var cars ["Saab", "Volvo", "BMW"];什么是数组&…

探索【Stable-Diffusion WEBUI】的插件:画布扩绘(Outpaint)

文章目录 &#xff08;零&#xff09;前言&#xff08;一&#xff09;局部重绘&#xff08;Inpaint&#xff09;&#xff08;二&#xff09;画布扩绘&#xff08;Outpaint&#xff09;&#xff08;2.1&#xff09;图片画布扩大&#xff08;插件&#xff1a;OpenOutpaint&#x…

回炉重造九---DNS服务器

1、DNS服务器的相关概念和技术 1.1 DNS服务器的类型 主DNS服务器从DNS服务器缓存DNS服务器&#xff08;forward DNS服务器{转发器}&#xff09; 1.1.1 主DNS服务器的作用 管理和维护所负责解析的域内解析库的服务器1.1.2 从DNS服务器的作用 从主服务器或从服务器“复制”解…

检测并打印C++编译器支持的feature(附Visual Studio 2022和gcc-12测试、对比结果)

C标准快速迭代&#xff0c;不同的系统平台和编译器对C各种新功能的支持不同&#xff0c;通过这个程序可以测试所用编译器对各个版本C的支持情况。另一方面&#xff0c;可以在代码中通过这些宏针对不同版本编写不同的代码分支。 源码下面附上Visual Studio 2022的测试结果&#…

32道子网划分习题详细解析

目录 1 子网划分概念&#xff1a; 2 划分方法&#xff1a; 子网划分方法&#xff1a;段&#xff0c;块&#xff0c;数的计算三步。 段就是确定ip地址段中既有网络地址&#xff0c;又有主机地址的那一段是四段中的那一段&#xff1f; 块就确定上一步中确定的那一段中的主机…

【C语言】21-结构体

本文目录 • 一、什么是结构体 • 二、结构体的定义 • 三、结构体变量的定义 • 四、结构体的注意点 • 五、结构体的初始化 • 六、结构体的使用 • 七、结构体数组 • 八、结构体作为函数参数 • 九、指向结构体的指针 说明&#xff1a;这个C语言专题&#xff0c;是学习iOS开…

算法设计与智能计算 || 专题七: 主成分分析的统计学视角

主成分分析的统计学视角 文章目录 主成分分析的统计学视角PCA 的统计学视角1. 寻找第一个主成分2. 获取第二个主成分3. 非零均值随机变量的主元4. 零均值随机变量的样本主元5. PCA 降维案例 主成分分析是将高维空间中的数据集拟合成一个低维子空间的方法&#xff0c;到目前为止…

搞定常见八大排序

文章目录 注意事项插入排序插入排序希尔排序 分组预排序选择排序堆排序直接选择排序(最拉胯的排序) 交换排序冒泡排序快速排序1. hoare版本如何解决快排缺陷&#xff1f;2.挖坑法版本3.双指针法版本&#xff08;建议&#xff09;快排算法优化实现非递归快排 归并排序归并排序 非…

Rainbond 结合 Jpom 实现云原生 本地一体化项目管理

Jpom 是一个简而轻的低侵入式在线构建、自动部署、日常运维、项目运维监控软件。提供了&#xff1a; 节点管理&#xff1a;集群节点&#xff0c;统一管理多节点的项目&#xff0c;实现快速一键分发项目文件项目管理&#xff1a;创建、启动、停止、实时查看项目控制台日志&…

CentOS系统设置中文输入法,并切换输入法

1.点击Application—>System Tools—>Settings&#xff0c;选择Region&Language 2.在Input Sources中&#xff0c;选择左下角的“”&#xff0c;找到Chinese(Intelligent Pinyin)&#xff0c;选中后点击右上角的“add”即可 3.选择好后&#xff0c;就可以切换中英…