使用 Django REST 框架跨微服务共享数据库关系

Posted

技术标签:

【中文标题】使用 Django REST 框架跨微服务共享数据库关系【英文标题】:Sharing database relations across micro-services with Django rest framework 【发布时间】:2019-02-27 17:27:33 【问题描述】:

我有两个 django REST API 项目,我已将它们解耦为微服务架构,其中一个服务是处理身份验证的 (SSO)(我正在使用基于 JWT 令牌的身份验证)和管理用户信息,另一个是工资服务。

问题是user 与工资单服务中的某些模型有关。具体来说,我在工资单服务中有一个Employee 类,它有一个user_id 字段。我将在此处添加一个用户 UUID,我将从查询 SSO 服务中获得该用户。

考虑到每个服务都有自己的数据库,我如何跨微服务共享数据库。

【问题讨论】:

如果你确实需要从一个服务访问两个数据库,Django 确实支持multiple databases 的配置;这不适合您的用例吗?虽然在我看来,当您使用微服务时,从身份验证服务的端点获取所需的任何用户数据可能更合适,而不是通过直接访问数据库来破坏架构。 在服务之间共享数据库通常被认为不是一个好的选择。但最后,这取决于程序员。以下 2 篇文章对这两种模式进行了广泛的解释。这将帮助您做出决定。最后,如果你想共享数据库,Django 支持对多个数据库的配置,如@kungphu microservices.io/patterns/data/database-per-service.html microservices.io/patterns/data/shared-database.html 【参考方案1】:

不建议跨有界上下文共享数据库,因为每个微服务都应该能够更改其持久化数据的方式。 允许多个微服务管理数据库会导致您陷入死星陷阱模式

但是,您可能希望将身份验证上下文中的用户数据副本/更新发送到您的工资单服务。这样,您可以 拥有独立的数据持久化策略。一种方法是在您的身份验证上下文中实施事件发射策略, 此事件发射策略将负责广播在订阅者所在的身份验证上下文中所做的数据更改 另一个有界上下文可以侦听,以便他们可以将您的用户数据副本存储在自己的持久层上。

【讨论】:

以上是关于使用 Django REST 框架跨微服务共享数据库关系的主要内容,如果未能解决你的问题,请参考以下文章

跨微服务发送公共 API 版本控制

Django Rest框架:序列化程序上的共享字段

Django Rest框架 - 如果表包含响应显示服务器错误(500)的数据

如何将跨微服务的端到端测试包含到多个持续交付管道中?

Django rest框架拉入外部json数据

使用 django rest 框架进行单点登录服务的任何可能方式?