微服务为何如此炙手可热

新闻
编程是一个还很年轻的行业,计算机从出现到现在也不过 70 年左右,因此我们总是在现存的行业中不断寻找,探索,尝试。

 前言

编程是一个还很年轻的行业,计算机从出现到现在也不过 70 年左右,因此我们总是在现存的行业中不断寻找,探索,尝试。从最初的单体架构到之后的分布式架构在到现在的微服务架构,说明我们的确也在寻找更好的方法来构建我们的应用,从而提高客户满意度和开发效率。微服务不是被发明出来的,而是随着区域领域设计,持续交付,按需虚拟化,小团队自治协作,大型集群系统的流行等现实中总结出来的一种趋势或模式。

[[419456]]

2014年马丁·福勒(Martin Fowler)发表了以“微服务”为主题的文章后,短短数年,“微服务”已经变的炙手可热,成为大家所熟知的技术名词,受到无数人的追捧。仿佛设计架构不是“微服务”风格的话,就在技术上有不足似的。

面对快速发展变化的IT行业,各种和微服务相关的技术和框架不断涌现,架构师和开发人员需要具备透过这些表象看清事物本源的能力。微服务架构不仅涉及架构和开发阶段,还包含了测试、部署及运维等,它是一个完整的生命周期。随着各种技术、框架和工具的丰富和完善,尤其是Service Mesh之类的技术的演进,Service Mesh的目标是要将微服务治理体系下沉为与业务无关的基础设施。也就是说,在未来大家开发过程中可能不会意识到微服务的存在。但作为有追求的开发人员和架构师,很有必要了解微服务的方方面面。

什么是微服务

在单体应用中,开发者会在类、模块、类库的层面来设计功能属性。为了解决各种各样的复杂问题,软件开发者一直致力于努力提供各种有效而及时的解决方案。然而面对日渐壮大的应用,即便团队成员受过专业的训练,可能也只是挣扎着尽量维持之前的节奏。糟糕的情况是,曾经简洁,稳定的产品变得越来越难以维护和脆弱。无法按时发布新的版本或补丁,无法再为客户持续交付更多价值。微服务解决了这类问题,它为我们提供了一种更好的持续交付业务影响的方式。在微服务应用中,开发者的目标变成了可独立部署的功能单元,围绕这些功能单元设计功能属性。

微服务是一系列自治服务的集合,每个服务只负责完成一块功能,这些服务共同合作完成更加复杂的业务。

微服务核心原则

支撑微服务开发的五大架构原则为:自治性、可恢复性、透明性、自动化和一致性。工程师在开发和运行时应该结合这些原则做出合理的技术和决策。进而使系统更易于修改、扩展和稳定。

  1. 自治性你是否能够修改一个服务并对其进行部署,而不影响其它任何服务。 —黄金法则我们已经明确每个服务的操作和修改都是独立于其他服务的。为了保证自治性开发者需要把服务设计的松耦合和可独立部署。松耦合是指每个服务通过明确定义的接口或者事件消息来与其他服务进行交互。可独立部署是说不同的服务通常有多个不同的团队并行开发,不要强迫所有的团队按照同样的设计步骤进行部署。理想情况下,大家想要的是服务够快、频繁改动发布。
  2. 可恢复性微服务与生俱来具备故障隔离机制:独立部署运行的微服务在应用或基础设施出现故障后,故障只会影响到整个系统的一部分功能。尽管这样,微服务还是会存在多点故障的问题。比如,在异步交互及熔断器和超时等。
  3. 透明性不管在什么时候,系统都应该是透明的,可观测的,这样当故障发生时不但能及时的发现问题,更可能会尽快的诊断解决问题。
  4. 自动化通过开发大量的服务来缓解应用不断变大所带来的的痛苦,这貌似有悖常理。相对于单体应用,微服务确实是一种更加复杂的架构。开发者需要使用自动化来保证部署和运维过程中的正确性。微服务架目前流行的两种趋势,一种是DevOps 基础设施即代码,另一种是通过API进行编程的基础设施环境(AWS、Azure)。
  5. 一致性开发者应该围绕业务概念来组织服务和团队,只有这样服务和团队的内聚性才能更高。微服务架构应该偏向于纵向拆分。每个服务应该与一个独立的业务功能匹配,并将相关的技术层内容封装在一起。

微服务优势

  1. 技术选型灵活微服务架构下,技术选型是去中心化的。在一个有多个服务相互协作的系统中,可以在不同的服务中使用最合适该服务的技术。
  2. 容错当某一功能发生故障时,在单一进程的传统架构下,故障很有可能在进程内扩散,形成应用全局性的不可用。在微服务架构下,故障会被隔离在单个服务中。若设计良好,其他服务可通过重试、平稳退化等机制实现应用层面的容错。
  3. 扩展单块架构应用也可以实现横向扩展,就是将整个应用完整的复制到不同的节点。当应用的不同组件在扩展需求上存在差异时,微服务架构便体现出其灵活性,因为每个服务可以根据实际需求独立进行扩展。
  4. 简化部署在有几百万行代码的程序中,即使修改一行代码,也需要重新部署整个应用程序才能发布该变更。这种部署影响大风险高。在微服务架构中,各个服务部署是独立的,这样就可以更快的对特定的代码进行部署,如果真出了问题,也只会影响一个服务,并且容易快速回滚。
  5. 与组织结构相匹配我们经历过太多由于团队和代码库过大所引发的问题。微服务可以很好的将架构和组织进行匹配,避免出现过大的代码库,从而获得理想的团队大小及生产力。服务的所有权也可以在团队之间迁移,从而避免异地团队的出现。我们可以结合康威定律进行合理的调整:第一定律 组织沟通方式会通过系统设计表达出来。第二定律 时间再多一件事情也不可能做的完美,但总有时间做完一件事情。第三定律 线型系统和线型组织架构间有潜在的异质同态特性。第四定律 大的系统组织总是比小系统更倾向于分解。
  6. 可组合性分布式系统和面向服务架构的主要好处是易于重构已有功能。而在微服务架构中,根据不同的目的可以通过不同的方式使用同一功能,在考虑客户如何使用该软件时尤为重要。
  7. 可替代性我们在工作中可能接触过一些庞大丑陋的遗留系统,他们无人敢碰,但是对公司业务至关重要。为什么这些系统直到现在还没有被取代?其实你很清楚:工作量大,且风险极高。想想看,在单体应用中你是否会在一天内删除上百行代码且确信不会引发问题?使用微服务架构的团队可以在需要时轻易重写服务,或者删除不在使用的服务。当一个代码库只有几百行时,也不会对它有太多情感上的依赖,所以很容易替换它。

微服务挑战

设计挑战

  1. 设计挑战划定微服务范围需要业务领域知识。每个微服务都只负责一个功能,识别这些功能需要丰富的业务领域知识。开发者对问题领域理解不充分或错误的理解,将导致错误的设计决定。也就是我们所说的范围边界划分不清晰或不合理,可能给下游业务造成更高的代价。服务契约的维护每个微服务应该对外暴露一个契约(接口)用于定义它所期望接受和返回的消息。一个良好的契约应该具备以下特点:完整、简洁、可预测。
  2. 运维挑战工程师面对的微服务两大运维挑战:可观测性和多点故障。可观测性难实现的原因在于工程师需要对应用整体有所了解,把每个服务所生产的数据进行关联和汇总。如果开发者提前认定服务存在的缺陷,那么就能更好的提醒自己如何进行设计和监控,而不会等到故障出现时才大吃一惊。
  3. 微服务是多个团队设计在规模较大的组织中,通常是由多个团队来开发和运行微服务应用。每个团队负责不同的微服务,他们有自己的目标、工作方式和交付周期。如果开发者还需要和其他独立的团队协调时间表和优先级,就很难设计出一个内聚的系统。

微服务设计

  • 单一职责原则把因相同原因而变化的东西聚合在一起,把因不同原因而变化的东西分离出来。这就是我们常说的内聚性。
  • 服务边界一个微服务应该可以在两周内完全重写,这个经验法则在某些特定的场合下是有效的。 ——复杂度拆分大家通常能够意识到什么是“过大”,如果你不在感觉到你的代码库过大,可能他就是足够小了,足够小即可。 ——最小原则拆分最小拆分原则需要注意的一个问题是:服务越小虽然独特性的好处显而易见,但是管理大量服务也会越发的复杂。如果代码库过大,当下团队无法正常运维,那么应该将其拆分成小的。 ——组织匹配度拆分然而一个常见的拆分误区是通过代码库的大小或代码行数来衡量。因为服务代码存在依赖项,每个依赖项又会包含很多代码。

总结

希望到目前为止你已经了解了什么是微服务、它有什么特性和好处。架构师的一个重要职责是,确保团队有共同的技术愿景,以帮助我们向客户交付他们想要的系统。在这个编程的行业还很年轻的时代,如何在现存的行业中寻找合理的技术解决方案,做出正确的决策,这也是架构师这一角色难做好的原因之一,我们不是医生也不是电工,我们处在行业的中间地带,因此很耐被理解我们到底在做什么,因为很多时候我们也不清楚自己到底处在什么位置上。

规则对于智者来说是指导,对于愚蠢者来说是遵从。 每种架构的演进或者说每种技术的进步都伴随着相应的契约规则。微服务价值体现在松耦合、高内聚。我们应该了解和追寻技术发展的源动力。因为成功要靠不断的取舍来实现。

责任编辑:华轩 来源: 今日头条
相关推荐

2014-08-08 15:36:58

2024-03-22 11:27:54

电缆管理数据中心

2022-05-06 17:34:27

安全代码软件漏洞

2009-12-04 09:46:02

Linux操作系统

2015-01-08 15:38:34

Fire Phone

2021-01-26 16:21:46

边缘计算5GIoT

2012-05-10 10:23:10

技术人员开发

2009-09-17 13:06:24

2010-07-16 16:06:11

求职

2022-06-08 13:11:35

比特币挖矿区块链

2010-10-13 15:36:41

服务器虚拟化

2021-08-30 14:23:41

身份验证隐私管理网络安全

2012-04-24 14:41:15

HTML5

2024-02-26 00:00:00

JavaScript单线程高效

2013-07-16 09:31:11

2019-03-25 07:35:51

委内瑞拉电网断电

2009-04-14 19:30:08

虚拟化VmwareIT

2013-04-27 10:31:56

大数据全球技术峰会Hadoop

2017-10-25 14:28:27

Java工程师火爆原因

2017-08-23 13:05:11

点赞
收藏

51CTO技术栈公众号