当前位置: 首页 > article >正文

微服务设计模式 - 网关路由模式(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);
    }

    @Override
    public 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: service1
          uri: http://localhost:8081
          predicates:
            - Path=/service1/**
          filters:
            - StripPrefix=1
            - name: CustomFilter
              args:
                token: "my-custom-token"
        - id: service2
          uri: http://localhost:8082
          predicates:
            - 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.kler.cn/a/378264.html

相关文章:

  • 【Nginx】编译安装(Centos)
  • 一二三应用开发平台自定义查询设计与实现系列3——通用化重构
  • Java 中 HashMap集合使用
  • RV1126-SDK学习之OSD实现原理
  • Jest进阶知识:React组件的单元测试
  • 自适应对话式团队构建,提升语言模型代理的复杂任务解决能力
  • dns主从服务器的配置
  • Web 词汇表
  • Linux下安装ActiveMQ-CPP
  • 基于Spring Boot的私房菜定制上门服务系统的设计与实现
  • 【097】基于SpringBoot+Vue实现的个人社区博客管理系统
  • leetcode-5-最长回文子串
  • 在 VS Code 中规范化 Git 提交消息并自动生成 CHANGELOG.md
  • gin中间件
  • [极客大挑战 2019]FinalSQL
  • [ 问题解决篇 ] win11中本地组策略编辑器gpedit.msc打不开(gpedit.msc缺失)
  • kubectl常用命令简介
  • 万字长文详解Hive聚合函数 grouping sets、cube、rollup原理、语法、案例和优化
  • HTML 框架
  • PHP如何处理密码嗅探和重播攻击
  • Django3 + Vue.js 前后端分离书籍添加项目Web开发实战
  • 助力风力发电风机设备智能化巡检,基于YOLOv7全系列【tiny/l/x】参数模型开发构建无人机巡检场景下风机叶片缺陷问题智能化检测预警模型
  • Chrome与夸克的安全性对比
  • Vivo开奖了,劝退价。。
  • Numpy实现BatchNorm2d
  • springboot Lark扫码登录