面向初学者的微服务

回顾大约五年前的过去,您可以看到自那时以来对微服务架构的态度发生了多大变化。 最初,它们非常受欢迎。 随着Netflix,Amazon和Gilt.com的成功开发,开发人员认为微服务的实际开发与应用程序开发没有什么不同。 现在,每个人都知道微服务是一种新的体系结构样式,可以有效解决某些问题,它有其优点和缺点。

为了了解什么是微服务以及在什么情况下应该使用它们,我们转向了使用Python的微服务动手Docker的作者Jaime Buelta。 他谈到了该体系结构的优点,并为计划从整体式软件转向它的开发人员提供了建议。

图片

收益与风险


传统的单片应用程序将所有功能组合在单个连接的模块中。 对于微服务,情况恰恰相反。 该应用程序分为较小的独立服务,可以独立部署,更新和替换。 每个微服务都是为一种业务目的而创建的,并且可以使用简单的机制与其他微服务进行交互。

Buelta解释说:“微服务架构是一种构建系统的方式,在该系统中,几个独立的服务以某种方式相互通信(这通常在RESTful Web服务中发生)。 一个关键特性是每个微服务都能够独立于其他微服务进行更新和部署。”
微服务架构不仅定义了如何创建应用程序,还定义了团队的组织方式。

“一个独立的团队可以完全负责微服务。 这样一来,组织就可以成长而无需将开发人员聚集在一起。
微服务的主要优点之一是,它们使您可以引入创新,而对整个系统没有任何特殊影响。 在微服务的帮助下,您可以执行水平扩展,明确模块边界,使用各种技术并进行并行开发。

当被问及与微服务相关的风险时,Buelta回答说:“实现架构的主要困难(尤其是从整体转换时)是创建一种服务将真正独立的设计。 如果无法实现,则服务间通信将变得更加困难,这将导致额外的成本。 微服务需要专业人士,他们将长期确定发展方向。 我建议希望改用这种体系结构的组织指定负责“全局”的人员。 “我们需要更广泛地研究微服务,” Jaime说。

从整体到微服务的过渡


著名作家兼软件顾问Martin Fowler建议坚持“第一是整体”的原则。 这是由于以下事实:从开发的一开始就使用微服务架构存在风险,因为在大多数情况下,它仅适用于复杂的系统和大型开发团队。
“应该鼓励您改用新架构的主要标准是团队规模。 小组不要这样做。 在这种情况下,开发人员已经了解了应用程序发生的所有事情,并且可以随时向同事提出一个明确的问题。 巨石在这些情况下可以完美工作,因此几乎每个系统都以它开头。 这证实了亚马逊的“两个比萨饼规则”,根据该规则,负责一项微服务的团队可以吃两个比萨饼-否则太大。

“随着公司的成长和开发团队的增加,可能需要更好的协调。 程序员经常开始互相干扰。 理解特定代码段的目的变得越来越困难。 在这种情况下,向微服务的过渡是有意义的-这将有助于分担责任并使系统的整体情况更加清晰。 每个团队可以设定自己的目标并主要独立工作,并提供清晰的外部界面。 但是,为了使这种过渡有意义,必须有很多开发人员,” Buelt补充道。

迁移到微服务的建议


Buelta在回答有关开发人员在切换到微服务时可以使用哪些实用建议的问题时说:“成功的微服务架构的关键是每个服务应尽可能独立。”
问题出现了:“如何使服务独立?” 发现系统相互依赖性的最佳方法是考虑新的可能性:“如果要添加新功能,是否可以通过仅更改一项服务来实现? 哪些功能需要几个微服务的协调? 它们会经常使用还是很少使用? “创建完美的设计是不可能的,但是至少您可以使用它来做出正确,明智的决定。” Buelt解释说。

Jaime建议您正确切换到架构,这样您以后就不必重做。 一旦过渡完成,改变微服务的边界将变得更加困难。 他补充说,将更多的时间投入到项目的初始阶段是值得的。
从一种设计模式转变为另一种设计模式是很重要的一步。 我们询问了Jaime和他的团队在向微服务迁移期间遇到了哪些问题,他回答说:

“实际上,主要困难与人有关。 这些问题通常被低估了,但是切换到微服务实际上改变了开发人员的工作方式。 任务不容易!” 他补充说:“我本人也遇到过类似的问题。 例如,我必须培训并向开发人员提供建议。 解释为什么必须进行某些更改特别重要。 这可以帮助人们理解引入他们可能不喜欢的所有创新的原因。

从单片体系结构迁移时,部署以前作为单个模块发布的应用程序可能会遇到许多困难。 它需要进行更彻底的分析,以确保向后兼容并最大程度地降低风险。 应付这项任务有时非常困难。”

选择Docker,Kubernetes和Python作为技术堆栈的原因


我们问了Buelt,他更喜欢哪种技术来实现微服务。 关于语言的选择,答案很简单:“ Python是我的最佳选择。 这是我最喜欢的编程语言!..该语言非常适合微服务。 它方便阅读且易于使用。 此外,Python具有用于Web开发的广泛功能以及可满足任何需求的动态第三方模块生态系统。 这些需求包括连接到其他系统,例如数据库,外部API等。”

Docker通常被誉为微服务最重要的工具之一。 Buelta解释了原因:

“ Docker允许您使用方便的标准化软件包封装和复制应用程序。 这减少了环境的不确定性和复杂性。 它还极大地简化了从开发到应用程序生产的过渡。 最重要的是,减少了设备使用时间。 您可以将多个容器放在一个物理盒或虚拟机中的不同环境中(甚至在不同的操作系统上)。”

关于Kubernetes:

“ Kubernetes允许您以协调的方式部署多个Docker容器。 这使开发人员能够以聚类的方式思考,记住生产环境。 它还允许您使用代码定义集群,以便在文件中定义新的部署或配置更改。 所有这些使诸如GitOps之类的方法成为可能(我在书中对此进行了介绍),同时保持了版本控制系统中的完整配置。 每次更改都是以特定且可逆的方式进行的,因为它是常规的git merge。 因此,还原或复制基础结构非常容易。”

“您必须花时间学习Docker和Kubernetes,但这是值得的。 两种工具都很强大。 另外,他们鼓励您以避免在生产过程中出现问题的方式工作,” Buelt说。

多语言微服务


开发微服务时,您可以使用多种技术,因为理想情况下,每个技术都由一个独立的团队负责。 Buelta分享了他对多语言微服务的看法:“多语言微服务很棒! 这是体系结构的主要优点之一。 多语言微服务的典型示例是将用一种语言编写的旧代码转移到新语言。 微服务可以替换任何其他提供相同外部接口的服务。 但是,其代码将完全不同。 例如,我从旧的PHP应用程序切换到了用Python写的类似物代替。 Jaime补充说:“同时使用两个或多个平台将有助于更好地理解它们,并了解在哪种情况下最好使用它们。”

尽管使用多语言微服务的能力是巨大的架构优势,但它也可能增加交易成本。 Buelta建议:“我们需要知道该措施。 每次都使用新工具并使团队失去彼此共享知识的机会是没有意义的。 具体数字可能取决于公司的规模,但通常来说,无缘无故地使用两种以上三种不同的语言是没有道理的。 您无需增加技术堆栈-开发人员将能够共享知识并开始最有效地使用可用工具。

关于作者


Jaime Buelta是一位专业的程序员和Python开发人员,在他的职业生涯中,他多年来遇到了许多不同的技术。 他开发了适用于各个领域和行业的软件,包括航空航天,网络和通信以及工业SCADA系统,在线视频游戏服务和金融服务。

作为多家公司的一部分,他负责营销,管理,销售和游戏设计等职能领域。 Jaime是自动化的狂热拥护者,他希望计算机能够完成所有艰苦的工作,让人们专注于更重要的事情。 他目前居住在都柏林,并定期在爱尔兰的PyCon会议上发表演讲。

Source: https://habr.com/ru/post/zh-CN480914/


All Articles