在微服务架构中,网关的作用是什么
一、 标准面试回答模版(建议背诵)
面试官: 在微服务架构中,网关的作用是什么?为什么我们需要它?
Fox版标准回答: “ 如果你只回答‘网关是用来转发请求的’,那你只看到了第一层。 网关的本质是微服务架构中的‘统一门面’(Facade Pattern)。
我对网关的理解,可以概括为‘一个入口,四个核心职责’:
- 一个入口(Unified Entry):
- 它是所有客户端(App、Web、小程序)和后端微服务之间的唯一入口。
- 客户端不需要知道后端几百个服务的具体 IP 和端口,只需要找网关就行。这就实现了客户端与服务端的解耦。
- 四个核心职责
统一鉴权(Authentication):
‘保安’的角色。你不能在每个微服务里都去校验 Token,那代码重复率太高了。鉴权逻辑必须上移到网关,校验通过后,把用户信息(User ID)塞进 Header 传给下游。
动态路由(Dynamic Routing):
‘调度员’的角色。根据请求路径(
/order/**或/user/**),把请求转发给 Nacos/Eureka 里注册的对应服务实例。限流熔断(Rate Limiting):
‘大坝’的角色。当流量洪峰来了,网关是第一道防线。利用 Sentinel 或 Redis 令牌桶算法,在入口处把多余的请求拦住,保护后端服务不被压垮。
协议转换(Protocol Conversion):
‘翻译官’的角色。对外暴露的是 RESTful (HTTP/JSON),对内可能是性能更好的 RPC (Dubbo/gRPC)。网关负责这层协议的转换。”
二、 核心原理与场景层面的体现
1. 场景一:统一鉴权的架构演进
面试官潜台词: 鉴权到底该在哪里做?
没有网关时(反例):
Service A 要校验 Token,Service B 也要校验 Token...
一旦鉴权逻辑变了(比如从 JWT 换成 OAuth2),你要改几十个服务的代码。这是架构设计的耻辱。
有网关时(正例):
Client -> Gateway (校验 Token -> 解析 UserID ->
Header.add("X-User-Id", id)) -> Service A。Service A 根本不需要懂 JWT,它只需要从 Header 里拿
X-User-Id就行了。这叫关注点分离。
2. 场景二:BFF 模式 (Backend for Frontend)
面试官潜台词: 手机端和 PC 端需要的数据不一样怎么办?
Fox 点评: “手机屏幕小,只需要 3 个字段;PC 屏幕大,需要 10 个字段。如果共用一个接口,手机端会浪费流量(Over-fetching)。
网关的 BFF 能力: 我们可以针对不同的客户端,建立不同的网关或者路由聚合逻辑。
网关把 Service A 的数据和 Service B 的数据聚合(Aggregation)之后,裁剪成手机端需要的格式返回。这就叫为前端服务的后端。”
三、 Fox 的深度解析
如果面试官追问:“网关这么多好处,那它有什么坏处?Spring Cloud Gateway 和 Nginx 怎么选?”
Fox版解析:
1. 架构的权衡(Trade-off): “Listen carefully! 网关是万能的吗?No。
性能瓶颈风险: 所有流量都走网关,它就是全链路的咽喉。如果网关挂了,全站瘫痪(SPOF)。
解决方案: 生产环境必须高可用(HA)部署。
通常是:
VIP (Keepalived)->Nginx 集群 (L4/L7 负载均衡)->Gateway 集群 (业务网关)。网络延迟: 毕竟多了一次网络跳转(Hop),但在内网环境下,这几毫秒的损耗通常是可以接受的。
2. 选型鄙视链:
Nginx / OpenResty (Kong, APISIX):
C/Lua 语言,基于 Epoll。
性能王炸,单机几万甚至十万 QPS。适合做流量网关(最外层,只做转发和简单鉴权)。
Spring Cloud Gateway:
Java 语言,基于 Netty + WebFlux (Reactor)。
生态无敌,和 Spring Cloud、Sentinel、Nacos 无缝集成。
性能虽然比不上 Nginx,但在业务网关(涉及复杂业务逻辑、鉴权、聚合)场景下,它是首选。因为它容易二次开发,Java 程序员能看懂。
Zuul 1.x:
基于阻塞 IO (Servlet 2.5)。
已经过时了,别在简历上写这个,除非你想去维护十年老代码。
总结:对外抗流量用 Nginx/Kong,对内搞业务用 Spring Cloud Gateway。这就是云原生时代的‘黄金搭档’。”