8.9 KiB
本章节开始,正式进入到 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 Balancer),xiaohashu-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前缀,网关通过此前缀标识,转发到具体服务上。
点击发送按钮,可以看 success 为 true,响参是成功的,说明网关转发路由成功了。再观察一下 xiaohashu-auth 认证服务的控制台日志,确认一下是否真的接受到了请求:
如上图所示,接口切面日志打印出来了,OK ,网关服务工作良好。