“软件正在吞噬整个世界。” ——Marc Andreesen
世界的现状:
世界上最大的图书商是软件公司:Amazo
世界上最大的音乐商店也是软件公司:iTunes,Spotify和Pandora
世界上最大的猎头公司也是软件公司:LinkedIn
世界上最大的营销平台也是软件公司:Google
世界上增长最快的电信公司也是软件公司:Skype
六十年前的计算机革命,四十年前的微处理器发明,二十年前的互联网兴起,所有这些技术最终都通过软件来改变各个行业,并且在全球范围内广泛推广。
互联网快速发展数据表:
互联网已经成为千家万户生活、学习和工作不可缺少的一部分了。在新的世界秩序中茁壮成长的公司拥有技术作为其核心竞争力。他们构建复杂的云应用程序,不断地为市场带来新的功能和特性。尽管云应用程序不断迭代和更新,但这些软件如磐石般可靠。他们如何实现这样的灵活性和可靠性?
在过去的几年里,Amazon、Uber、Airbnb、Netflix、Yelp以及许多其他行业的革新者采用了一种新的模式来开发云应用——微服务,微服务也使得软件架构被提上议程。
不论你是否熟悉微服务,或者还未听说过,都没关系,这篇来自Richard Li(Datawire的联合创始人兼首席执行官)的文章将向大家阐释微服务的定义、作用,以及影响。
Lesson1 : 什么是微服务?
微服务这一概念出现于2012年,因敏捷开发方法创始人之一的Martin Fowler而流行,微服务架构是一项在云中部署应用和服务的新技术。
微服务可以在“自己的程序”中运行,并通过“轻量级设备与HTTP型API进行沟通。”关键在于改服务可以在极致的程序中运行。
有些人将微服务描述为将单片软件应用程序分割成更小的部分。这个解释也不是特别完整,它还忽略了微服务的好处——每个开发团队都可处理一个独立的可交付的代码单元。最好将微服务描述为“分布式开发云应用的体系结构”。
例如,最初的Amaozn只是一个单一的应用程序,由数百万行C++组成。随着时间的推移,Amazon已经将单片应用程序的功能拆分为更小的服务,因此有了一个单独的服务用于推荐、付款、搜索等等。反过来,这些单独的服务可能由几十个较小的微服务组成。
Amazon初始架构中,推荐服务的bug修复需要更改单片应用程序中某些C++ ,等待其他组完成对单片应用程序的更改,并测试整个应用程序以进行发布。在微服务体系结构中,推荐开发团队可以对其微服务进行更改,并在未与其他功能团队协调的之前下发布。
Yelp还采用了微服务架构,这个架构由数百个服务组成。仅仅加载Yelp主页就会调用数十个微服务,例图如下。
微服务作为一项云中部署应用和服务的新技术,已成为当下最新的热门话题。大部分为稍微服务的争论都集中在容器或其他技术是否能够很好地实施微服务。企业和服务提供商正在寻找更好的方法将应用程序部署在云环境中,微服务被认为是未来的方向。通过将应用和服务分解成更小的、松散耦合的组件,它们可以更加容易升级和拓展。
Lesson2 : 为什么采用微服务?
微服务的六大主要好处:
1、增强灵活性
微服务使开发组织能够更快地响应市场和客户反馈。无论它是一个改变游戏规则的功能,还是一个使现有功能更加可用的调整,它的发布都不会因为单一版本的时间表而推迟。相反,每个微服务都可以独立发布。
2、组织规模
对于一个庞大体系,每增加一个开发人员,破坏代码的风险就大大增加。这会降低开发速度,因为需要额外的测试、调试和集成来防止无意中出现的错误。在微服务体系结构中,每个团队都在独立的代码基础上工作,因此错误被隔离到单个微服务中。
3、 开发效率
整体式开发团队被限制在一个通用的技术堆栈和过程中。Microservices 体系结构允许独立的团队为给定的服务选择正确的流程和技术。例如,PCI 标准要求任何处理信用卡数据的代码库都必须接受遵从性审计。通过由单个或一组微服务微服务处理支付处理,范围内的代码量将大大减少。或者可以用Python编写一个推荐引擎来使用TensorFlow机器学习库,而其他服务则是用Java编写的。
4、具有成本效益的扩展
在一个传统的单体,整个应用程序必须规模化时,它将达到其极限。例如,如果应用程序不能执行,则必须添加能够运行独立的其他实例的新服务器。在微服务体系结构中,每个微服务都可以单独扩展。
因此,只有给定的微服务才会添加新的服务器,这是一个瓶颈。这种更细粒度的扩展方法使得计算模型更具成本效益。
5、 更快的入职
使用microservices,新工程师可以安全地开始在一个小型的microservice上进行编码。对于一个工程师来说,没有必要仅仅为了修复一个bug 而去学习一个单片代码库。
6、吸引更多有才华的工程师
Microservices 使您能够逐步采用和测试新技术——优秀的工程师希望使用最新的技术。
微服务并不适合所有人
虽然微服务微服务有很多好处,但并不适合所有人。特别是拥有小型工程团队的组织应该考虑整体优先的方法。在这些组织中,开发团队不具备同时独立迭代多个特性的能力。 首先采用整体,然后随着团队的强大添加微服务,这通常是一个两全的绝佳策略。
Lesson3 : 采用微服务架构的影响?
采用微服务架构会达到显著的成效,但也会带来相当大的变化。预计会有三种类型的变更:文化,部署基础架构和开发人员基础架构。
#团队拥有更大的自主权
采用微服务微服务的最大变化可能是文化。为了提高敏捷性和效率,microservices 开发团队做出以前无法控制的决策,比如发布日期。许多组织还授权团队定制他们的 QA 策略或技术栈。
重新分配决策权需要更变人员构成和培训内容。将更多的交货日期决定权以及技术和流程选择的权利移交给团队,需要至少一名能够做出这些决定的团队成员,或者在培训和指导方面进行一些前期投资,以进一步发展这些技能。
如此一来,技术和流程的灵活性将会增加,评审过程将会对团队的需求更加开放。
工程副总裁的角色也将发生重大变化。他们将协调更变企业文化、工作内容和培训内容。他们将评估和实施下面描述的工具和基础设施,他们还将改进指标。
工程吞吐量的衡量标准将不再是每个sprint的故事点,而是部署新功能和功能更新速度。应用程序的可靠性也将不再仅仅通过平均故障间隔时间来衡量,而是通过微服务的平均恢复时间来衡量。
#部署基础设施实现完全自动化
在规模上,一个云应用程序可能拥有数百个单独的微服务,每个微服务可能由多个实例组成(为了可用性和可伸缩性)。此外,这些微服务将由各自的开发团队独立更新。快速增长的移动部件数量和更新的频率要求一个完全自动化的部署工作流程和基础设施。
虽然有许多技术选择可以完全自动化部署工作流程,但是我们已经在所有微服务的成功使用过程中发现了部署基础设施中的一些通用功能。
从代码到客户的全自动化。通常,一旦开发人员将代码提交源代码库,就会有一个按钮流程,自动获取最新的源代码,并将其打包到部署工件中,如容器或 AMI,然后将整个工件部署到登台或生产环境中。这通常被称为持续交付。
弹性缩放。微服务本质上是相当短暂的部署新版本,退出旧版本,并根据利用率添加或删除新实例。支持弹性扩展的部署基础设施,如 Amazon 的 Elastic Compute Cloud、 Docker Datacenter 或 Kubernetes。
虽然许多其他功能可以添加到部署基础设施中,比如自动化回归测试 / 服务,但我们已经看到组织通过投资于自动化和弹性扩展成功地采用了微服务。
#Microservices 网络的开发人员基础设施
使用微服务的最后一个挑战可能是对微服务了解不足。如果一个单体应用程序类似于一个在不同房间中具有不同特性的房子,那么微服务应用程序更像是一个邻居,每个邻居都有一个微服务。
微服务社区的交流需要一种不同的模式。就像身在远处的两人在房屋里通过电话交谈(而不是在楼下大喊大叫)一样,微服务通过网络进行通信。这需要一组公共服务和使能技术。这些工具和技术是微服务编码开发人员使用的,与 DevOps 工程师使用的部署基础设施不同。
吞噬或被吞噬
鉴于微服务的好处需要新的投资和触发变化,你可能会问,正如一位工程副总裁最近被问到“你为什么从事微服务? ” 他回答说: “因为如果我们不这么做,我们就会被激励的竞争所吞噬。”
采用微服务的势头强劲,因为它有利于提高敏捷性、效率、新员工入职和招聘。数十家公司正在投资培训、工具和基础设施,以简化微服务的使用过程。拥有微服务使用经验的开发人员数量正在增长。
开发人员基础设施的基本用例是提供一个公共协议,以便所有微服务可以相互连接。支持这些协议的库需要在组织使用的每个技术堆栈中都可用。HTTP 是单片体系结构中常用的协议选择,但是 HTTP 的同步本质会降低可靠性,因为你需要向网络中添加更多的微服务。(使用 HTTP 连接在一起的 Microservices 类似于连续连接的圣诞树灯。如果一个灯泡熄灭了,整串的灯泡都不亮了。更复杂的协议提供了串联服务的能力。)
此外,在微服务体系结构中,典型的服务请求跨越多个微服务。例如,加载 Twitter feed 中所有 tweets 的过程会调用与广告相关的微服务、显示 tweet 的微服务(包括添加 hashtag 链接和图片)以及显示关注者 tweets 的微服务。在此场景中,专门用于跟踪错误和性能到特定微服务的工具对于确保开发人员生产率非常重要。
微服务开发者基础设施需要两个基本功能:
启用松散耦合的服务。服务需要定义良好的协议进行通信,并且依赖关系需要包含在每个微服务中。本 · 克里斯滕森(Ben Christensen),Netflix 微服务的架构师之一,在他的演讲《不要建立一个分布式单块体》中谈到了这个挑战。松散耦合的服务允许您更新单个微服务的代码,而不会影响依赖于它的任何其他服务。开发人员基础设施需要在所有微服务中提供这些协议的实现。
应用程序弹性。当一个微服务由于某种原因不可用时——软件错误、网络故障、机器故障——整个云应用程序必须继续运行并在最少的人为干预下恢复。服务可用性(例如负载平衡)、服务隔离(例如断路器)和服务恢复(例如回滚)等技术是开发人员工具包的重要组成部分。
译 | 蒋敏 编辑 | SaaS研究院