微服务和共享库


9

我们正在设计基于独立微服务(通过RabbitMq总线连接)的系统。该代码(至少对于第一个组件而言)将以python(python2和python3)编写。我们已经有一个实现某些业务逻辑的整体应用程序,我们希望将其重构为微服务并进行扩展。让我担心的一个问题是:

在不同的微服务之间共享代码的最佳方法是什么。我们具有通用的帮助程序功能(数据处理,日志记录,配置解析等),多个微服务必须使用这些功能。

微服务本身将被开发为单独的项目(git存储库)。通用库也可以作为一个独立项目开发。如何在微服务之间共享这些库?

我看到几种方法:

  • 围绕每个微服务所需的库版本进行复制,并根据需要进行更新
  • 将通用库发布到内部PyPi,并将这些库列为微服务需求中的依赖项
  • 将库存储库包含为git子模块

在决定如何进行之前,我想阅读更多有关建议的方法,最佳实践和过去的经验。您有什么建议或链接吗?


我本人对微服务还不够精通(我的公司最近开始做类似的事情)来回答,但是这里有一个演示文稿的链接,该演示文稿说明了为什么您所描述的是危险信号并可能导致“分布式整体” 。微服务不应具有必需的共享库。实际上,它们仅应在定义良好的api(如Swagger)(现在称为Open API)之间进行通信。
上尉曼

@CaptainMan:当然可以,但是我们有一个简单的功能:(fib(n)斐波那契数列的实现)。您不想在每个微服务中重复该实现。属于一个utils库(针对功能和错误修正的版本)。那不是分布式的整体,只是通用功能的一层。我的问题是如何在实施级别处理此层?
blueFast

我们的微服务具有共享库,以确保它们以相同的方式与系统中的所有其他微服务对话。我不确定如何使用非共享库来做到这一点;每个人至少都需要一些XML / JSON / etc操作库。我还没有看过该演示文稿,但是您想到的“共享库”的含义比我所想的更具体吗?
Ixrec

1
@ jeckyll2hide我们使用C ++,但我们对这些基础设施是大致相当于你的第二个项目符号点:独立式回购,每个人都宣称自己的依存关系,知道如何找到在构建时,等这些依赖标准构建系统
Ixrec

1
我觉得自己像个假人,您所问的不是真正地关于微服务共享库,而是在问如何与团队共享团队的库。我对此有足够的了解,可以发布答案。
上尉曼

Answers:


5

您的第二个选择肯定是要走的路。分解通用库并将其安装到本地PyPi服务器上。

选项1太可怕了,因为对库的改进将很难传播给其他可能使用它的人。

选项3与选项1相似。

常见的模式是设置Jenkins,以便当您压入库回购的母版时,它会执行python构建并将其自动上传到PyPi回购。一旦编写了这个构建脚本,您将不必担心打包库并将它们手动上传到PyPi。使用此选项,所有库更新将立即可用,以可能升级到其他微服务。

设置自己的PyPi服务器非常容易。我喜欢这个指南


1
我同意选项2是最好的,但选择3子模块有很多共同点多与选项2比1的选项
8bittree

@ 8bittree:是的,选项3与选项2类似,但是让git服务器(“中央”远程)成为程序包分发机制。一方面,它正在使用git进行某些操作(依赖管理),另一方面,它减少了组件的数量(无需使用私有PyPi)
blueFast 16'Aug

2

不是Python的人,但PyPi服务器似乎是最佳选择。快速搜索可以使外观看上去像为团队的Java jar提供Nexus回购协议一样。

只要将它部署到某种中央存储库(到办公室/团队)中,您选择的依赖项管理工具就可以使用(读取和部署到),那么这是一个不错的选择。

选项1确实是最糟糕的,您永远不必手动处理依赖项。真痛苦 在上大学之前,我不了解Maven,当我认为Git太复杂时,我们手动完成了所有工作,从合并每个人的代码到设置类路径,再到获取依赖项。真是痛苦,我真的不想让任何人经历那部分麻烦,尤其是在效率至关重要的工作环境中。

选项3可能会很好用,但是它与本地PyPi相比并没有任何实际好处(除了可能更容易设置之外,但真正的依赖项管理系统的好处要好得多)。


1

首先,将整体拆分为微服务总是很困难。有关原因的信息,请参见分散式数据管理-将数据库封装到微服务中。

也就是说,有几种方法可以相对合理地做到这一点。其中之一是http://12factor.net/。有人说您应该独立维护每个库和应用程序,然后显式管理依赖项。如果您走这条路线,那么我将强烈建议您使用一个简单的命令,将所有依赖关系更新为当前的依赖关系,并为每个微服务定期运行它。有一个合理的发布过程很重要,在此过程中您可以锁定生产中的库版本。但是你真的,真的真的不希望在一个位置,让依赖陈旧的,你不知道什么是在那里。

还应集中精力使后备库尽可能紧凑和集中。总是很自然地开始将内容添加到核心库中以便于共享。这样做,您将迅速将现有意大利面条的整个范围拖入共享库中,并有效地恢复到现在的混乱状况。因此,最好对另一种方法进行过度校正。


0

您应该能够通过直接从Python软件包依赖项文件指向包含这些库的私有GitHub存储库而变得无服务器。我相信Pipenv和Poet都支持这一点。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.