一只会飞的旺旺
文章120
标签94
分类15
微服务是什么?

微服务是什么?

小卖铺上新啦!ChatGPT账号大甩卖! 一键直达

简述

微服务是一种软件架构风格,它将一个应用程序分解为一组小型、独立的服务,这些服务可以通过轻量级的机制(通常是HTTP资源API)进行通信。每个服务都围绕业务能力构建,并且可以通过完全自动化的部署机制独立部署和扩展。这些服务之间的管理是最小化的,甚至可以使用不同的编程语言和数据存储技术。

技术特征

  • 围绕业务能力构建(Organized around Business Capability)

    这里再次强调了康威定律的重要性,有怎样结构、规模、能力的团队,就会产生对应结构、规模、能力的产品。这个结论不是某个团队、某个公司遇到的巧合,而是必然的演化结果。如果本应该归属同一个产品内的功能被划分在不同团队中,必然会产生大量的跨团队沟通协作,而跨越团队边界无论在管理、沟通、工作安排上都有更高昂的成本,因此高效的团队自然会针对其进行改进,当团队、产品磨合稳定之后,团队与产品就会拥有一致的结构。

  • 分散治理(Decentralized Governance)

    这里是指服务对应的开发团队有直接对服务运行质量负责的责任,也有不受外界干预地掌控服务各个方面的权力,譬如选择与其他服务异构的技术来实现自己的服务。这一点在真正实践时多少存有宽松的处理余地,大多数公司都不会在某一个服务使用Java,另一个服务用Python,再下一个服务用Go,而是通常会用统一的主流语言,乃至统一的技术栈或专有的技术平台。微服务不提倡也并不反对这种“统一”,只要负责提供和维护基础技术栈的团队有被各方依赖的觉悟,有“经常被凌晨3点的闹钟吵醒”的心理准备就好。微服务更加强调的是在确实需要技术异构时,应能够有选择“不统一”的权利,譬如不应该强迫Node.js去开发报表页面,要做人工智能训练模型时可以选择Python,等等。

  • 通过服务来实现独立自治的组件(Componentization via Service)

    之所以强调通过“服务”(Service)而不是“类库”(Library)来构建组件,是因为类库在编译期静态链接到程序中,通过本地调用来提供功能,而服务是进程外组件,通过远程调用来提供功能。前文我们也已经分析过,尽管远程服务有更高昂的调用成本,但这是为组件带来自治与隔离能力的必要代价。

  • 产品化思维(Product not Project)

    避免把软件研发视作要去完成某种功能,而是视作一种持续改进、提升的过程。譬如,不应该把运维只看作运维团队的事,把开发只看作开发团队的事,团队应该为软件产品的整个生命周期负责,开发者不仅应该知道软件如何开发,还应该知道它如何运作,用户如何反馈,乃至售后支持工作是怎样进行的。注意,这里服务的用户不一定是最终用户,也可能是消费这个服务的另外一个服务。以前在单体架构下,程序的规模决定了无法让全部成员都关注完整的产品,如开发、运维、支持等不同职责的成员只关注自己的工作,但在微服务下,要求开发团队中每个人都具有产品化思维,关心整个产品的全部方面是具有可行性的。

  • 数据去中心化(Decentralized Data Management)

    微服务明确提倡数据应该按领域分散管理、更新、维护、存储。在单体服务中,一个系统的各个功能模块通常会使用同一个数据库。诚然,中心化的存储天生就更容易避免一致性问题,但是,同一个数据实体在不同服务的视角里,它的抽象形态往往是不同的。譬如,Bookstore应用中的书本,在销售领域中关注的是价格,在仓储领域中关注的是库存数量,在商品展示领域中关注的是书的介绍信息,如果使用中心化存储,所有领域都必须修改和映射到同一个实体之中,这很可能使不同服务相互影响而丧失独立性。尽管在分布式中处理好一致性问题也相当困难,很多时候都没办法使用传统的事务处理来保证,但是两害相权取其轻,即使有一些必要的代价,但仍是值得使用的。

  • 强终端弱管道(Smart Endpoint and Dumb Pipe)

    弱管道(Dumb Pipe)几乎是直接反对SOAP和ESB的通信机制。ESB可以处理消息的编码加工、业务规则转换等;BPM可以集中编排企业业务服务;SOAP有几十个WS-*协议族在处理事务、一致性、认证授权等一系列工作,这些构建在通信管道上的功能也许对某个系统中的某一部分服务是有必要的,但对于另外更多的服务则是强加进来的负担。如果服务需要上面的额外通信能力,就应该在服务自己的Endpoint上解决,而不是在通信管道上一揽子处理。微服务提倡使用类似于经典UNIX过滤器那样简单直接的通信方式,所以RESTful风格的通信在微服务中会是更合适的选择。

  • 容错性设计(Design for Failure)

    不再虚幻地追求服务永远稳定,而是接受服务总会出错的现实,要求在微服务的设计中,能够有自动的机制对其依赖的服务进行快速故障检测,在持续出错的时候进行隔离,在服务恢复的时候重新联通。所以“断路器”这类设施,对实际生产环境中的微服务来说并不是可选的外围组件,而是一个必需的支撑点,如果没有容错性设计,系统很容易被一两个服务崩溃所带来的雪崩效应淹没。可靠系统完全可能由会出错的服务组成,这是微服务最大的价值所在,也是本书前言中所说的“凤凰架构”的含义。

  • 演进式设计(Evolutionary Design)

    容错性设计承认服务会出错,演进式设计则承认服务会被报废淘汰。一个设计良好的服务,应该是能够报废的,而不是期望得到长存永生。假如系统中出现不可更改、无可替代的服务,这并不能说明这个服务多么优秀、多么重要,反而是一种系统设计上脆弱的表现,微服务所追求的自治、隔离,也是反对这种脆弱性的表现。

  • 基础设施自动化(Infrastructure Automation)

    基础设施自动化,如CI/CD的长足发展,显著减少了构建、发布、运维工作的复杂性。由于微服务架构下运维对象数量是单体架构运维对象数量的数量级倍,使用微服务的团队更加依赖于基础设施的自动化,人工是很难支撑成百上千乃至上万级别的服务的。

优点

微服务的主要优点是:

  • 灵活性:微服务可以使用不同的技术栈来开发,以适应不同的问题和需求。例如,Netflix使用了Java、Scala、Groovy、Python、Node.js等多种语言来构建其微服务架构。
  • 可替换性:微服务可以根据需要进行替换和升级,而不影响其他服务的运行。例如,The Guardian网站将其单体应用拆分为多个微服务,这样就可以为一些临时的功能(如体育赛事的专题页面)快速开发和移除微服务。
  • 可伸缩性:微服务可以根据负载和性能的变化,单独进行水平或垂直扩缩容,而不需要对整个应用进行扩缩容。例如,Amazon使用了微服务架构来支持其海量的用户和交易,每个服务都可以根据需求进行自动化的扩缩容。
  • 可靠性:微服务可以通过隔离故障和实现容错机制,提高系统的可靠性和可用性。例如,Netflix使用了断路器、超时、重试等模式来处理服务之间的通信失败,以及使用了Simian Army来模拟和测试服务的故障情况。

缺点

微服务也有一些挑战和注意事项,例如:

  • 复杂性:微服务增加了系统的复杂性,需要更多的协调和管理。例如,微服务需要实现服务的发现、注册、路由、负载均衡、监控、日志、安全等功能,以及处理服务之间的一致性、事务、版本等问题。
  • 技能:微服务需要开发团队具备较高的技能和经验,以及持续交付和部署的能力。例如,微服务需要开发团队熟悉不同的技术栈、工具和平台,以及遵循“你构建,你运行”的原则,承担软件的全生命周期的责任。
  • 成本:微服务可能会增加系统的运行成本和维护成本。例如,微服务需要更多的硬件资源、网络带宽、测试覆盖、文档编写等,以及更多的人力投入和沟通成本。

总结

微服务是一种值得考虑的软件架构风格,它可以提高软件的灵活性、可替换性、可伸缩性和可靠性,但也带来了一些复杂性、技能和成本的挑战。微服务并不是一种新颖的创新,它的根源可以追溯到Unix的设计原则和服务导向架构的思想。微服务的适用性和成熟度还需要更多的时间和实践来验证和评估。在选择微服务时,需要根据具体的上下文和需求,权衡利弊,做出明智的决策。

参考文章: Microservices — 微服务 (martinfowler.com)

微信支付码 微信支付
支付宝支付码 支付宝支付