微服务设计之大型应用标配:网关+BFF+CQRS

318 阅读8分钟

Api Gateway

API-Gateway-Diagram.webp

API Gateway(应用程序接口网关)是一个用于管理、发布和监控API的服务器。它充当应用程序和后端服务之间的中间层,提供了一种集中管理和控制API的方法。以下是API Gateway的一些关键功能和优势:

  1. 路由和转发: API Gateway可以根据请求的路径、方法或其他标准将请求路由到相应的后端服务。这允许在多个微服务之间进行请求的动态路由。

  2. 协议转换: API Gateway可以将不同的通信协议进行转换,使前端应用程序和后端服务能够使用不同的协议进行通信,提高了系统的灵活性。

  3. 身份验证和授权: 提供用户身份验证和授权功能,确保只有授权的用户能够访问API。这通常包括API密钥、OAuth令牌等身份验证机制。

  4. 请求和响应转换: 在API Gateway中可以对请求和响应进行格式和结构的转换,使前端和后端之间的数据格式保持一致。

  5. 负载均衡: API Gateway可以实现负载均衡,将请求均匀地分发到多个后端服务,提高系统的性能和可伸缩性。

  6. 缓存: 支持对请求结果的缓存,减轻后端服务的压力,提高响应速度。

  7. 分析和监控: 提供对API使用情况的监控和分析功能,包括请求量、响应时间、错误率等指标,帮助开发者了解API的性能和稳定性。

  8. 安全性: 提供一系列的安全功能,包括防火墙、DDoS保护等,确保API的安全性和稳定性。

  9. 版本控制: 允许对API进行版本控制,确保前后端的兼容性,并能够逐步升级API版本。

  10. 降级和容错: 当后端服务不可用时,API Gateway可以提供降级机制,返回预设的错误信息,确保系统对于部分故障情况的容错能力。

网关选型

63171e2671970.avif

对比维度ZuulSpring Cloud GatewayNginxKongNode.js
编程语言JavaJavaCC + LuaJS
成熟度
使用成本较低较低较低
IO模型BIO/Netty(epoll)NettyepollepollAIO
适用场景网关网关负载均衡网关网关

我们之前选择的网关是Kong,还有更多的网关产品可供选择进行二次开发没有介绍,如果有需要可以深入了解

BFF

14f4fa9f8bb84da6ba9324213bd102cc.png BFF(Backend for Frontend)是一种设计模式,通常用于构建前端应用程序与后端服务之间的专门接口。该模式的主要目标是使前端开发者能够更灵活、高效地与后端服务进行交互,同时保持系统的可维护性和扩展性。

以下是BFF模式的一些关键特点和优势:

  1. 定制化接口: BFF为前端应用提供了专门定制的接口,使前端团队能够直接调用符合其需求的数据和服务,而无需依赖通用的后端接口。

  2. 性能优化: BFF可以针对特定的前端页面或组件提供优化的数据响应,避免前端应用获取过多或不必要的数据,提高页面加载和渲染性能。

  3. 解耦前后端: BFF允许前后端团队独立工作,通过定义清晰的接口契约,前端和后端可以并行开发,提高开发效率。

  4. 安全性: BFF可以处理一些前端安全性问题,例如数据脱敏、权限控制等,确保敏感信息不被直接暴露给前端应用。

  5. 聚合数据: BFF可以负责从多个后端服务中聚合数据,为前端提供一致的数据视图,简化前端的数据处理逻辑。

  6. 灵活性: BFF使得前端团队更容易适应不同的前端框架或技术栈,而不必过度依赖后端的技术选择。

  7. 快速迭代: 由于BFF是前端团队专有的接口层,可以更容易地进行快速迭代和更新,而无需影响整个后端服务。

  8. 设备适配: BFF可以根据前端应用运行的设备类型提供不同的数据和功能,以满足不同设备的需求,实现更好的设备适配性。

CQRS

1_sDOCS6W0SxsNRS5KlQoYgQ.png

CQRS(Command Query Responsibility Segregation)是一种软件架构模式,它将系统的读操作(查询)和写操作(命令)分开,采用不同的模型来处理。这个模式的基本思想是命令和查询在逻辑上是不同的,应该由不同的模型来处理。

以下是 CQRS 的一些关键概念和特点:

  1. 分离读写模型:

在传统的架构中,通常使用相同的模型来处理读和写操作。而在 CQRS 中,读和写操作被分离成两个独立的模型。写模型处理命令,负责更新和维护系统状态,而读模型则处理查询,负责提供用于展示的数据。

  1. 命令(Commands)和查询(Queries):

  • 命令(Commands): 表示对系统状态的更改请求。它们触发写模型的操作,例如创建、更新或删除数据。

  • 查询(Queries): 表示对系统状态的读取请求。它们触发读模型的操作,用于获取展示数据。

  1. 独立数据存储:

写模型和读模型通常有独立的数据存储。写模型可能使用传统的关系型数据库,而读模型可能使用专门的数据存储或缓存,以提高查询性能。

  1. 事件驱动(Event Sourcing):

在 CQRS 中,事件驱动是一个常见的概念。写模型不仅更新数据,还会发布相关的事件。这些事件被用于通知其他部分系统发生了变化,读模型可以通过这些事件来更新自己的数据。

  1. 灵活性和可伸缩性:

由于读写操作被分离,系统可以根据负载的不同独立地扩展读和写模型。这提供了更大的灵活性和可伸缩性。

  1. 复杂性:

CQRS 引入了额外的复杂性,因为需要维护两个独立的模型和数据存储。因此,它通常在复杂性和性能需求较高的系统中使用,而不是简单的应用程序。

CQRS 是一种适用于特定场景的架构模式,适用于需要高度灵活性、可伸缩性和复杂性的系统。在使用 CQRS 时,需要权衡其带来的益处和额外的复杂性。

其实许多中大型的公司,业务大了基本上都会形成这样的一个模式,因为拆的足够细;负责写入更新的是一条线,保障的是内容的创作这条线;另外一个负责读的主要是给读者服务的,让读者更好的看到内容。

微服务安全

7-best-practices-for-microservices-security.jpg

微服务安全是确保在微服务架构中系统的数据和功能得到保护的一项重要工作。由于微服务涉及多个独立运行的服务,因此安全性需要在整个系统中进行全面考虑。以下是一些关键的微服务安全考虑因素:

  1. 身份验证与授权:

  • 身份验证: 确保微服务中的每个组件都能够验证服务之间的通信和用户的身份。常见的身份验证方式包括令牌验证、API 密钥、JWT(JSON Web Tokens)等。

  • 授权: 确保每个服务只能访问其需要的资源,并根据用户的权限进行授权。微服务通常采用基于角色的访问控制(RBAC)或基于声明的访问控制(ABAC)等策略。

  1. 通信安全:

  • 加密: 使用传输层安全性(TLS)等协议对微服务之间的通信进行加密,以防止中间人攻击。

  • API 网关: 在微服务架构中引入 API 网关,以集中处理安全性功能,如身份验证、授权、防火墙等。

  1. 数据保护:

  • 数据加密: 对于敏感数据,确保在存储和传输过程中进行加密,以保护数据的机密性。

  • 数据掩码: 在不同的环境中,如测试环境,使用数据掩码来保护敏感信息,以防止泄露。

  1. 服务发现与注册安全:

  • 服务发现: 使用安全的服务发现机制,确保服务的注册和发现是受保护的。

  • API 注册: 控制服务注册的访问,以防止未经授权的服务注册。

  1. 审计与监控:

  • 审计日志: 记录所有关键事件和操作,以便进行审计和故障排除。

  • 监控: 实时监控微服务的性能和安全事件,以快速检测和响应潜在的安全威胁。

  1. 容器安全性:

  • 容器隔离: 在使用容器化部署时,确保容器之间的隔离,限制容器的权限。

  • 镜像安全: 定期审查和更新容器镜像,以消除潜在的漏洞和安全问题。

  1. 更新和部署安全:

  • 持续集成/持续部署(CI/CD)安全: 确保 CI/CD 管道中的每个步骤都是安全的,防止潜在的漏洞被引入到生产环境中。
  1. 第三方依赖安全:

  • 漏洞管理: 定期审查和更新微服务所依赖的第三方库和组件,以修复已知的漏洞。

** 参考链接 **