Gateway -网关

1.网关

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

1.1核心职责与功能

没有网关时,客户端直接调用各个微服务,会变得非常复杂和难以管理:

  1. 统一接入 (Unified Access)
    • 问题:客户端需要知道所有微服务的地址(IP/域名),耦合严重,服务变更时客户端也要跟着变。
    • 解决:网关作为唯一入口,客户端只和网关交互,解除了客户端和内部服务的耦合。
  1. 路由转发 (Routing)
    • 问题:一个请求到底应该发给哪个服务?
    • 解决:网关根据请求的路径(如 /user/** 路由到用户服务)、参数、Header等信息,将请求精确地转发到后端的某个服务实例。这是网关最核心、最基本的功能。
  1. 认证授权 (Authentication & Authorization)
    • 问题:如果每个微服务都要自己检查用户是否登录、是否有权限,会造成大量重复代码和安全逻辑不一致。
    • 解决:网关统一进行身份认证(如校验 JWT Token)。只有认证通过的请求才会被转发到后端服务,后端服务可信任网关的校验结果,只需关注业务逻辑。
  1. 流量控制与熔断 (Rate Limiting & Circuit Breaking)
    • 问题:防止恶意请求刷爆系统,或者某个服务故障导致请求堆积拖垮整个系统。
    • 解决:网关可以对特定服务或 API 进行限流(如每秒只允许100次调用)。当发现某个服务响应缓慢或大量失败时,可以快速熔断,直接返回错误,避免故障扩散。
  1. 负载均衡 (Load Balancing)
    • 问题:一个服务有多个实例,请求应该发到哪个实例?
    • 解决:网关可以将请求均匀地分发到健康的服务实例上。
  1. 日志记录与监控 (Logging & Monitoring)
    • 问题:需要全面了解系统的访问情况和性能。
    • 解决:所有请求都经过网关,因此可以在网关统一收集日志、监控指标(如QPS、响应时间、错误率),是构建可观测性系统的绝佳位置。
  1. 协议转换 (Protocol Transformation)
    • 问题:外部客户端可能使用 HTTP/1.1,而内部服务间可能使用 gRPC 等高性能协议。
    • 解决:网关可以负责不同协议之间的转换,对客户端屏蔽内部实现细节。
  1. API 聚合 (API Aggregation)
    • 问题:一个页面需要调用多个微服务(如用户信息、订单列表),让客户端多次请求效率低下。
    • 解决:网关可以将这些请求聚合成一个请求,在后端并行调用多个服务,将结果组合后一次性返回给客户端。(注意:此功能需谨慎使用,会增加网关复杂度)

1.2常见技术实现

在 Java 技术栈中,主流的网关有:

  1. Spring Cloud Gateway: Spring 官方推出的基于 Spring 5、Project Reactor 和 Spring Boot 2 的异步高性能网关,是当前的主流选择。
  2. Netflix Zuul: Spring Cloud 早期的网关组件,基于 Servlet 同步阻塞模型,性能较差,目前已进入维护模式。
  3. Soul / ShenYu: 一个高性能的、异步的、响应式的 Java 网关,功能非常丰富,支持热更新。
  4. Kong: 基于 OpenResty(Nginx + Lua)的高性能网关,通常作为流量入口,与业务网关分层部署。
  5. 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,至此,网关启动成功。

相关推荐
失散132 小时前
分布式专题——6 Redis缓存设计与性能优化
java·redis·分布式·缓存·架构
杏花春雨江南2 小时前
Spring Cloud Gateway 作为一个独立的服务进行部署吗
java·开发语言
虫无涯2 小时前
LangChain中的Prompt模板如何使用?
服务器·langchain·prompt
GSDjisidi2 小时前
东京本社招聘 | 财务负责人 & 多个日本IT岗位(Java/C++/Python/AWS 等),IT营业同步招募
java·开发语言·aws
绝无仅有2 小时前
面试之MySQL 高级实战& 优化篇经验总结与分享
后端·面试·github
叫我阿柒啊2 小时前
Java全栈开发面试实战:从基础到微服务的完整技术栈解析
java·spring boot·微服务·前端框架·vue·jwt·全栈开发
前行的小黑炭2 小时前
Android:在项目当中可能会遇到的ANR,应该如何解决?
android·java·kotlin
绝无仅有3 小时前
某云大厂面试之Go 实际问题及答案
后端·面试·github