一、网关基础概念:从“门卫”到“交通枢纽”
说实话,我第一次接触网关这个概念,是在十多年前做一个企业级项目的时候。那时候微服务还没火,我们用的是传统的单体架构。但系统要跟外部第三方对接,就遇到了一个很现实的问题——怎么让外部系统安全地访问我们内部的接口?
当时我的老领导跟我说了一句话,我到现在还记得:“网关就是系统的门卫,所有进出的请求都得经过它点头。”
嗯,这个比喻很形象。但今天我们再来看网关,它已经远不止是“门卫”这么简单了。在微服务架构里,网关更像是一个智能交通枢纽——它不仅要检查通行证,还要做路线规划、流量调度、甚至协议翻译。
1.1 什么是网关?
从技术上讲,网关(Gateway)是一个位于客户端与后端服务之间的中间层。它负责接收客户端的请求,然后根据规则转发给后端的某个或多个服务,最后把结果返回给客户端。
你想想看,如果没有网关,客户端要直接面对几十个甚至上百个微服务。每个服务的地址、端口、协议可能都不一样。客户端得维护一份长长的服务列表,还得自己处理负载均衡、认证鉴权、限流熔断……这画面太美我不敢看。
核心定义:网关是系统对外的唯一入口,所有外部请求都通过它进入内部网络。它屏蔽了后端服务的复杂性,为客户端提供统一的访问接口。
1.2 网关的核心功能
网关到底能干什么?我把它拆成三个核心功能来讲。这三个功能,基本上覆盖了网关90%以上的职责。
1.2.1 协议转换
我在项目中遇到过这样一个场景:前端用的是HTTP/1.1,但后端某个服务只支持gRPC。如果没有网关,前端就得自己实现gRPC客户端,或者后端专门为前端开一个HTTP接口——这两种方案都不优雅。
网关可以帮我们做协议转换。它接收HTTP请求,解析参数,然后转换成gRPC调用,拿到结果后再转回HTTP响应返回给前端。整个过程对客户端完全透明。
| 协议类型 | 常见场景 | 网关处理方式 |
|---|---|---|
| HTTP → HTTP | 前端请求后端REST API | 直接转发,可做请求/响应改写 |
| HTTP → gRPC | 前端调用后端微服务 | HTTP请求转gRPC调用,响应转JSON |
| HTTP → Dubbo | 前端调用Java Dubbo服务 | HTTP请求转Dubbo RPC调用 |
| MQTT → HTTP | 物联网设备上报数据 | MQTT消息转HTTP回调 |
避坑指南:我曾经在一个项目中,网关层做了大量的协议转换,结果性能成了瓶颈。后来我们做了两件事:一是把协议转换逻辑下沉到专门的适配层,二是对高频转换路径做了缓存。网关只做轻量级的协议适配,重活交给下游。
1.2.2 路由转发
路由转发是网关最基础的功能。说白了就是:请求来了,网关根据规则决定把它发给谁。
路由规则可以基于很多维度:
- 路径匹配:
/api/user/**转发到用户服务,/api/order/**转发到订单服务 - 域名匹配:
user.example.com转发到用户服务集群 - Header匹配:根据请求头中的版本号路由到不同版本的服务
- 权重路由:灰度发布时,10%的流量路由到新版本
这里有个细节要注意——网关的路由表通常是动态加载的。我习惯把路由配置放在配置中心(比如Nacos、Consul),网关启动时拉取一次,后续通过监听机制实时更新。这样改路由规则不用重启网关,线上操作非常方便。
// 一个典型的路由配置示例(YAML格式)
routes:
- id: user-service
uri: lb://user-service # 负载均衡方式
predicates:
- Path=/api/user/**
filters:
- StripPrefix=1 # 去掉/api前缀
- id: order-service
uri: http://192.168.1.100:8080 # 直连方式
predicates:
- Path=/api/order/**
filters:
- AddRequestHeader=X-Source, gateway
1.2.3 安全隔离
安全隔离这块,我吃过不少亏。早期有个项目,网关层只做了简单的IP白名单,结果被爬虫扫到了内部接口,数据泄露了。从那以后,我对网关的安全能力格外重视。
网关在安全方面能做的事情很多:
- 认证鉴权:统一校验JWT Token、OAuth2令牌,拒绝未授权请求
- 流量清洗:识别并拦截SQL注入、XSS攻击等恶意请求
- 限流熔断:防止突发流量冲垮后端服务
- IP黑白名单:封禁恶意来源IP
- 参数校验:在网关层做基础的参数合法性检查
重要提醒:网关的安全策略应该是“默认拒绝,按需放行”。不要想着在网关层把所有安全问题都解决掉——网关只是第一道防线,后端服务自身的安全防护同样不能少。我曾经见过一个团队把所有安全逻辑都堆在网关层,结果网关挂了,整个系统裸奔……
1.3 网关在微服务架构中的位置
搞清楚了网关是什么、能干什么,我们来看看它在微服务架构里到底站在哪。
下面这张图是我自己画的,展示了网关在典型微服务架构中的位置:
从这张图可以看得很清楚:网关处在客户端和后端微服务之间。客户端只跟网关打交道,不直接访问任何后端服务。后端服务的地址、端口、协议变化,对客户端完全不可见。
这样做的好处是什么?
- 客户端变轻了:不用维护复杂的服务发现逻辑,只需要知道网关地址就行
- 后端变安全了:内部服务不暴露在公网,攻击面大幅缩小
- 运维变灵活了:后端服务扩缩容、版本升级,客户端无感知
- 治理变集中了:限流、熔断、降级、监控,都在网关层统一做
我的建议:在微服务架构中,网关不是可选项,而是必选项。哪怕你的系统只有两三个服务,我也建议你上一个轻量级的网关。别等到服务多了、问题暴露了再回头加网关——那时候改造成本会高很多。我见过太多团队一开始图省事,后面被坑得欲哭无泪。
1.4 网关的分类
聊到这儿,你可能想问:网关是不是只有一种?其实不是。根据使用场景,网关大致可以分为三类:
| 类型 | 典型代表 | 适用场景 | 特点 |
|---|---|---|---|
| 流量网关 | Nginx、Kong、HAProxy | 全局流量调度、DDoS防护、SSL卸载 | 高性能、专注流量层面 |
| 业务网关 | Spring Cloud Gateway、Zuul | 微服务路由、认证鉴权、协议转换 | 与业务紧密相关、灵活可编程 |
| 安全网关 | WAF、API Gateway(安全版) | Web攻击防护、Bot管理、API安全 | 深度安全检测、规则引擎 |
在实际项目中,这三类网关往往是分层部署的。我习惯的做法是:最外层放Nginx做流量网关,处理SSL和基础限流;中间层放Spring Cloud Gateway做业务网关,处理路由和鉴权;最内层如果有特殊安全需求,再叠加WAF。这样各层职责清晰,出了问题也好排查。
一个小经验:不要试图用一个网关解决所有问题。流量网关和业务网关分开,性能更好,维护也更方便。我曾经在一个项目里把所有逻辑都塞进Zuul,结果网关变得又重又慢,后来拆成Nginx+Gateway两层,问题迎刃而解。
1.5 本章小结
好了,这一章的内容就这些。我们聊了网关是什么、它的三个核心功能(协议转换、路由转发、安全隔离),以及它在微服务架构中的位置。最后还简单介绍了网关的分类。
网关这个东西,说简单也简单,说复杂也复杂。简单是因为它的核心逻辑就是“收请求、做处理、发出去”;复杂是因为在真实的生产环境中,你要考虑的东西太多了——性能、高可用、安全性、可扩展性……
不过别担心,后面的章节我会一个一个拆开来讲。你先把今天的基础概念消化掉,后面学起来会轻松很多。