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

微服务设计模式 - 网关路由模式(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.xdnf.cn/news/5995.html

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

相关文章

【Axure高保真原型】PDF阅读器

今天和大家分享PDF阅读器的原型模板&#xff0c;我们点击左侧的PDF&#xff0c;点击后右侧能看到这个PDF的内容&#xff0c;每个PDF都可以点击查看&#xff0c;如果PDF内容太多&#xff0c;我们也可以通过鼠标滚动来查看。这个模板是用中继器制作的&#xff0c;所以使用也很方便…

uniapp学习(010-2 实现抖音小程序上线)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战&#xff0c;开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第113p的内容 文章目录 抖音小程序下载抖音开发者工具先去开发者工具里进行测试 抖音开放平台配置开始打包上传…

漏洞挖掘某电子商城类漏洞挖掘案例教程,手把手教你复现一个完整的漏洞挖掘全流程

前言 电子商城购物系统我们每天都能接触到&#xff0c;现在的商城系统&#xff0c;大多数已经在小程序、APP方向去开发了&#xff0c;因为灵活&#xff0c;方便管理且开发难度不高&#xff0c;当然&#xff0c;现在WEB系统还很多&#xff0c;我们本次会选几个SRC去浅挖一下那些…

C#入门013 表达式,语句详解 2

语句的定义 在计算机编程中&#xff0c;一条语句&#xff08;statement&#xff09;是命令式编程语言中表达某个要执行的动作的最小独立组成部分。用这种语言编写的程序是由一个或多个语句组成的序列构成的。语句可以包含内部组件&#xff0c;比如表达式&#xff08;expressio…

【运动的&足球】足球场景目标检测系统源码&数据集全套:改进yolo11-ASF-P2

改进yolo11-RetBlock等200全套创新点大全&#xff1a;足球场景目标检测系统源码&#xff06;数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.11.03 注意&#xff1a;由于项目一直在更新迭代&#xff0c;上面“1.图片效果展示”和“2.视频效果展示”展示的系统图片或…

数据结构之复杂度

hello everybody&#xff0c;好久不见&#xff0c;由于前些日子在学习文件操作&#xff0c;预处理相关知识&#xff0c;导致我好些天没写博客了&#xff0c;所以我先从数据结构开始写吧&#xff0c;等后面熟练些了再补回来&#xff0c;欧克&#xff0c;话不多说&#xff0c;进入…

使用Jest进行JavaScript单元测试

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Jest进行JavaScript单元测试 引言 Jest 简介 安装 Jest 创建基本配置 编写测试用例 运行测试 快照测试 模拟函数 代码覆盖率…

Node.js 应用程序中的文件写入提升为 RCE

在这篇博文中,我们将强调代码安全基础的重要性。我们会展示一个技术案例:攻击者如何能够把 Node.js 应用中的文件写入漏洞转化为远程代码执行,即便目标系统的文件系统是以只读方式挂载的。这个技术通过利用暴露的管道文件描述符来获得代码执行能力,从而绕过了这类加固环境中的限…

Oracle视频基础1.4.5练习

1.4.5 看bbk的框架 ls env | grep ORA cd /u01/oradata ls ll cd bbk ll cd /u01/admin/ ll ll bbk cd cd db cd dbs ls vi initbbk.ora clear ls ll env | grep ORA执行创建数据库语句。 sqlplus /nolog conn /as sysdba create spfile from pfile ! ls ll exit startup nom…

Echats柱状图的横坐标用图片显示

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>图片作为横坐标示例 - ECharts</title><!-…

vscode php Launch built-in server and debug, PHP内置服务xdebug调试,自定义启动参数配置使用示例

在vscode中&#xff0c;当我们安装了插件 PHP Debug&#xff08;xdebug.php-debug&#xff09;或者 xdebug.php-pack 后 我们通过内置默认的 php xdebug配置启动php项目后&#xff0c;默认情况下我们在vscode中设置断点是不会生效的&#xff0c;因为我们的内置php服务默认启动时…

城镇保障性住房管理:SpringBoot系统创新点

5系统详细实现 5.1 用户信息管理 管理员可以对用户信息进行添加&#xff0c;修改&#xff0c;删除操作。具体界面的展示如图5.1所示。 图5.1 用户信息管理界面 5.2 房屋类型管理 管理员可以对房屋类型信息进行添加&#xff0c;修改&#xff0c;删除操作。具体界面如图5.2所示…

积极助力信创工作,爱加密荣获麒麟系统优秀合作伙伴

近日&#xff0c;麒麟软件安全生态联盟2024年第三次工作会议顺利举行。麒麟软件安全生态联盟由工业和信息化部网络安全产业发展中心指导成立&#xff0c;旨在联合打造原创性、引领性的自主操作系统内生安全技术体系和自主创新安全生态。会上&#xff0c;麒麟软件相关领导为爱加…

用图说明 CPU、MCU、MPU、SoC 的区别

CPU CPU 负责执行构成计算机程序的指令&#xff0c;执行这些指令所指定的算术、逻辑、控制和输入/输出&#xff08;I/O&#xff09;操作。 MCU (microcontroller unit) 不同的 MCU 架构如下&#xff0c;注意这里的 MPU 表示 memory protection unit MPU (microprocessor un…

navicat pg库安装mysql fdw 外表扩展

在Windows上手动安装mysql_fdw&#xff08;MySQL Foreign Data Wrapper&#xff09;通常涉及一系列步骤&#xff0c;包括下载源码、编译、配置和测试。以下是一个详细的指南&#xff1a; 一、下载mysql_fdw源码 访问mysql_fdw的GitHub发布页面&#xff0c;选择最新版本的源码…

LongVU :Meta AI 的解锁长视频理解模型,利用自适应时空压缩技术彻底改变视频理解方式

Meta AI在视频理解方面取得了令人瞩目的里程碑式成就&#xff0c;推出了LongVU&#xff0c;这是一种开创性的模型&#xff0c;能够理解以前对人工智能系统来说具有挑战性的长视频。 研究论文 "LongVU&#xff1a;用于长视频语言理解的时空自适应压缩 "提出了一种革命…

Oracle OCP认证考试考点详解082系列09

题记&#xff1a; 本系列主要讲解Oracle OCP认证考试考点&#xff08;题目&#xff09;&#xff0c;适用于19C/21C,跟着学OCP考试必过。 41. 第41题&#xff1a; 题目 41.Examine the description of the EMPLOYEES table NLS_DATE_FORMAT is set to DD-MON-YY Which query…

【NOIP提高组】引水入城

【NOIP提高组】引水入城 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 在一个遥远的国度&#xff0c;一侧是风景秀美的湖泊&#xff0c;另一侧则是漫无边际的沙漠。该国的行政 区划十分特殊&#xff0c;刚好构成一个N行M列的矩形&#xff…

apache poi 实现下拉框联动校验

apache poi 提供了 DataValidation​ 接口 让我们可以轻松实现 Excel 下拉框数据局校验。但是下拉框联动校验是无法直接通过 DataValidation ​实现&#xff0c;所以我们可以通过其他方式间接实现。 ‍ 步骤如下&#xff1a; 创建一个隐藏 sheet private static void create…

盘点和嗨格式一样好用的10款数据恢复!!

亲爱的朋友们&#xff0c;相信大家都知道&#xff0c;一旦不小心删除了重要文件或者遇到了硬盘故障&#xff0c;心情简直如同坐过山车一般此起彼伏&#xff0c;那么这个时候就需要一款好的数据恢复工具来解救我们的数据危机。今天就来给大家推荐嗨格式数据恢复以及另外这10款我…