tulip notes
首页
  • 学习笔记

    • 《Vue》
  • 踩坑日记

    • JavaScript
  • MQ
  • Nginx
  • IdentityServer
  • Redis
  • Linux
  • Java
  • SpringBoot
  • SpringCloud
  • MySql
  • docker
  • 算法与设计模式
  • 踩坑与提升
  • Git
  • GitHub技巧
  • Mac
  • 网络
  • 项目构建合集
  • 一些技巧
  • 面试
  • 一些杂货
  • 友情链接
  • 项目发布
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Star-Lord

希望一天成为大师的学徒
首页
  • 学习笔记

    • 《Vue》
  • 踩坑日记

    • JavaScript
  • MQ
  • Nginx
  • IdentityServer
  • Redis
  • Linux
  • Java
  • SpringBoot
  • SpringCloud
  • MySql
  • docker
  • 算法与设计模式
  • 踩坑与提升
  • Git
  • GitHub技巧
  • Mac
  • 网络
  • 项目构建合集
  • 一些技巧
  • 面试
  • 一些杂货
  • 友情链接
  • 项目发布
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • SCAlibaba-Nacos

  • SCAlibaba-Sentinel

  • 负载均衡与服务调用

  • 服务熔断与降级

  • 服务链路追踪与网关

    • Sleuth(Micrometer)
    • GateWay的相关使用
      • 诞生的原因
        • 带来的新问题
      • 相关资料
      • 三大核心
      • Glossary
        • 1. 路由(Route)
        • 2.谓词(Predicate)
        • 3. 过滤器(Filter)
      • 快速上手
        • 实现GateWay服务
    • GateWay高级特性之Predicate
    • GateWay之Filter相关
  • 分布式实战与细节

  • 其他

  • 《SpringCloud》笔记
  • 服务链路追踪与网关
EffectTang
2024-11-06
目录

GateWay的相关使用

# GateWay的相关使用

# 诞生的原因

Spring Cloud Gateway 是 Spring Cloud 生态系统中的一个关键组件,它作为 API 网关,用于路由和管理微服务之间的请求。

它的出现是为了解决了微服务架构中的一些核心问题(以下是个人认为重要的几个):

  1. 统一入口:
    • 微服务架构中,每个服务都有自己的端口和地址。通过 Gateway,可以将所有服务的请求统一到一个入口,简化了客户端的调用逻辑。
    • 客户端只需要知道 Gateway 的地址,不需要关心每个服务的具体地址。
  2. 路由管理:
    • Gateway 可以根据预定义的路由规则,将请求转发到不同的后端服务。
    • 动态路由配置允许在不重启服务的情况下修改路由规则。
  3. 请求过滤:
    • Gateway 可以在请求到达后端服务之前或之后执行一系列的过滤操作,如认证、鉴权、日志记录、请求转换等。
    • 这些过滤操作可以集中管理,减少每个服务的负担。
  4. 安全性:
    • Gateway 可以集中处理安全相关的功能,如 JWT 验证、CSRF 防护等。
    • 这样可以减少每个服务的安全风险,通过统一的接口进行请求,如此一来客户端便不知道每个具体服务的ip地址了,提高整体系统的安全性。

# 带来的新问题

新的东西,也会带来新的问题,以下就是GateWay带来的新问题(任何事物都如此):

  1. 性能开销:
    • Gateway 作为一个中间层,会增加请求的延迟。
    • 特别是当配置了大量的过滤器时,性能开销会更加明显。
  2. 复杂性:
    • 配置和管理 Gateway 可能会变得复杂,尤其是在大规模微服务架构中。
    • 需要对路由规则、过滤器、负载均衡等有深入的理解和配置经验。
  3. 调试困难:
    • 由于 Gateway 处理了请求的中间环节,调试问题时可能需要额外的步骤。
    • 特别是当请求在 Gateway 中被修改或过滤时,定位问题可能会更加困难。
  4. 单点故障:
    • 如果 Gateway 发生故障,整个系统的访问可能会受到影响。
    • 需要通过高可用性和容错机制来确保 Gateway 的可靠性。
  5. 学习曲线:
    • 对于初学者来说,学习如何配置和使用 Gateway 可能需要一定的时间。
    • 需要熟悉 Spring Cloud 和 Reactor 的相关概念和技术。

# 相关资料

springcloud gateway官网 (opens new window)

  • https://spring.io/projects/spring-cloud-gateway

GateWay-github对应源码 (opens new window)

  • https://github.com/spring-cloud/spring-cloud-gateway

GateWay-讲解文档-官网 (opens new window)

  • https://docs.spring.io/spring-cloud-gateway/reference/spring-cloud-gateway.html

# 三大核心

官网对应说明:

# Glossary

  • Route: The basic building block of the gateway. It is defined by an ID, a destination URI, a collection of predicates, and a collection of filters. A route is matched if the aggregate predicate is true.
  • Predicate: This is a Java 8 Function Predicate (opens new window). The input type is a Spring Framework ServerWebExchange (opens new window). This lets you match on anything from the HTTP request, such as headers or parameters.
  • Filter: These are instances of GatewayFilter (opens new window) that have been constructed with a specific factory. Here, you can modify requests and responses before or after sending the downstream request.

Spring Cloud Gateway 有三个核心概念,分别是 路由(Route)、谓词(Predicate)和 过滤器(Filter)。这三个核心概念共同协作,实现了 Gateway 的强大功能。

# 1. 路由(Route)

定义:路由是 Gateway 的基本组成单元,它定义了如何将请求转发到目标服务。每个路由都包含一个 ID、一个目标 URI 和一组谓词和过滤器。

作用:

  • 请求匹配:通过谓词来匹配传入的 HTTP 请求。
  • 请求转发:将匹配的请求转发到目标 URI 指定的服务。

# 2.谓词(Predicate)

定义:谓词是用于匹配传入 HTTP 请求的条件。Spring Cloud Gateway 使用 Java 8 的 Predicate 接口来实现这些条件。

作用:

  • 请求匹配:通过谓词来判断请求是否符合某个路由的条件。
  • 灵活配置:支持多种类型的谓词,如路径匹配、方法匹配、请求头匹配等。

# 3. 过滤器(Filter)

定义:过滤器用于在请求转发前后对请求和响应进行处理。Spring Cloud Gateway 提供了多种内置过滤器,并支持自定义过滤器。

# 快速上手

# 实现GateWay服务

引入对应pom坐标:

 <!--gateway-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <!--nacos-discovery-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- 指标监控健康检查的actuator -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

因为它只是网关,所以不必引入web-starter,而网关也是一个微服务因此也需要将其注入到服务发现组件中如nacos等(需要引入对应组件),其中关键坐标为:

<!--gateway-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
1
2
3
4
5

接着修改Application文件。

实现GateWay的核心功能之一,路由——将请求转发给对应的微服务。

spring:
  application:
    name: cloud-gateway #以微服务注册进consul或nacos服务列表内
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848  # 将服务注册到 nacos中
        
        gateway:
      routes:
        - id: pay_routh1 #pay_routh1                #路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:9001               #匹配后提供服务的路由地址
          predicates:
            - Path=/pay/gateway/get/**              # 断言,路径相匹配的进行路由

        - id: pay_routh2 #pay_routh2                #路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:9001               #匹配后提供服务的路由地址
          predicates:
            - Path=/pay/gateway/info/**
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db2024?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
    username: root
    password: root
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

部分参数讲解:

  • routes,为数组,可以配置多个

  • ID是路由的唯一标识。每一个路由规则都应该有自己的ID,确保它唯一不重复,只要不重复你就可以随便定义,当然我们建议跟服务名进行联系

  • URI是路由的目标地址,有2种写法

    • 一种是具体ip+端口
    • 另一种是lb://服务名,如 lb://userservice,其中lb 就是LoadBalancer的缩写
  • predicate,叫谓语。谓语的有点像我们的一种语法的表示,或者你可以把它翻译成断言,它就是一系列的条件判断

    • 判断你的请求是否符合。如果符合,那就会把你路由到 UserService。如果你不符合,那就让请求找别的路由,或禁止访问
    • 其中 - Path=/pay/gateway/info/** 表示任何以/pay/gateway/info/开头的请求路径都会匹配这条规则。这里的**是一种通配符,意味着它可以匹配后续的任意层级的路径

假设有一个HTTP请求到达网关,其路径为http://gateway_host/pay/gateway/info/some_endpoint。根据上述配置:

  1. 网关会检查该请求是否符合predicates中的条件,即路径是否以/pay/gateway/info/开头。
  2. 如果匹配,则该请求将被转发至http://localhost:9001/pay/gateway/info/some_endpoint(注意,默认情况下,路径前缀不会被去掉,除非你使用了StripPrefix过滤器)。
  3. 后端服务接收到请求并处理,然后返回响应给网关,网关再将响应返回给原始客户端。

到此通过网关隐藏其他微服务地址(ip地址)的目的就成功达到了。

对了GateWay微服务的启动类,记得加上服务注册注解@EnableDiscoveryClient

@SpringBootApplication
@EnableDiscoveryClient
public class GateWay9527 {
    public static void main(String[] args) {

        SpringApplication.run(GateWay9527.class,args);
    }
}
1
2
3
4
5
6
7
8
上次更新: 2025/04/23, 16:23:16
Sleuth(Micrometer)
GateWay高级特性之Predicate

← Sleuth(Micrometer) GateWay高级特性之Predicate→

最近更新
01
面向切面跟自定义注解的结合
05-22
02
时间跟其他数据的序列化
05-19
03
数据加密与安全
05-17
更多文章>
Theme by Vdoing | Copyright © 2023-2025 EffectTang
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式