两个微服务之间通信的架构

时间:2017-02-24 22:12:42

标签: java architecture communication jhipster microservices

首先,我使用JHipster 4.0.x作为我的项目。我正在使用微服务架构。

对于这个例子,我有一个网关,一个微服务用于"存储"第二个用于"技能"。 我想将所有商店集中在一个数据库中,将技能集中在第二个数据库中。

每个都是一个不会以相同的速度发展的数据存储库。另一方面,它们将成为我的基础设施的中心点,以便通过ESB更新其他软件。

Jhipster非常棒,我为每项服务轻松获得了CRUD。

棘手的一点是商店是由技能定义的。最简单的方法是说我只用" Skill"和" Store"。但我无法做到这一点,因为" Skill"也必须是其他数据的中心点。

我想象了这个实体的架构

[技能]

[STORE] ----多到一个---- [LINK_WITH_OTHER_ENTITIES]

(由jhipster生成* .json):

  • 关于技能服务:

    • 实体技能

    { "fluentMethods": true, "relationships": [], "fields": [ { "fieldName": "code", "fieldType": "String" }, { "fieldName": "libelle", "fieldType": "String" } ], "changelogDate": "20161201084915", "dto": "no", "service": "no", "entityTableName": "filiere_metier", "pagination": "no", "microserviceName": "metiers", "searchEngine": "elasticsearch" }

  • 商店服务
    • 实体商店

    { "fluentMethods": true, "relationships": [ { "relationshipName": "categorie_metier", "otherEntityName": "pont_msvc", "relationshipType": "many-to-one", "otherEntityField": "id" } ], "fields": [ { "fieldName": "code", "fieldType": "String" }, { "fieldName": "lib", "fieldType": "String" } ], "changelogDate": "20161125141916", "dto": "no", "service": "no", "entityTableName": "store", "pagination": "no", "microserviceName": "store", "searchEngine": "elasticsearch" }

    • 与Skill建立链接的实体

    { "fluentMethods": true, "relationships": [], "fields": [ { "fieldName": "idext", "fieldType": "String" }, { "fieldName": "msvcName", "fieldType": "MicroServices", "fieldValues": "gw,metier" }, { "fieldName": "msvcEntityName", "fieldType": "String" } ], "changelogDate": "20161208100401", "dto": "no", "service": "no", "entityTableName": "pont_msvc", "pagination": "no", "microserviceName": "store", "searchEngine": "elasticsearch" }

然后,当我在商店购买CRUD时,我也会使用来自Skill的CRUD,感谢this article,但这一点是另一个故事。

你怎么看?这是正确的方法吗?

1 个答案:

答案 0 :(得分:1)

没有正确的方式,因为它取决于您的需求。在你提到的文章中(我是作者,感谢补充!),我描述了一般方法,它具有更好的工作流程described here,这使得它更容易实现,但不是改变这个事实,当你增加服务通信链时,你会为一个请求做更多的CRUD调用。

那么,那可能是什么问题?虽然这是最一致的方法(您总是获得最新的数据状态),但由于您的商店服务与技能服务相关联,因此您缺乏可用性。如果此操作失败并且没有高级缓存设置(例如使用hystrix),则如果技能服务崩溃,则会有2个服务失败。此外,请求将产生更大的网络开销。

另一种方法称为事件源,其中您的技能服务在消息传递通道中通知技能实体的更改,因此所有消费服务都可以通过应用更改日志来计算当前状态。虽然这可以减少网络开销并保证可用性,但您的数据最终会保持一致性#34;

为此您可以使用apache kafka(JHipster也支持)并切换到基于事件的实体通信。这种方法更难实现,因为没有预先构建的功能,因为它们存在于基于REST的安全通信中