weblog/doc/7、Gateway 网关搭建与接口鉴权/7.1 Gateway 网关介绍与服务搭建:实现路由转发.md
2025-02-17 11:57:55 +08:00

8.9 KiB
Raw Blame History

本章节开始,正式进入到 Gateway 网关服务的搭建工作。

什么是 Gateway 网关?

Gateway 网关API Gateway是一个服务器充当所有客户端请求的单一入口点。它接收来自客户端的所有请求处理这些请求然后将它们转发给下游适当的微服务。

Gateway 网关通常具有以下功能:

  • 路由转发:将路由请求转发到适当的微服务实例。

  • 负载均衡:在多个服务实例之间分配请求,以实现负载均衡。

  • 认证和授权:对请求进行身份验证和授权,以确保只有授权的客户端才能访问服务。

    PS : 咱们这个项目中,用户认证的工作,是由具体的认证服务来处理的。

  • 日志和监控:记录请求和响应的日志,并监控流量和性能指标。

  • 限流和熔断:控制流量,以防止服务过载,并提供熔断机制来应对服务故障。

新建网关服务

打开 IDEA, 在项目上右键 | New | Module 新建一个网关子模块:

填写网关服务的相关配置项,如下:

解释一下标注的地方:

  • ①:选择 Maven Archetype 来创建一个 Maven 项目;
  • ②:项目名称;
  • IDEA 需要知道 Maven Archetype Catalog 的位置,以便从中获取可用的 Archetype 列表。这个 Catalog 文件通常包含了 Maven 官方仓库或其他远程仓库中可用的 Archetype 信息。选择 Internal 即可。
  • ④:通过使用 Archetype你可以基于已有的项目模板创建一个新项目。这里选择 maven-archetype-quickstart
  • ⑤:填写 Group 组织名称,这里填写 com.quanxiaoha.xiaohashu.gateway

点击 Create 按钮,开始创建网关服务,等待控制台提示 BUILD SUCCESS 后,则表示子模块创建完成,项目结构大致如下图所示:

这个时候,查看项目最外层的 pom.xml 文件,可以看到 <modules> 节点下,网关服务模块已经被添加进去了:

新建 /resources 资源目录

通过 quickstart 模板生成的项目,还缺失了一些东西,如 /resources 资源目录。在网关服务中的 /main 包上右键 | New | Directory , 新建一个文件夹:

文件夹名填写 resources

创建完成后,结构如下:

修改 pom 文件

接着,编辑网关服务的 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>
    <!-- 指定父项目 -->
    <parent>
        <groupId>com.quanxiaoha</groupId>
        <artifactId>xiaohashu</artifactId>
        <version>${revision}</version>
    </parent>

    <artifactId>xiaohashu-gateway</artifactId>
    <name>${project.artifactId}</name>
    <description>网关服务(负责路由转发、接口鉴权等功能)</description>

    <dependencies>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

  • 指定父项目;
  • 项目名称、描述信息;
  • 以及添加 spring-boot-maven-plugin 项目构建插件;

添加依赖

添加网关服务需要的相关依赖:

		<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>

        <!-- 服务发现 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!-- 网关 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

        <!-- 负载均衡 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>

创建配置文件

依赖添加完成后,在 /resources 资源目录下,分别创建上图标注的两个配置文件。

bootstrap.yml

spring:
  application:
    name: xiaohashu-gateway # 应用名称
  profiles:
    active: dev
  cloud:
    nacos:
      discovery:
        enabled: true # 启用服务发现
        group: DEFAULT_GROUP # 所属组
        namespace: xiaohashu # 命名空间
        server-addr: 127.0.0.1:8848 # Nacos 服务器地址

填写应用名称,同时将网关服务注册到 Nacos 上。

application.yml

server:
  port: 8000 # 指定启动端口
spring:
  cloud:
    gateway:
      routes:
        - id: auth
          uri: lb://xiaohashu-auth
          predicates:
            - Path=/auth/**
          filters:
            - StripPrefix=1

解释一下:

  • spring.cloud.gateway.routes 用于定义网关的路由规则。

  • - id: auth

    id 用于唯一标识这个路由。这里将路由的 id 设置为 auth,表示这个路由的配置是针对认证服务的。

  • uri: lb://xiaohashu-auth

    uri 定义了请求将被路由到的目标服务地址。这里使用 lb://xiaohashu-auth,其中 lb 代表的是负载均衡Load Balancerxiaohashu-auth 是认证服务的名称。Spring Cloud Gateway 会使用注册中心(如 Nacos )来解析并负载均衡到具体的服务实例。

  • predicates: 用于定义匹配规则,决定哪些请求会被路由到这个目标服务。每个 predicate 都是一个条件表达式,可以用来匹配请求路径、请求方法、请求头等信息。

    • - Path=/auth/** 这个 Path 断言用于匹配请求路径。这里 /auth/** 表示所有以 /auth/ 开头的路径都会匹配这个路由规则。例如,/auth/login/auth/register 都会被这个路由处理。/** 是一个通配符,表示任意的后续路径。
  • filters : 定义路由过滤器。

    • - StripPrefix=1: 表示去掉路径中的第一个部分。例如,当请求路径为 /auth/verification/code/send 时,去掉第一个前缀部分后,实际传递给 xiaohashu-auth 服务的路径将变成 /verification/code/send

创建启动类

路由转发相关配置完成后,将网关服务中,自动生成的 App.java 文件删除掉。手动创建一个 Spring Boot 启动类 XiaohashuGatewayApplicaiton , 代码如下:

package com.quanxiaoha.xiaohashu.gateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class XiaohashuGatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(XiaohashuGatewayApplication.class, args);
    }

}

自测一波

以上工作都完成后,启动网关服务项目。启动成功后,进入到 Nacos 管理后台,若看到服务列表中,多出了 xiaohashu-gateway 服务,说明网关服务已经成功注册到了 Nacos 上:

接下来,我们再来测试一下路由转发是否好使。打开 Apipost 接口测试工具,再次测试获取验证码接口,不过,这次的请求是网关,由网关来转发到具体的服务上,这里是认证服务:

注意:请求地址为 localhost:8000/auth/verification/code/send , 端口为网关的 8000 端口,接口地址加上 /auth 前缀,网关通过此前缀标识,转发到具体服务上。

点击发送按钮,可以看 successtrue,响参是成功的,说明网关转发路由成功了。再观察一下 xiaohashu-auth 认证服务的控制台日志,确认一下是否真的接受到了请求:

如上图所示接口切面日志打印出来了OK ,网关服务工作良好。

本小节源码下载

https://t.zsxq.com/wOmud