API Gateway vs Backend For Frontend (BFF):架构深度解析与实战

在我们构建现代分布式系统,尤其是微服务架构的应用时,你是否曾面临过这样的抉择:究竟应该选择通用的 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 负责)。希望这篇文章能帮助你理清这两者的关系,在你的下一个项目中设计出更优雅的架构!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/48489.html
点赞
0.00 平均评分 (0% 分数) - 0