共享库与微服务之间的区别是什么?

8
我有两个微服务(ms) ms1 和 ms2。在这两个ms中都有重复的可重用代码(如哈希/安全相关/orm等)。只是提供信息,这些可用代码有时也可以在DB中维护一些状态(如果有任何影响)。
我有两种方法可以选择:
1. 将可重用代码提取为单独的库并包含在两个ms中。 2. 为此可重用代码创建单独的ms,并将其公开为rest端点。
如果我采用第二种方法,优点是在任何更改情况下,我只需重新部署ms3。如果采用第一种方法,则需要重新部署两个ms。同时,第二种方法将需要单独的维护/资源/监控。
从系统设计的角度考虑,哪种方法更理想,考虑到硬件资源不是一个挑战。我只提到了两个微服务,但在某些情况下可能会有多个具有重复代码的微服务。
我不确定什么标准可以帮助我决定是走共享库还是微服务?
更新:我从以下博客中得到了一些清晰度,但仍有问题。如果需要,我将思考并发布新问题。

https://blog.staticvoid.co.nz/2017/library_vs_microservice/

https://dzone.com/articles/dilemma-on-utility-module-making-a-jar-or-separate-2


当您有更多、更大的项目时,您会怎么做? - Thorbjørn Ravn Andersen
1
“资源/监控/更多工作属性”是需要考虑的非常重要的事情。让两个应用程序写入同一张表格/S3存储桶/队列/Kafka主题/或其他任何地方都是一个坏主意,只有一个应用程序应该具有写入权限。 - luk2302
2
@luk2302 你在混淆完全不同的问题。Table 可能不会,但是有很多好的理由让不同的服务写入同一个 S3 存储桶或 MQ。 - chrylis -cautiouslyoptimistic-
@ThorbjørnRavnAndersen,您是否在说当您需要在多个项目中重用相同的代码时,微服务是更好的方法? - user3198603
2
这个问题写得很好,可以/应该用事实和引用来回答。它应该重新开放。 - Michael Freidgeim
显示剩余2条评论
1个回答

7
微服务只是架构风格之一。在某些情况下,它比其他风格更好,在某些情况下则不如其他风格。如果您不使用微服务,这并不意味着您的架构不好。
如果您仍然想使用微服务,则这些方法(共享库 vs. 库作为新的“微服务”)都不好。
我建议考虑以下几点:
1. 微服务方法并不意味着每个端点都应该封装到单独的微服务中。很正常,一个微服务提供多个不同的端点。如果这是您的情况,请将两个服务放入单个微服务中,并通过两个不同的端点使它们可达。然后,如果它们共享一些类,那么就没问题了。
2. 微服务通常应具有独立的持久性层。如果在共同的持久性层上有强依赖关系,请检查将它们拆分为不同的微服务的原因。它们是否真正处理不同的业务领域?这些服务是否可以相互独立地开发和部署?如果不能,那么也许将它们放入单个微服务中会更好。然后,如果它们共享一些类,那么就没问题了。
3. 良好的微服务应为某个域提供功能。如果将共享代码放入单独的微服务中,那么您的共享“微服务”可能不为任何域提供任何功能,而只是一种实用程序包装器。那将不是一个微服务。
4. 如果有充分的理由将服务分成两个不同的微服务,则复制代码。每个微服务应该相互独立。应该能够替换数据库并替换一个微服务的任何类,而不会影响另一个微服务。使它们相互独立的一种正常方式是复制您(目前)认为是共享的类。如果这些服务确实相互独立,那么随着时间的推移,这些重复的代码将发生变化,并且在每个微服务中将是不同的。如果必须同时更改这些代码,则意味着您的拆分不正确,并且您所拥有的不是微服务。

1
“然后复制代码”:来自https://dev59.com/21UM5IYBdhLWcg3wW_J6#48961173,“某些类型的耦合是绝对不允许的(例如共享数据库或使用内部接口)。但是,使用公共库不是其中之一。” - Michael Freidgeim
1
如果这是一个常见的功能,请进行修复/增强,这将对所有微服务有用(在一个地方维护代码),并在每个微服务准备就绪时更新(微服务可以使用不同版本的公共库)。如果您的新更改只对单个微服务有用,请克隆代码并将其保存在相关存储库中,因为它不再是常见功能(但其他类将保留在公共库中)。 - Michael Freidgeim
我正在使用git子树在不同的代码库之间共享代码。https://dev59.com/vaDia4cB1Zd3GeqPFYto - Michael Freidgeim
此外,对于所有微服务都有这样的库会使发布过程变得缓慢,因为您需要与其他人达成一致:其他人需要时间来审查它,然后您需要时间来反映他们的异议或愿望,再次建议更改,再次审查,迭代。然后等待每个服务的测试结果。然后进行破坏其他服务的更改。迭代。这并非不可能。但是它缓慢。而微服务背后的一个想法是希望尽可能独立地经常发布。 - mentallurg
让我们在聊天中继续这个讨论 - mentallurg
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接