首先,我使用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"
}
{
"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,但这一点是另一个故事。
你怎么看?这是正确的方法吗?答案 0 :(得分:1)
没有正确的方式,因为它取决于您的需求。在你提到的文章中(我是作者,感谢补充!),我描述了一般方法,它具有更好的工作流程described here,这使得它更容易实现,但不是改变这个事实,当你增加服务通信链时,你会为一个请求做更多的CRUD调用。
那么,那可能是什么问题?虽然这是最一致的方法(您总是获得最新的数据状态),但由于您的商店服务与技能服务相关联,因此您缺乏可用性。如果此操作失败并且没有高级缓存设置(例如使用hystrix),则如果技能服务崩溃,则会有2个服务失败。此外,请求将产生更大的网络开销。
另一种方法称为事件源,其中您的技能服务在消息传递通道中通知技能实体的更改,因此所有消费服务都可以通过应用更改日志来计算当前状态。虽然这可以减少网络开销并保证可用性,但您的数据最终会保持一致性#34;
为此您可以使用apache kafka(JHipster也支持)并切换到基于事件的实体通信。这种方法更难实现,因为没有预先构建的功能,因为它们存在于基于REST的安全通信中