0

我正在尝试将一个单体应用程序转换为面向微服务的架构风格。后端我正在使用 spring , spring boot 框架进行开发。前端我使用 Angular 2。并且还使用 PostgreSQL 作为数据库。

在这里,我的困惑是,当我将数据库设计为分布式时,根据功能,它可能包含 5 个数据库。表示我是按照垂直分区设计的。然后我在考虑实现微服务间的通信服务来实现整个功能。

我认为的另一种方式是水平划分当前结构。所以我的领域是基于一些教育大学。因此,一半的大学属于一个数据库,其余的将属于另一个数据库。并根据两个区域部署服务(两个为两组大学)。

目前我决定继续使用最后提到的方法。我对这些类型的任务很陌生,因为它指的是一些架构任务。我也是这个微服务和分布式数据库世界的初学者。有人会确认我的方法可以解决我的问题吗?我可以继续我的第二种方法 - 根据域对象对数据库进行水平分区吗?

4

3 回答 3

2

我可以继续我的第二种方法 - 根据域对象对数据库进行水平分区吗?

暂时是的,如果基于此,您可以扩展当前系统以满足您的需求。

现在让我们考虑一下为什么首先要迁移到 Microserices 作为一种开发风格。

  1. 小型组件 - 更易于管理
  2. 可独立部署 - 持续交付
  3. 多种语言
  4. 代码是围绕业务能力组织的
  5. 和 .....

迁移到微服务时,您不应该让多个服务直接从彼此的数据库中读取,这会使它们紧密耦合。

一个服务应该完全不知道另一个服务是如何设计其内部结构的。

现在,如果您想转向微服务并充分利用它,您应该像您所说的那样进行垂直分区,并且服务可以相互通信。

此外,在转向微服务的同时,您还会遇到很多其他问题。我尝试在此链接上编译如何开始使用微服务。

如何分离从同一个表中读取数据的服务:

现在让我们首先创建一个虚拟示例:我们有三个服务 Order 、 Shipping 、 Customer 都是三个不同的微服务。

以下是多个服务需要来自同一个表的数据的方式:

  1. 服务一需要从其他服务读取数据以进行验证等操作。

订单和运输服务可能需要来自客户服务的一些数据来完成他们的操作。

例如:在下订单时,会调用带有 customer id 的 Order Service API,现在 Order Service 可能需要验证其是否为有效客户。

一种方法 数据库级别暴露——不推荐——使用相同的客户表——将订单服务绑定到客户服务 Impl

另一种方法,调用另一个服务来获取数据

Variation - 1 呼叫客服检查客户是否存在并获取一些客户数据,如姓名,并将其保存在订单服务中

变化 - 2 在下订单时不验证,在 OrderPlaced 事件上与客户服务异步检查,并在需要时验证和更新订单状态

我建议根据您想要的一致性调用另一个服务来获取数据。

  1. 在某些用例中,您希望在来自多个服务的数据之间进行单个事务。

例如:删除客户。您可能希望客户的所有订单也应该被删除。

在这种情况下,您需要处理最终一致性,服务 1 将引发事件,然后服务 2 将做出相应反应。

现在,如果这回答了您的问题,那么请指定在哪种情况下多个服务需要调用另一个服务。

如果还没有解决,你可以发邮件给我 puneetjindal.11@gmail.com,会回复你的

于 2018-03-07T08:31:12.330 回答
0

目前我决定继续使用最后提到的方法。

如果您想为您的数据库提供水平可伸缩性(针对越来越多的客户端连接进行伸缩),那么您最好使用一种旨在作为可伸缩分布式系统工作的技术。CockroachDBNoSQL 之类的东西。例如 Cockroachdb 内置了数据分片和复制,并允许您根据需要添加服务器节点来增长。

当我将数据库设计为分布式时,根据功能,它可能包含 5 个数据库

这听起来像你有正确的一般想法 - 按域功能划分。这是关于使用微服务的一般数据库设计的先前答案的链接。

于 2018-03-06T01:24:05.730 回答
0

在微服务世界中,每个微服务都拥有一组功能以及由这些功能操作的数据。如果一个微服务需要另一个微服务拥有的数据,它不能直接访问另一个微服务维护/拥有的数据库,而是调用另一个微服务公开的 API。

现在,关于数据的放置,有多种选择 - 您可以将微服务拥有的数据存储在 NoSQL 数据库中,如 MongoDB、DynamoDB、Cassandra(这实际上取决于微服务的用例),或者您可以使用不同的表SQL 数据库的单个实例中的每个微服务。但是请记住,如果您选择具有多个表的 SQL 数据库的单个实例,那么不同微服务拥有的表之间将没有连接(基本上没有交互)。

我建议您从小处着手,然后在系统使用量增长时考虑数据库扩展问题。

于 2018-03-07T06:34:26.817 回答