1.网关
API 网关是一个服务器,是系统的唯一入口。它封装了内部系统的架构,为客户端提供统一的 API。它不属于业务系统,而是一种基础设施,负责所有请求的路由、组合、协议转换、认证、限流、熔断等非业务功能。它就像酒店的前台,负责用户的所有请求。


1.1核心职责与功能
没有网关时,客户端直接调用各个微服务,会变得非常复杂和难以管理:
- 统一接入 (Unified Access)
-
- 问题:客户端需要知道所有微服务的地址(IP/域名),耦合严重,服务变更时客户端也要跟着变。
- 解决:网关作为唯一入口,客户端只和网关交互,解除了客户端和内部服务的耦合。
- 路由转发 (Routing)
-
- 问题:一个请求到底应该发给哪个服务?
- 解决:网关根据请求的路径(如
/user/**
路由到用户服务)、参数、Header等信息,将请求精确地转发到后端的某个服务实例。这是网关最核心、最基本的功能。
- 认证授权 (Authentication & Authorization)
-
- 问题:如果每个微服务都要自己检查用户是否登录、是否有权限,会造成大量重复代码和安全逻辑不一致。
- 解决:网关统一进行身份认证(如校验 JWT Token)。只有认证通过的请求才会被转发到后端服务,后端服务可信任网关的校验结果,只需关注业务逻辑。
- 流量控制与熔断 (Rate Limiting & Circuit Breaking)
-
- 问题:防止恶意请求刷爆系统,或者某个服务故障导致请求堆积拖垮整个系统。
- 解决:网关可以对特定服务或 API 进行限流(如每秒只允许100次调用)。当发现某个服务响应缓慢或大量失败时,可以快速熔断,直接返回错误,避免故障扩散。
- 负载均衡 (Load Balancing)
-
- 问题:一个服务有多个实例,请求应该发到哪个实例?
- 解决:网关可以将请求均匀地分发到健康的服务实例上。
- 日志记录与监控 (Logging & Monitoring)
-
- 问题:需要全面了解系统的访问情况和性能。
- 解决:所有请求都经过网关,因此可以在网关统一收集日志、监控指标(如QPS、响应时间、错误率),是构建可观测性系统的绝佳位置。
- 协议转换 (Protocol Transformation)
-
- 问题:外部客户端可能使用 HTTP/1.1,而内部服务间可能使用 gRPC 等高性能协议。
- 解决:网关可以负责不同协议之间的转换,对客户端屏蔽内部实现细节。
- API 聚合 (API Aggregation)
-
- 问题:一个页面需要调用多个微服务(如用户信息、订单列表),让客户端多次请求效率低下。
- 解决:网关可以将这些请求聚合成一个请求,在后端并行调用多个服务,将结果组合后一次性返回给客户端。(注意:此功能需谨慎使用,会增加网关复杂度)
1.2常见技术实现
在 Java 技术栈中,主流的网关有:
- Spring Cloud Gateway: Spring 官方推出的基于 Spring 5、Project Reactor 和 Spring Boot 2 的异步高性能网关,是当前的主流选择。
- Netflix Zuul: Spring Cloud 早期的网关组件,基于 Servlet 同步阻塞模型,性能较差,目前已进入维护模式。
- Soul / ShenYu: 一个高性能的、异步的、响应式的 Java 网关,功能非常丰富,支持热更新。
- Kong: 基于 OpenResty(Nginx + Lua)的高性能网关,通常作为流量入口,与业务网关分层部署。
- Nginx: 更偏向于流量网关,作为最前置的入口,负责反向代理、负载均衡、SSL终止、动静分离等,通常不处理复杂的业务逻辑。
1.3创建网关
在父模块cloud-demo中创建子模块gateway,选择maven工程的方式创建

1.3.1 引入依赖
(1) 引入网关依赖
<dependency>
<!-- 网关-->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
(2)引入注册中心依赖
<dependency>
<!-- 注册中心-->
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
1.3.2 编写配置文件

1.3.3 编写并运行启动类

如图,可以看到网关已经成功启动。

1.3.4测试网关
浏览器访问localhost或127.0.0.1

可以看到,弹出错误页面404,至此,网关启动成功。