微服务设计模式 - 网关路由模式(Gateway Routing Pattern)

devtools/2025/1/3 3:39:47/

微服务设计模式 - 网关路由模式(Gateway Routing Pattern)

Gateway Routing Pattern Icon

定义

网关路由模式(Gateway Routing Pattern)是微服务架构中一种非常重要的设计模式,主要用于在客户端和微服务之间提供一个中间层。这一模式通过中央网关路由,将客户端请求分发到适当的后端微服务,从而实现请求的统一管理和负载均衡。这个网关路由层不仅可以对请求进行分发,还可以实现认证、授权、缓存、日志记录、速度限制等功能。

结构

网关路由模式的基本结构如下:

  • 客户端(Client):发起请求的用户或应用。
  • 网关(Gateway):接收客户端请求,并将请求转发到相应的微服务
  • 微服务(Microservices):处理业务逻辑和数据存取的独立服务单元。
Client --> Gateway --> Microservice A|--> Microservice B|--> Microservice C

工作原理

  1. 客户端请求:客户端将请求发送到网关。
  2. 请求路由:网关根据请求路径、请求头或其他规则,将请求路由到适当的微服务
  3. 处理中间件:在请求转发之前,网关可以使用中间件进行认证、缓存等处理。
  4. 响应转发微服务处理请求,生成响应后,网关将响应返回给客户端。

Gateway Routing Diagram

优势

  1. 集中管理:网关提供了一个集中点,用于实现认证、授权、负载均衡和日志记录等功能。

  2. 安全性增强:可以在网关处实施安全策略,保护后端微服务

  3. 负载均衡:通过网关进行请求分发,实现请求的负载均衡。

  4. 服务发现:网关可以动态查找和路由到不同的微服务实例。

  5. 简化客户端:客户端只需要与网关交互,无需了解后台各个微服务的详细地址。

Spring Cloud Gateway

介绍

Spring Cloud Gateway 是 Spring Cloud 生态系统中的一个重要组件,用于实现 API 网关功能。它基于 Spring 5、Spring Boot 2 和 Project Reactor,提供了高效、非阻塞的 API 路由解决方案。Spring Cloud Gateway 旨在提供一个简单而强大的方式来路由 API 请求,并为微服务架构中的请求管理提供了一致的工具。

主要功能

  1. 动态路由:基于请求路径、请求头、请求参数等动态匹配路由。
  2. 过滤器机制:提供丰富的过滤器,用于在请求被转发到下游服务之前或在响应返回给客户端之前进行修改。
  3. 负载均衡:集成了 Spring Cloud LoadBalancer,可以实现对下游服务的负载均衡。
  4. 安全性:支持认证和授权机制,保护后端服务。
  5. 监控与度量:集成了监控和度量工具,如 Spring Boot Actuator。

应用案例

Spring Cloud Gateway 可以作为客户端和微服务之间的网关,将请求路由到适当的微服务,并在必要时应用各种过滤器和安全策略。下面是如何使用 Spring Cloud Gateway 实现网关路由模式的具体步骤。

1. 项目结构

spring-cloud-gateway-demo
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── example
│   │   │           └── gatewaydemo
│   │   │               ├── GatewayDemoApplication.java
│   │   │               └── CustomFilter.java
│   │   ├── resources
│   │       └── application.yml
└── pom.xml

2. 项目依赖

pom.xml文件中添加以下内容:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>spring-cloud-gateway-demo</artifactId><version>0.0.1-SNAPSHOT</version><name>spring-cloud-gateway-demo</name><description>Demo project for Spring Cloud Gateway</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.6</version><relativePath/> <!-- lookup parent from repository --></parent><properties><java.version>11</java.version><spring-cloud.version>2020.0.4</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

3. 应用启动类

src/main/java/com/example/gatewaydemo/ 目录下创建 GatewayDemoApplication.java

package com.example.gatewaydemo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class GatewayDemoApplication {public static void main(String[] args) {SpringApplication.run(GatewayDemoApplication.class, args);}
}

4. 自定义过滤器类

在同一目录下创建 CustomFilter.java,作为自定义过滤器,可以在请求被路由到后端服务之前添加自定义的头信息。在微服务架构中,网关往往需要添加一些通用的请求头信息,例如身份验证令牌、追踪ID等。CustomFilter 就是一个示例过滤器,用来在请求转发到下游服务前,向请求头中添加一个自定义的授权令牌。

package com.example.gatewaydemo;import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;@Component
public class CustomFilter extends AbstractGatewayFilterFactory<CustomFilter.Config> {public CustomFilter() {super(Config.class);}@Overridepublic GatewayFilter apply(Config config) {// 在请求中添加自定义的 Authorization 头return (exchange, chain) -> {exchange.getRequest().mutate().header(HttpHeaders.AUTHORIZATION, "Bearer " + config.getToken()).build();return chain.filter(exchange);};}public static class Config {private String token;public String getToken() {return token;}public void setToken(String token) {this.token = token;}}
}

5. 配置文件

src/main/resources/ 目录下创建 application.yml

spring:cloud:gateway:routes:- id: service1uri: http://localhost:8081predicates:- Path=/service1/**filters:- StripPrefix=1- name: CustomFilterargs:token: "my-custom-token"- id: service2uri: http://localhost:8082predicates:- Path=/service2/**filters:- StripPrefix=1

StripPrefix=1 是 Spring Cloud Gateway 提供的一个内置过滤器,它用于去掉请求路径中的前缀部分。当请求被路由到下游服务时,这个过滤器会去掉请求路径的指定前缀数量。

具体来说,假设我们有一个请求路径 /service1/some-endpoint,并且我们在配置中使用了 StripPrefix=1。这个配置的意思是去掉路径的第一个部分,即 /service1。因此,下游服务接收到的请求路径将会是 /some-endpoint。这对于下游服务处理更简洁的路径非常有用。

原始请求路径:

http://localhost:8080/service1/some-endpoint

处理后的请求路径:

在上面的配置中,StripPrefix=1 的意思是去掉请求路径的第一个部分(即 /service1 )。因此,当该请求被路由到 http://localhost:8081 下的服务时,实际的请求路径会是:

http://localhost:8081/some-endpoint

另外,CustomFilter 接收一个配置参数 token,参数值是 my-custom-token,将会被传递到下游服务器。

6. 运行项目

启动Spring Boot应用程序,确保后端服务在localhost:8081localhost:8082分别运行,网关服务应该在localhost:8080运行。可以通过向http://localhost:8080/service1/some-endpointhttp://localhost:8080/service2/another-endpoint发送请求来测试路由和过滤。

比如在 http://localhost:8080/service1/some-endpoint 上发送请求。

curl http://localhost:8080/service1/some-endpoint

通过检查在 service1 控制台中打印的请求头,可以验证自定义过滤器是否正确地添加了 Authorization 头。

authorization: Bearer my-custom-token

通过这种方式,可以在网关中添加自定义头信息,如授权令牌,来实现更复杂的请求处理逻辑。

问题与考虑

在使用网关路由模式时,需要注意以下几个问题与考虑:

  1. 单点故障:网关服务可能引入单点故障问题,确保网关服务的设计能够满足高可用性的需求,并考虑在实现中引入弹性和容错能力。
  2. 性能瓶颈:网关服务可能成为性能瓶颈,确保网关具备足够的性能来处理所需的负载,并能随着业务增长容易地扩展。
  3. 负载测试:对网关进行负载测试,确保不会引起级联故障,即一个服务的故障不会导致其他服务的连锁故障。
  4. 公有端点管理:网关服务是其前置服务的公共端点,考虑限制对后端服务的公共网络访问,使服务只能通过网关或私有虚拟网络访问,以加强安全性。

总结

Robert-C-Martin-Providing-too-much-detail-can-be-an-invitation-for-micro-management

网关路由模式通过在客户端和微服务之间引入一个网关,提供了请求的统一处理和路由功能。它不仅提高了系统的安全性和可扩展性,还简化了客户端的开发。在本文中,我们详细介绍了网关路由模式的定义、结构、优势、工作原理,并通过 Spring Boot 的具体示例展示了该模式的应用和实现方法。希望对您在微服务架构中的开发有所帮助。


http://www.ppmy.cn/devtools/131257.html

相关文章

elementUI table 多级表头隔行变背景颜色

效果图如下&#xff1a; 代码如下&#xff1a; 其中rowIndex 0 意思为多级表头的第一行&#xff0c;columnIndex 0 意思为某一行的第一列 如 rowIndex 0&#xff0c; columnIndex 1 的意思为多级表头的第一行中的第二列 指在上效果图中 激活指标 如 rowIndex 1&#x…

无人机避障——2D栅格地图pgm格式文件路径规划代码详解

代码和测试效果请看上一篇博客&#xff1a; 无人机避障——使用三维PCD点云生成的2D栅格地图PGM做路径规划-CSDN博客 更换模型文件.dae&#xff1a; 部分模型文件可以从这里下载&#xff1a; https://github.com/ethz-asl/rotors_simulator/wiki 将原先代码中的car.dae文件…

Python爬虫:揭开淘宝商品描述的神秘面纱

在这个信息爆炸的时代&#xff0c;我们每天都在和时间赛跑。作为一名Python开发者&#xff0c;你是否曾梦想拥有超能力&#xff0c;能够瞬间揭开淘宝商品描述的神秘面纱&#xff1f;今天&#xff0c;就让我们一起化身为代码界的“福尔摩斯”&#xff0c;使用Python爬虫技术&…

AUTOSAR CP MCAL微控制器抽象层介绍

AUTOSAR(Automotive Open System Architecture)即汽车开放系统架构,它将汽车电子控制单元(ECU)的软件底层做了一个标准的封装,使得开发者能够共用一套底层软件,并通过修改参数来匹配不同的硬件和应用层软件。AUTOSAR CP(Classic Platform)是AUTOSAR架构中的一个重要组…

《TCP/IP网络编程》学习笔记 | Chapter 3:地址族与数据序列

《TCP/IP网络编程》学习笔记 | Chapter 3&#xff1a;地址族与数据序列 《TCP/IP网络编程》学习笔记 | Chapter 3&#xff1a;地址族与数据序列分配给套接字的IP地址和端口号网络地址网络地址分类和主机地址边界用于区分套接字的端口号数据传输过程示例 地址信息的表示表示IPv4…

【Clikhouse 探秘】ClickHouse 物化视图:加速大数据分析的新利器

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

git submodule

文章目录 1.简介2.格式3.选项4.示例5.小结参考文献 1.简介 git submodule 用于管理子模块。 有种情况我们经常会遇到&#xff1a;某个工作中的项目需要包含并使用另一个项目。 也许是第三方库&#xff0c;或者你独立开发的&#xff0c;用于多个父项目的库。 现在问题来了&…

江协科技STM32学习- P25 UART串口协议

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…