有很多答案和博客文章说"永远不要在微服务之间共享代码"我现在想知道我应该如何遵循这个建议。我有以下微服务,每个都通过RabbitMQ进行通信:
快速服务器和两个不同的后台服务具有完全不同的代码,而请求工作者只是多个实例。每个请求工作者都应该处理一个请求,并在完成后直接回复它(RPC)。
我的问题:
我编写了一个类(RequestScheduler
),它提供了安排请求的方法(例如getProfile: Promise<IProfile>
)。因为我显然不允许在微服务之间共享代码,微服务之间的通信代码怎么样?
我没有看到如何避免在左侧与我的微服务共享该代码。
答案 0 :(得分:1)
在我所见过的有关微服务体系结构的讨论中,对交叉问题的关注通常没有得到很好的记录-可能是因为乍一看它们似乎与概念相反(尽管事实并非如此)。在开发我们的应用程序时(第一次使用微服务),我们遇到了与您所询问的问题类似的问题。与一些经验丰富的人交谈后,我们意识到微服务的概念更多地是关于 Domain 封装的,因此围绕大小,库共享,等都是微服务具有单一职责(SRP)并拥有一个定义明确的域(DDD)的思想的次要观点。
我们有一些库(我们以NuGet包的形式管理),用于将新服务连接到事件总线,管理授权,跨服务事件日志记录,甚至是用于错误处理的标准中间件-我们几乎在所有共享库中共享这些库我们所有的服务。
尽管我们还没有为其定义硬性规则,但是我想说我们将代码重用的方式定义为“如果我们生态系统中的所有微服务都需要它,那么它必须作为共享库提供。如果他们大多数人都可以使用它,它应该作为共享库使用。 每个微服务都可以选择是否实现共享库或推出自己的解决方案。”
只要您的共享代码以允许每个微服务独立管理自己的升级的方式进行分发,并且您的共享代码不受任何域特定语言或问题的影响,就一定可以共享!
答案 1 :(得分:0)
@kentor日志记录是一个贯穿各领域的问题。如果有一个公司标准用于记录并且可以使用模块或库,那么您可以使用该库。它是共享的,但这很好,因为日志记录非常孤立,不应干扰您的业务域逻辑或工作流。微服务的一般准则是不共享代码。可以共享的东西是不经常像美国国家,颜色等那样经常改变的图书馆。要回答你的问题what about the code for the communication between the microservices
,我会说不要分享这段代码。将此代码/库共享代码到其他应用程序可能会引入副作用错误。
答案 2 :(得分:0)
code for the communication between the microservices
对我来说就像是一个库或包,不会经常更改。为什么不将其用作包装?
一个好的选择是在私有npm注册表中制作一个程序包。这样您就可以拥有该软件包的其他版本。因此,使用语义版本控制将确保您安全。