在我们构建现代分布式系统,尤其是微服务架构的应用时,你是否曾面临过这样的抉择:究竟应该选择通用的 API Gateway 还是更侧重于业务隔离的 Backend For Frontend (BFF) 模式?这两者在架构图上似乎都处于“中间层”,经常被混淆,但它们解决的问题域却截然不同。
在这篇文章中,我们将不仅深入探讨 API Gateway 和 BFF 的核心概念,还会通过实际的代码示例来剖析它们的工作原理,帮助你做出更明智的技术决策。让我们一起来看看如何根据不同的业务场景选择最合适的架构模式。
什么是 API Gateway 模式?
API Gateway(API 网关)是微服务架构中的“守门员”。你可以把它想象成系统的统一入口,所有的客户端请求——无论是来自 Web 浏览器、移动 App 还是物联网设备——都会先到达这里。
当客户端发送请求时,它们并不需要知道后端具体是由哪个微服务来处理的。API Gateway 的核心职责是处理“横切关注点”,这意味着它集中管理那些所有服务通用的功能,比如路由、鉴权和流量控制。
API Gateway 的主要职责
让我们通过一个实际场景来理解。假设你有一个电商系统,用户服务运行在端口 8081,商品服务在 8082。如果没有网关,客户端必须知道所有的服务地址。
#### 1. 请求路由与反向代理
这是 API Gateway 最基础的功能。它根据 HTTP 请求的 URL、Header 或内容,将请求转发到具体的后端服务。
代码示例:使用 Nginx 作为简易网关的路由配置
# /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name api.example.com;
# 用户相关的请求转发到用户服务
location /api/users/ {
proxy_pass http://user-service:8081/; # 转发到后端容器
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 商品相关的请求转发到商品服务
location /api/products/ {
proxy_pass http://product-service:8082/;
proxy_set_header Host $host;
}
}
代码解析:
在这个 Nginx 配置中,我们定义了两个路由规则。当客户端请求 INLINECODE0b0e32fb 时,网关将其拦截并转发给内部的 INLINECODE5068ed00,而客户端完全不知道 user-service 的 IP 或端口。这实现了后端服务的解耦和隐藏。
#### 2. 集中身份验证与授权
与其在每个微服务中重复编写验证 JWT(JSON Web Token)的代码,不如在网关层面统一处理。如果验证失败,网关直接返回 401,请求甚至不会到达后端业务服务。
代码示例:Node.js 网关中间件进行鉴权
“INLINECODEb8f0b249RateLimit-INLINECODE912cde63http://user-service:8081/users/${userId}INLINECODE54dcdb3chttp://order-service:8083/ordersINLINECODE98c4fc60`INLINECODEc9afffa6/api/mobile/home/:userIdINLINECODE8c1cb027screenTitleINLINECODE44ad7a71userNameINLINECODEb5796017fullnameINLINECODE189634d8User-IdINLINECODE8c2655c9if (mobile) then…INLINECODE43721b9e/api/mobile/ 或 /api/web/*`)将请求路由到对应的 BFF 服务。
- BFF 负责“理解”业务,聚合微服务数据,返回完美的 JSON 给客户端。
这种分层既保证了系统的安全性(由 Gateway 负责),又保证了开发的高效性(由 BFF 负责)。希望这篇文章能帮助你理清这两者的关系,在你的下一个项目中设计出更优雅的架构!