避免微服务的误解

标签: 微服务 | 发表时间:2021-04-13 20:39 | 作者:Zangying2005
出处:http://weekly.dockone.io

Federico Pugliese Follow Jan 20 · 6 min read

开篇声明:我是微服务的超级粉丝。
当下的时代,每隔一段时间就会出现一种新概念或新技术,它带来了希望、炒作的热点,貌似可以拯救全世界一样。但我认为,这确实有它正确的一面,新技术具备突破性,能够带来重大受益。然而,它也像生活中的其他任何事物一样,有它的能力适用范围。就好比我们不能把牛顿定律应用到亚原子粒子上面,或者尝试过把电视塞进袜子里。就好比我们不能忽略了合同最后的约束小条款,它的后果可能是灾难性的。

(照片源自Mollie Sivaram)

分拆是可选之策

常规的web应用程序通常只有一个进程接收和处理所有请求,也许出于负载均衡或高可用等因素考虑,我们会复制一份部署,但在任何单一场景下,都是将全部的实现逻辑,打包成一个包和软件在运行。而使用微服务的方式,我们可以设计拥有多个不同的进程,每个进程可以运行不同的包,而每个包只包含自己的代码,处理请求的子集数据。

是否为新事物

答案是否定的,事实上,微服务模式就像任何新兴技术一样,在热炒之前已经存在了好几年。它本质上就是面向对象编程在更高级层面的应用,即是应用程序架构。同时,情理之中的是微服务会经常使用HTTP API,尤其是RESTful。而RESTful API正是OOP原则在API设计的应用结果。
稍微扩展一下面向对象编程的过程。使用面向对象编程创建一个程序时,通常会将它分割成几个类,每个类表示一个组件,具有特定的角色,处理相对应的数据子集,这都是耳熟能详的内容。虽然在此讨论面向对象编程并不合适,但是本文内容会涉及到几个关键的方面。如果读者不太熟悉这些内容的话,我建议参考这方面的在线文档。

两个原则——“好裁缝”

我们在设计类的时候,必须遵循2个主要原则:低耦合和高内聚。坦白来讲,我认为这不仅仅是面向对象项目的指导原则,而应该是每个软件项目的明星指导规则(可能存在歧义,不展开)。
高内聚:是指组件每部分都是高度一致的愿景,包括它的数据和方法都指向非常具体的某一领域、意义或角色。
低耦合:是指每个组件与其他组件之间具备交互次数尽可能少的状况。它隐藏了底层细节,能够独立运行,仅仅暴露必要的接口。
对于微服务来说也是如此,好的面向对象设计会带来最优的微服务设计,个人觉得这点如何强调都不为过。这应该也足以回答为什么以及什么时候考虑采用微服务的问题,接下来继续阐述。

(好的裁缝就是用松散的针法缝合高密度的衣料。图片来自jeff Wade )

分拆的时机

这与面向对象编程的情况是完全一样。即当需要且能够遵循高内聚、低耦合原则的时候。如果您知道如何以正确的方式将代码拆分为类。那你何必要随意地分拆你的微服务呢?如果一个糟糕的类图由于设计不合理,导致功能代码散落到多个文件内,最终难以维护和管理的话,那我们可以想象一下随意分拆微服务应用,导致一个微应用中运行着完全不同进程时的窘境。

分拆应用的理由

想象两个对象交互有多么容易,只需要调用另一个对象的方法,实现起来也非常容易,而且所有的代码都在一个程序内。而与之相反的微服务架构,应用运行在不同的线程,甚至可能是在不同的机器上,基于网络,采用API进行请求通信。
这显然增加了复杂性。但这么做一定有着充分的理由,既不是为了潮流,也不是为了好玩。我可以保证,如果你随意地使用微服务,所带来的管理一点都不会好玩。
实际上,决定使用API访问方式,与使用微服务的理由是相同的。API能够隐藏接口背后的所有实现细节,这在某些情况下是非常重要的,它可以带来超过预计的好处。包括:
  • 1.针对非均匀流量的可伸缩性


假设一个超市应用程序,包含一个库存微服务,它只显示库存文章的数量;一个视图微服务,它使用GPU来检测文章中包含的图片。如果某一时间段,应用收到数千个库存应用的API请求,而只是少数视图微服务的API请求,那就只需要复制多个的库存微服务就可以应对API请求处理,而不需要去成倍增加GPU资源。
而换一种情况来考虑,将所有代码实现都集中在一台机或一个应用程序,且仍然希望通过扩展资源来匹配全部的访问请求,那么就必须整体复制部署,导致明显的非必须资源浪费。
  • 2.容错弹性


假设有一个银行应用程序的转账微服务总是崩溃,原因可能是偶然的错误,或者更糟一些,软件版本未经测试,存在一个新bug。那是否因为这个原因,将整个银行应用程序都关闭呢?有些顾客并不关心这个业务,他们只是想看看自己资金动向或是用卡而已。
  • 3.单独部署


按照前面所述的场景,如果要增加一个新功能或需要修复某个bug,微服务可以让我们只部署更新所对应的那个微服务即可,构建和部署时间也相应少很多。此外,还可以把微服务部署到不同的机器上或不同的位置。
  • 4.完全隔离


对于需要在服务之间实现完全隔离的需求。通过微服务这种方式可以采用不同的数据库 (SQL和NoSQL)或完全不同的实现技术。具备最大限度的设计自由。当然,容错弹性和请求处理等其他方面,它也同样存在严格的关联要求。
  • 5.差异化需求


业务应用是否有重度密集计算的需求,例如机器学习,需要GPU资源,或需要调用大量的算法模型库等。或许部分需求用Python实现会更好,而其他部分更适合采用Java开发。又或者同语言的库可能会产生部分冲突,迫切需要两个特定的软件版本来处理两个不同的任务。甚至最终需要使用两种不同的云产品服务来承载2个不同的组件。造成上述等等现象的原因有很多,其中很多都是常见的情况。
在这些情况下,进行应用程序拆分可能是更容易的解决问题方法。但是我们必须谨记要遵守“两个原则”,成为一个“好裁缝”,否则将会经常面临艰难时刻,包括在微服务之间共享数据等方面。

(再高的巨石也是由石块或原子组成。图片来源Zoltan Tasi)

上述内容不适用你的情况,就像巨石

如果您的系统是紧耦合,采用单体应用程序方式,那可称为巨石应用。您具有清晰的依赖关系管理,不需要复杂的编排或分布式系统来跟踪错误、共享数据、收集日志、同步调用、安全的网络交互等等。那是否面向对象编程就不适合您的应用程序架构,RESTful设计和微服务也不适用呢?
如果应用程序需要采用很长的API请求队列,其中一个API还需要调用前面API的返回结果,那么这种设计并不是一种理想的方式。它肯定会存在网络延迟等问题。
而如果应用程序是需要用户交互的单一过程呢,那么这句话本身就意味着它是一个不可分拆的程序。
如果必须在调用之间共享一个状态,每个组件都不是独立的,序列中的一个错误会完全阻塞整个请求序列。那分割应用程序几乎没有好处。

巨石应用并不等于混乱

混乱也有不同的理解,有人认为巨石应用是一堆错综复杂的代码。他们声称微服务模式是应用分拆、有序构建的唯一方式。
我想表达的是:这个观点并不正确。因为代码设计并不依赖于线程划分,面向对象编程也是如此。如果能够正确地拆分代码,在一个清晰的层次结构中管理好依赖关系,以及代码包文件,就可以实现同级别层面的内聚和解耦。
还有一个秘诀,如果把API划分成独立的包/模块/控制器/蓝图/甚至代码段等,就可以实现在代码构建时或运行时的阶段,自由决定是采用单一进程运行它们,还是分拆成微服务运行,没有任何限制。

结论

就如开篇所说的,我是微服务的超级粉丝。
如果从正确的环境,出于正确的原因考虑,微服务可以解决问题、提升性能或节约成本。但是,也请大家不要将它们理解为救世主,它们也可能是万恶之源。
原文链接: https://medium.com/swlh/stop-t ... 5805b
(翻译:易理林)

相关 [微服务] 推荐:

初识微服务

- - ITeye博客
微服务架构越来越火,有必要学习一下. 软件开发过程中碰到什么问题. 一个简单的应用会随着时间推移逐渐变大. 在每次的sprint中,开发团队都会面对新“故事”,然后开发许多新代码. 几年后,这个小而简单的应用会变成了一个巨大的怪物. 一旦你的应用变成一个又大又复杂的怪物,那开发团队肯定很痛苦. 敏捷开发和部署举步维艰,其中最主要问题就是这个应用太复杂,以至于任何单个开发者都不可能搞懂它.

谈微服务架构

- - 人月神话的BLOG
其实在前面很多文章谈到SOA,特别是系统内的SOA和组件化的时候已经很多内容和微服务架构思想是相同的,对于微服务架构,既然出现了这个新名称,那就再谈下微服务架构本身的一些特点和特性. 从这个图可以看到微服务架构的第一个重点,即业务系统本身的组件化和服务化,原来开发一个业务系统本身虽然分了组件和模块,但是本质还是紧耦合的,这关键的一个判断标准就是如果要将原有的业务系统按照模块分开部署到不同的进程里面并完成一个完整业务系统是不可能实现的.

微服务性能模式

- - 互联网 - ITeye博客
前言:基于微服务系统越来越普遍. 下面我们就来看看五种常见的特定微服务性能的挑战,以及如何应解他们. 背景:在IT界微服务架构为基础的系统越来越多, 每一个应用系统都集成了不同的组件和服务,几乎所有的特定业务应用程序都需要集成一个或更多的应用服务. 但是一个综合性系统集成不同的服务这无疑是一个巨大的挑战.

微服务与架构师

- - 乱象,印迹
因为工作的关系,最近面试了很多软件架构师,遗憾的是真正能录用的很少. 很多候选人有多年的工作经验,常见的框架也玩得很溜. 然而最擅长的是“用既定的技术方案去解决特定的问题”,如果遇到的问题没有严格对应的现成框架,就比较吃力. 这样的技能水平或许适合某些行业,但很遗憾不符合我们的要求. 软件架构师到底应该做什么,又为什么这么难做好,这都是近来的热门问题,我也一直在和朋友们讨论.

从Excel到微服务

- - 乱象,印迹
Excel很老,Excel很土,Excel一点也不sexy;微服务新,微服务很潮门,微服务很高大上. 那么,Excel和微服务有什么关系. 上个月看了篇文章,The Unbunlding of Excel. 作者认为,对于初创公司(尤其是非“纯IT”初创公司)来说,Excel几乎包办各种工作. 想做轻量级的CRM,可用Excel.

微服务拆分之道

- - DockOne.io
微服务在最近几年大行其道,很多公司的研发人员都在考虑微服务架构,同时,随着 Docker 容器技术和自动化运维等相关技术发展,微服务变得更容易管理,这给了微服务架构良好的发展机会. 在做微服务的路上,拆分服务是个很热的话题. 我们应该按照什么原则将现有的业务进行拆分. 接下来一起谈谈服务拆分的策略和坚持的原则.

微服务之saga模式

- -
你已经使用 database ber service 模式. 每个service拥有自己的database. 一些业务事务会跨越多个service,所以你需要来确保data consistency. 例如,假设你正在构建一个电子商务网站,这个网站的用户的会有一个最大欠款限制,应用程序必须确保一个新订单不能超过用户的最大前款限制,但是orders表和customers表不在同一个数据库,所以应用程序不能简单的使用本地的ACID事务.

微服务安全简介

- - 掘金 架构
​由于其可扩展性、灵活性和敏捷性,微服务架构已经变得越来越受欢迎. 然而,随着这种架构的分布和复杂性增加,确保强大的安全措施变得至关重要. 微服务的安全性超越了传统的方法,需要采用全面的策略来保护免受不断演变的威胁和漏洞的影响. 通过理解核心原则并采取有效的安全措施,组织可以加强其微服务架构,并保护敏感数据和资源.

微服务框架Spring Cloud介绍 Part2: Spring Cloud与微服务

- - skaka的博客
之前介绍过 微服务的概念与Finagle框架, 这个系列介绍Spring Cloud.. Spring Cloud还是一个相对较新的框架, 今年(2016)才推出1.0的release版本. 虽然Spring Cloud时间最短, 但是相比我之前用过的Dubbo和Finagle, Spring Cloud提供的功能最齐全..

面向服务与微服务架构

- - CSDN博客推荐文章
最近阅读了 Martin Fowler 和 James Lewis 合著的一篇文章  Microservices, 文中主要描述和探讨了最近流行起来的一种服务架构模式——微服务,和我最近几年工作的实践比较相关感觉深受启发. 本文吸收了部分原文观点,结合自身实践经验来探讨下服务架构模式的演化. 面向服务架构 SOA 思想概念的提出已不是什么新鲜事,大概在10年前就有不少相关书籍介绍过.