东亚银行、岚图汽车带你解锁 AIGC 时代的数字化人才培养各赛道新模式! 了解详情
写点什么

微服务的定义、优缺点和最佳实践

微服务系统的设计需要一个高层次的视角

  • 2020-03-03
  • 本文字数:2908 字

    阅读完需:约 10 分钟

微服务的定义、优缺点和最佳实践

回顾四五年前,围绕微服务架构的观点已经发生了很大的变化。首先,在看到 Netflix、亚马逊和 Gilt.com 等公司的成功故事后,开发人员认为微服务实际上是应用程序开发的一部分,这是炒作阶段。到现在为止,我们已经意识到微服务是另一种架构风格,当它以正确的方式应用于正确的问题时,会取得令人惊讶的成果,但它也有自己的优缺点。


为了了解微服务到底是什么,什么时候应该使用它们,什么时候不应该使用它们,我们采访了 Jaime Buelta,他是Hands-On Docker for Microservices with Python一书的作者。在介绍微服务及其好处的同时,Buelta 还分享了一些最佳实践,如果开发人员决定将他们的单体架构迁移到微服务,那么他们应该记住这些最佳实践。


在开始使用微服务之前,Buelta 建议在通用软件架构和 Web 服务方面打下坚实的基础。“在处理微服务及其后续工作时,它们将会非常有用,”他说。

微服务:好处和风险

传统的单体应用程序将所有的功能都封装在一个单元中。相反,在微服务架构中,应用程序被划分为可以单独部署、升级和替换的小型独立服务。每个微服务都是针对单个业务目的而构建的,它使用轻量级机制与其他微服务通信。


Buelta 解释说,“微服务架构是一种构建系统的方式,其中,几个独立的服务按定义好的方式彼此通信(通常通过 Web RESTful 服务)。关键在于每个微服务都可以独立更新和部署。”


微服务架构不仅规定了如何构建应用程序,还规定了如何组织团队。


他补充道,“虽然通常我们使用所涉及的技术来描述(它),但它也是一种组织结构。每个独立的团队都可以完全拥有一个微服务。这使得组织的发展可以不受开发人员冲突的影响”。


微服务的主要好处之一是它可以赋能创新,而不会对整个系统造成太大影响。使用微服务,你可以进行水平扩展、有确定的模块边界、使用多种技术进行并行开发。谈到与微服务相关的风险时,Buelta 说,“采用微服务的主要风险,尤其是当起步于一个单体应用时,是设计的服务不是真正独立的。这将增加服务间通信的开销和复杂性。”


他补充道,“从长远来看,微服务系统的设计需要一个高层次的视角。我对正在朝着这种架构发展的组织的建议是,让某人负责“大局”。你不想只见树木不见森林。”

从单体迁移到微服务

著名作家和软件顾问 Martin Fowler 建议采用“单体优先”的方法。这是因为,从一开始就使用微服务架构可能存在风险,因为它主要适用于大型系统和大型团队。


Buelta 同意他的观点,“开始考虑进行这种迁移的主要标准是原来的团队规模。对于小型团队来说,这样做是不值得的,因为开发人员了解所有正在发生的事情,并且可以向坐在房间里的人询问任何问题。单体在这些情况下效果很好,这就是为什么几乎每个系统都是这样开始的。”这就是亚马逊的“双披萨团队”原则。该原则规定,如果一个负责微服务的团队两个披萨都不够吃,那么这个团队就太大了。


“随着业务和团队的增长,他们需要更好的协调。开发人员开始经常互相干扰。了解特定代码段的意图比较困难。这时候进行迁移,将功能分隔,获得更好的清晰度,是有意义的。每个团队都可以设定自己的目标,并且基本上可以独立工作,暴露出一个清晰的外部接口。但要想让这一切有意义,就必须有足够数量的开发人员,”他补充道。

微服务迁移的最佳实践

当被问及开发人员在迁移到微服务时可以采用哪些最佳实践时,Buelta 说,“微服务架构成功的关键是每个服务尽可能独立。”


Buelta 解释说,“这里出现的问题是‘如何使服务独立?’发现系统之间的相互依赖关系的最佳方法是从新特性的角度进行思考:如果有一个新特性,是否可以通过修改单个服务来实现?什么样的特性需要协调几个微服务?是常见的需求,还是罕见的需求?没有哪种设计是完美的,但至少有助于做出明智的决定。”


Buelta 建议使用正确的方法做而不是做两次。他补充道,“一旦迁移完成,就很难对微服务的边界进行更改。在项目初期投入的时间是值得的。”


从一个架构模式迁移到另一个架构模式是一个很大的变化。我们问他和他的团队在这个过程中遇到了什么挑战,他说,“最困难的挑战其实是人。它们往往被低估,但转向微服务实际上改变了人们的工作方式。这可不是件容易的事!”


他补充道,“我遇到过这样一些问题,比如必须为开发人员提供足够的培训和支持。特别是,解释一些改变背后的根本原因。这有助于开发人员理解,为什么他们要做出这些让人感到如此沮丧的改变。”


例如,从单体应用迁移的一个常见抱怨是部署时需要协调,而以前是一次单体发布。这需要更多地考虑如何确保向后兼容和最小化风险。这有时不是很明显,需要专门说明。”

关于选择 Docker、Kubernetes 和 Python 作为技术栈

我们问 Buelta,他更喜欢用什么技术来实现微服务。对于语言,他的回答很简单:“对我来说,Python 是一个非常自然的选择。这是我最喜欢的编程语言!”


他补充道,“它非常适合这项任务。它不仅可读性强、易于使用,而且对 Web 开发也有足够的支持。除此之外,它还有一个充满活力的第三方模块生态系统,可以满足任何可能的需求。这些需求包括连接到其他系统,如数据库、外部 API 等。”


Docker 通常被说成是微服务中最重要的工具之一。Buelta 解释了原因,“Docker 允许将应用程序封装并复制到一个便捷的标准包中。这减少了不确定性和环境复杂性。它极大地简化了应用程序从开发到生产的过程。它还有助于降低硬件利用率。你可以在同一个物理机或虚拟机中安装多个具有不同环境、甚至不同操作系统的容器。”


对于 Kubernetes,他说,“最后,Kubernetes 使我们能够协调部署多个 Docker 容器。它迫使你以集群的方式进行思考,同时还需要时刻考虑生产环境。它还允许我们使用代码定义集群,在文件中定义新的部署或配置更改。所有这些都支持我在这本书中描述的 GitOps 之类的技术,将完整的配置存储在源代码控制系统中。这使得任何更改都是明确的、可逆的,因为它们是常规的 Git 合并。它还使得从零开始恢复或复制基础设施变得简单。”


“Docker 和 Kubernetes 有一定的学习曲线,但是完全值得。两者都是非常强大的工具。他们适合于避免生产环境崩溃,”他分享道。

关于多语言微服务

微服务允许你使用不同的技术,因为在理想情况下,每个微服务都由一个独立的团队处理。


Buelta 分享了他对多语言微服务的看法,“多语言微服务很棒!这是它最大的优势之一。典型的例子是将用某种语言编写的遗留代码迁移到另一种语言。可以用一个微服务替换另外一个公开了相同外部接口的微服务,而它们的内部却完全不同。例如,我已经完成了从旧的 PHP 应用程序到 Python 应用程序的迁移。”他补充说,“作为一个组织,同时使用两个或多个框架有助于更好地理解这两个框架,以及何时使用其中一个框架。”


虽然使用多语言微服务是一个很大的优势,但它也会增加运维开销。Buelta 建议,“不过,需要保持平衡。每次都使用不同的工具,就不能在团队之间共享知识,这不合理。具体的数字可能取决于公司的规模,但一般来说,超过 2 或 3 个应该就需要一个很好的解释,为什么需要在技术栈中引入新工具。保持工具在一个合理的水平也有助于分享知识以及如何最有效地使用它们。”

英文原文

Microservices require a high-level vision to shape the direction of the system in the long term


2020-03-03 11:486677
用户头像
小智 让所有人认同的文字称不上表达

发布了 408 篇内容, 共 377.1 次阅读, 收获喜欢 1972 次。

关注

评论

发布
暂无评论
发现更多内容

Spring Boot Admin 添加报警提醒和登录验证功能!

王磊

从重大漏洞应急看云原生架构下的安全建设与安全运营(下)

腾讯安全云鼎实验室

云原生 安全漏洞 容器安全 安全服务

sonic:基于 JIT 技术的开源全场景高性能 JSON 库

火山引擎开发者社区

原生云

对管理金字塔游戏的感悟:管理的本质是协作

panda

管理

【架构训练营-模块一】

默光

微信 架构设计

ReactNative进阶(二十九):BloC 模式

No Silver Bullet

React Native 1月月更 BloC

介绍一种在ABAP内核态进行内表高效拷贝的方法,和对应的Java和JavaScript版本的伪实现

Jerry Wang

Java JavaScript abap 1月月更

25 Prometheus最佳实践原则

穿过生命散发芬芳

Prometheus 1月月更

从零开发区块链应用(十)--golang协程使用

杰哥的技术杂货铺

golang 区块链 gotoutine

发布uniapp【uniapp 专题 02】

坚果

1月月更

投稿开奖丨“轻量应用服务器”征文活动(11&12月)大奖公布

阿里云弹性计算

阿里云 轻量应用 征文投稿开奖

有的时候我觉得我不会 Markdown

冴羽

前端 写作 markdown markdown语法 vuepress

【译】什么是测试驱动开发

宇宙之一粟

测试驱动开发 1月月更

来自未来的交互设计!当电影中的一切变为现实,设计师要如何进化?

博文视点Broadview

从零开发区块链应用(七)--gin框架参数获取

杰哥的技术杂货铺

golang 区块链 gin框架

一线开发人员,你对项目了解多少?

蜜糖的代码注释

Java 程序员 后端技术

2021 大促 AntMonitor 总结 - 云原生 Prometheus 监控实践

SOFAStack

云原生 分布式架构 SIGMA

RocketMQ 源码探究 -- 延迟队列实现

周文童

RocketMQ #java

2021总结和2022趋势--《香帅中国财富报告》(7/100)摘录

hackstoic

投资

IDEA注释模板,惊艳了,动作要快,姿势要帅

碌碌无为小码农

Java 架构 程序人生 编程语言 经验分享

干掉 PowerDesigner,这款数据库设计神器真的绝了!!!

沉默王二

从零开始学Mysql - 字符集和编码(下)

懒时小窝

微信业务架构图、学生管理系统毕业架构设计

石小天

架构实战营

01uni-app基础教程 环境配置【uniapp专题1】

坚果

uni-app 1月月更

Flink 实现 MySQL CDC 动态同步表结构

腾讯云大数据

flink 源码 流计算 Oceanus

架构学习【01】——架构图初探

tiger

架构实战营

从零开发区块链应用(六)--gin框架使用

杰哥的技术杂货铺

golang 区块链 gin框架

03uniapp的生命周期【uniapp 专题 03】

坚果

小程序 uniapp 1月月更

微信业务架构图与“学生管理系统”毕设架构设计

唐尤华

架构实战营

架构设计图

风中奇缘

架构实战营 「架构实战营」

TiDB Cloud 上线亚马逊云科技 Marketplace,为全球用户提供云端一栈式实时 HTAP 数据库体验

PingCAP

微服务的定义、优缺点和最佳实践_架构_Bhagyashree R_InfoQ精选文章