01-微服务探讨(摘)

news2024/11/13 10:50:11

1. 前言

1.1 微服务目的

有效地拆分应用,实现敏捷开发和部署,最终的目标是实现敏捷开发和部署,实现的方式是围绕业务能力*有效地拆分应用*。 微服务就是从各种角度,包括组织的、技术的等来阐释怎样有效地拆分应用,相对于其他拆分应用的方式,例如六边形架构、12-Factor以及《The art of scalability》涉及的方面更多。

1.2 微服务定义

微服务架构即是采用一组小服务来构建应用的方法。 每个服务运行在独立的进程中,不同服务通过一些轻量级交互机制来通信, 例如 RPC、HTTP 等。 服务围绕业务能力来构建,并依赖自动部署机制来独立部署。

虽然勾勒出了微服务的一些关键概念:小、独立进程、自动化,但是这样的定义还是太抽象,太务虚,很难落地。一解释以为懂了,一问还是不知道,一讨论就打架。换句话说,就是*道可道,非常道*

从Martin作为ThoughtWorks公司的首席科学家的角度来看,他把微服务“炒”起来了,如果像12-Factor写得这样具体实在,那咨询业务还怎么开展呢。

相比于Martin的文章,Chris Richardson的文章microservices.io就要具体多了,它从更多角度来阐释了微服务。

1.3 微服务起源

早在 1994 年 Mike Gancarz 曾提出了 9 条著名原则,其中前 4 条和微服务架构理念特别接近。微服务就像把 UNIX 哲学应用到了分布式系统。

  1. Small is beautiful.
  2. Make each program do one thing well.
  3. Build a prototype as soon as possible.
  4. Choose portability over efficiency.

 翻译成中文:

1. 小即是美:小的服务,代码少,bug 也少,易测试,易维护,也更容易不断迭代完善。
2. 一个程序只做好一件事:一个服务也只需要做好一件事。
3. 尽可能早地创建原型:尽可能早的提供服务 API,建立服务契约,达成服务间沟通的一致性约定,
   至于实现和完善可以慢慢再做。
4. 可移植性比效率更重要:服务间的交互协议在效率和可移植性二者间,首要考虑移植性。

可见微服务其实不是凭空产生的,它自有其历史渊源。而在微服务之前的十年,大家经常谈论的是一个叫 SOA(面向服务)的架构模式,它和微服务又是什么关系?在 Sam Newman 的《Building Microservices》一书中,作者对 SOA 和 Micorservices 的区别给出了定义: 

You should instead think of Microservices as a specific approach for SOA in the same way that XP or Scrum are specific approaches for Agile software development.

就像认为 XP 或者 Scrum 是敏捷软件开发的一种特定方法一样, 你也可以认为微服务架构是 SOA 的一种特定方法。

面向服务架构(SOA)的概念已有十多年,它提出了一种架构设计思想, 但没有给出标准的参考实现,而早期企业软件业界自己摸索了一套实践方式 —— 企业服务总线(ESB)。 但历史证明 ESB 的实现方案甚至在传统企业软件行业也未取得成功,Martin Fowler 在文中说正是因为 ESB 当年搞砸了很多项目, 投入几百万美金,产出几乎为零,因此 SOA 这个概念也蒙上了不详的标签,所以当微服务架构出现时, 其拥护者开始拒绝使用包裹着失败阴影的 SOA 这个标签,而直接称其为微服务架构(Microservices Architecture Style), 让人以为是一套全新的架构思想,但事实上它的本质依然是 SOA 的一种实践方式。 

2. 特征

每个人对微服务都可以有自己的理解,不过大概的标准还是有一些的。

  • 分布式服务组成系统
  • 按照业务而不是技术来划分组织
  • 做有生命的产品而不是项目
  • 智能终端与哑管道
  • 去中心化
  • 自动化运维(DevOps)
  • 容错
  • 快速演化

微服务架构(MSA)带来一些复杂性,比如调用关系链以及网络调用隐含的性能问题。单个微服务不管从业务领域方面还是从性能方面来说都很简单,易于理解。但如果是一群微服务,就不是这么回事了。微服务架构的优点只有在一定条件下才能得以体现,比如每个微服务对它们的数据具有独占所有权,或者有属于自己的数据库存储。

这是一种 能不共享就不共享 的架构模式,非常强调有边界的上下文。

API层作为服务接入层。 在客户和服务之间放置一个API层通常是个不错的主意,因为这个组件实质上构造了一个抽象层,使得客户不需要知道服务端的确切位置。 

2.1  分布式服务组成系统

传统实现组件的方式是通过库(library),库是和应用一起运行在进程中,库的局部变化意味着整个应用的重新部署。 通过服务来实现组件,意味着将应用拆散为一系列的服务运行在不同的进程中,那么单一服务的局部变化只需重新部署对应的服务进程。

2.2  按照业务而不是技术来划分组织

直接理解就是:服务提供的能力和业务功能对应。 比如:订单服务和数据访问服务,前者反应了真实的订单相关业务,后者是一种技术抽象服务不反应真实的业务。所以按微服务架构理念来划分服务时,是不应该存在数据访问服务这样一个服务的。

更深一层,Melvin Conway 在 1967 年观察到一个现象并总结出了一条著名的康威定律

Organizations which design systems are constrained to produce designs 
which are copies of the communication structures of these organizations.

设计系统的组织,其产生的设计等同于组织之内、组织之间的沟通结构。

通俗的说法就是:组织形式等同系统设计。 看看下面的图片(来自互联网),再想想Apple的产品、微软的产品设计,就能形象生动的理解这句话。

就像六边形架构是微服务的理论基础之一一样,康威定律也是微服务架构的理论基础之一。

传统开发方式中,我们将工程师按技能专长分层为前端层、中间层、数据层,前端对应的角色为 UI、页面构建师等,中间层对应的角色为后端业务开发工程师,数据层对应着 DBA 等角色。 事实上传统应用设计架构的分层结构正反应了不同角色的沟通结构。所以若要按微服务的方式来构建应用,也需要对应调整团队的组织架构。每个服务背后的小团队的组织是跨功能的,包含实现业务所需的全面的技能。

2.3  做有生命的产品而不是项目

传统的应用开发都是基于项目模式的,开发团队根据一堆功能列表开发出一个软件应用并交付给客户后,该软件应用就进入维护模式,由另一个维护团队负责,开发团队的职责结束。 而微服务架构建议避免采用这种项目模式,更倾向于让开发团队负责整个产品的全部生命周期。Amazon 对此提出了一个观点:

You build it, you run it.

开发团队对软件在生产环境的运行负全部责任,让服务的开发者与服务的使用者(客户)形成每日的交流反馈,来自直接客户的反馈有助于开发者提升服务的品质。 

2.4 智能终端与哑管道

微服务架构抛弃了 ESB 过度复杂的业务规则编排、消息路由等。 服务作为智能终端,所有的业务智能逻辑在服务内部处理,而服务间的通信尽可能的轻量化,不添加任何额外的业务规则。所以这里的智能终端是指服务本身,而哑管道是通信机制,可以是同步的 RPC,也可以是异步的 MQ,它们只作为消息通道,在传输过程中不会附加额外的业务智能。

2.5 去中心化

去中心化包含两层意思:

  • 技术栈的去中心化。
  • 数据去中心化。

每个服务面临的业务场景不同,可以针对性的选择合适的技术解决方案。但也需要避免过度多样化,结合团队实际情况来选择取舍,要是每个服务都用不同的语言的技术栈来实现,想想维护成本真够高的。

每个服务独享自身的数据存储设施(缓存,数据库等),不像传统应用共享一个缓存和数据库,这样有利于服务的独立性,隔离相关干扰。

2.6  自动化运维

 无自动化不微服务,自动化包括测试和部署。单一进程的传统应用被拆分为一系列的多进程服务后,意味着开发、调试、测试、监控和部署的复杂度都会相应增大,必须要有合适的自动化基础设施来支持微服务架构模式,否则开发、运维成本将大大增加。

2.7 容错

著名的 Design For Failure 思想,微服务架构采用粗粒度的进程间通信,引入了额外的复杂性和需要处理的新问题,如网络延迟、消息格式、负载均衡和容错,忽略其中任何一点都属于对“分布式计算的误解”。

2.8 快速演化

一旦采用了微服务架构模式,那么在服务需要变更时我们要特别小心,服务提供者的变更可能引发服务消费者的兼容性破坏,时刻谨记保持服务契约(接口)的兼容性。一条普适的健壮性原则,伯斯塔尔法则,给出了很好的建议:

Be conservative in what you send, be liberal in what you accept. 

发送时要保守,接收时要开放。

通俗的说法就是:***宽进严出 

3. 实施

实施微服务架构,可以从下面一些维度来做全面考量。

3.1 建模

微服务只是从软件实现的结果说事,没有提供一套方法论来对复杂系统进行分解,从而得到一个个微服务。 依照服务围绕业务能力来构建的方式,DDD(Domain Driven Design)中的*BoundedContext*,它是针对复杂系统设计的一套软件工程方法:把系统分割为一个个有边界的上下文,正好契合了微服务的这一需求。 BoundedContext,有一个比喻比较贴切:“细胞之所以会存在,是因为细胞膜定义了什么在细胞内,什么在细胞外,并且确定了什么物质可以通过细胞膜。”

3.2 协作

采用微服务架构模式后,开发和运维的协作模式都会发生变化。 按微服务的组织方式,不同人或小团队负责一个或一组微服务,服务之间可能存在相互调用关系,所以在服务之间也完全采用了面向外部开放的契约化开发模式。 每一个服务都提供了一份契约文档,发布到公开的内部 wiki,方便服务干系人可自由获取查看。契约文档要求至少对服务的几个基本方面作出说明,如下:

  • API,具体接口的 API 接入技术说明。
  • 能力,服务能力的描述。
  • 契约,提供这些能力所约定的一些限制条件说明。
  • 版本,支持的最新和历史的版本说明。

使用契约文档来减少多余且可能反复重复的口头沟通,降低协作成本。

采用微服务后一个业务功能的调用会涉及多个服务间的协同工作,由于服务间都是跨进程的调用通信,一个业务功能的完成涉及的服务调用链条可能较长,这就涉及到服务间需遵循一些规则来确保协作的可靠性和可用性。我们采用的原则是:长链条的内部服务之间的调用异步化。若一个调用链条中的个别服务变慢或阻塞可能导致整个链条产生雪崩效应,采用异步化来规避调用阻塞等待导致的雪崩情形。

3.3 测试

测试从不同的维度可以划分,如下四个象限,四个象限从不同维度视角对测试做了观察和判断,从中可以看出除了体验和探索性测试需要人工介入,其他维度的测试都可以通过自动化来实现,以降低测试人工成本和重复性工作。

而从测试所处的层次,又可以得到下面这样个一个测试金字塔:

而微服务的测试,服务开发和运营人员专注于做好服务实现层面的单元测试和服务契约层面的接口测试。而面向业务功能的端到端测试,更多是依赖自动化脚本完成。而为了维护好这些自动化测试脚本,也需要保持服务接口和契约的兼容性和稳定性,这些自动化测试脚本也属于服务的消费方之一。

3.4 监控

大量松耦合的微服务通过相互协作来完成业务功能的流程处理,在这样一个复杂的生产环境中,出现异常或错误是很难迅速定位的。 对监控进行分层,顶层的监控站在用户视角,底层的监控站在系统视角,形成更完善的反馈链路。

 Microservice 微服务的理论模型和现实路径 - mindwind - 博客园

 微服务(Microservice)那点事-阿里云开发者社区

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/13328.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SSM-Spring

Spring Framwork 1. 核心概念 1.1 IoC控制反转 inversion of control控制反转 使用对象是主动由外部提供对象,此过程对象创建控制权由程序转移到外部。 Spring 提供IoC容器,用来充当IoC思想中的外部。负责创建和初始化等工作,被创建的对象再…

04-HTTPS证书格式及转换

PEM格式的证书文件(*.pem)由Base64编码的二进制内容和开头行(-----BEGIN CERTIFICATE-----)、结束行(-----END CERTIFICATE-----)组成,支持使用EditPlus等文本编辑器打开。本文介绍了将不同格式…

[附源码]java毕业设计教室用电控制系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

数据库的备份和还原(slqserver)

数据库的备份 1.语法&#xff1a; BACKUP DATABASE { database_name | database_name_var } TO <backup_device> [,...n] [ WITH{COPY_ONLY| NAME {backup_set_name | backup_set_name_var }| { NOINIT | INIT }| DESCRIPTION { test | text_variable }| PASSWORD { …

双端队列(双端bfs)解决边权只包含0和1的最短路问题

电路维修 达达是来自异世界的魔女&#xff0c;她在漫无目的地四处漂流的时候&#xff0c;遇到了善良的少女翰翰&#xff0c;从而被收留在地球上。 翰翰的家里有一辆飞行车。有一天飞行车的电路板突然出现了故障&#xff0c;导致无法启动。电路板的整体结构是一个 R行 C 列的网…

关于 re.sub 部分替换的解决办法

关于 re.sub 部分替换的解决办法写作背景问题重现解决办法代码详解结尾写作背景 最近本菜鸡遇到一个问题&#xff0c;我想将字符串中某一部分替换成指定内容&#xff0c;而且为了定位到要替换的内容&#xff0c;所以使用正则的时候还需要前后一些字符作为锚点&#xff0c;这可…

linux下基本命令

linux下基本命令一、linux相关快捷键二、linux下内部命令和外部命令2.1 内建命令2.2 外部命令2.3 内建命令和外部命令对比2.4 命令类型查看方法2.4 内建命令和外部命令帮助三、man手册四、相对路径和绝对路径五、pwd和cd命令六、mkdir创建目录七、rmdir删除目录八、linux文件类…

JMeter如何自定义HTTP组件

JMeter是一个优秀的开源项目&#xff0c;我们可以在jmeter的官网了解到如何使用和如何二次开发&#xff1a;Apache JMeter - Apache JMeter™ 因工作需要&#xff0c;最近做了一个JMeter自定义的http组件&#xff08;其实就是在http的基础上加了点东西而已&#xff09;。现就该…

TCO-PEG5-amine,NH2-PEG5-TCO,反式环辛烯-五聚乙二醇-氨基广泛应用于生物学研究

TCO-PEG5-NH2中英文名&#xff1a; CAS号&#xff1a;N/A | 英文名&#xff1a;TCO-PEG5-amine&#xff0c;TCO-PEG5-NH2 |中文名&#xff1a;反式环辛烯-五聚乙二醇-氨基TCO-PEG5-NH2物理参数&#xff1a; CASNumber&#xff1a;N/A Molecular formula&#xff1a;C21H40N2O7…

没有实施APS软件的工厂,常常面临的问题

对于制造工厂车间的运行而言&#xff0c;计划是核心的业务。制造工厂面对这么多订单并行生产执行、受制于有限的制造资源&#xff0c;如何安排次序、如何权衡轻重缓解&#xff0c;其实都是计划的范畴&#xff0c;计划执行过程总是受到各种形式的干扰或冲击&#xff0c;如何综合…

虹科分享 | 网络性能监控 | 网络中的应用性能意味着什么?

TCP协议的可靠性 数据包丢失是对网络的破坏&#xff0c;因为它导致延迟。TCP协议建立了可靠的数据传输&#xff0c;但掩盖了丢包的影响。TCP确保数据的传输是基于一个叫做 "滑动窗口 "的概念。这种机制控制着传输的字节序列和收到的确认。 在排序的帮助下&#xff…

项目管理之信息文档管理与配置管理(第一篇)

目录 前言 一、软件文档的分类 1.开发文档 2.产品文档 3.管理文档 二、文档质量的四个等级 1.1级文档 2.内部文档&#xff08;2级&#xff09; 3.工作文档&#xff08;3级文档&#xff09; 4.正式文档&#xff08;4级文档&#xff09; 三、配置管理 1.配置管理的定义…

XCTF-web1文件包含绕过file include

场景一&#xff1a; fileclude 题目描述 好多file呀&#xff01; 进入场景 给出PHP源码 包含flag.php文件 GET获取两个参数file1和file2 当参数不为空时&#xff0c;使用file_get_contents()函数将文件内容读入字符串&#xff0c;判断是否为"hello ctf" 利用ph…

vue项目前端优化处理方案整理

vue项目前端优化处理 目录 vue项目前端优化处理 路由懒加载 按需引入模块 外部资源引入&#xff0c;cdn加载 移除项目中所有的console.log()控制台信息数据打印 是否在构建生产包时生成sourcdeMap 上传图片文件压缩 开启gizp压缩 前端页面代码优化 路由懒加载 路由懒…

【深度学习】特征图的上采样(nn.Upsample)和转置卷积(nn.ConvTranspose2d) | pytorch

文章目录前言一、nn.Upsample 上采样二、nn.ConvTranspose2d 转置卷积前言 这次就不废话了&#xff0c;我想赶在10点前回去洗头&#xff08;现在9.17&#xff0c;还差一篇文章&#xff09; 一、nn.Upsample 上采样 该函数有四个参数&#xff1a; 参数的介绍如下&#xff1a…

工厂模式(Factory Pattern) 与抽象工厂模式(Abstract Factory Pattern)

工厂模式&#xff08;Factory Pattern) 与抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09; 工厂模式属于构造型模式&#xff0c;是项目中最常用到的一种设计模式。它的主要作用是提供一种简单的创建对象的方式&#xff0c;使用者无需知道创建实例的细节以及需要…

重启虚拟机启动Docker常见问题

文章目录重启虚拟机启动Docker常见问题一、Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?二、admin is not in the sudoers file. This incident will be reported.&#xff08;没有这个问题请自觉跳过&#xff09;三、…

华清远见11.17

1.在用户空间中有个字符数组&#xff0c;要求在内核空间打印&#xff0c;用dmesg查看。&#xff08;ioctl实现&#xff09; zy.h&#xff0c;封装一个发送用的命令码 #ifndef __LED_H__ #define __LED_H__ #define UACCESS_BUF _IOW(a,1,char [128]) #endif zy.c 申请并自动创…

2022 开源之夏|EMQ 三大开源项目开发圆满收官

今年暑假&#xff0c;EMQ 携手开源之夏&#xff0c;与高校学生开展了一场精彩纷呈的开源之旅。开源之夏&#xff08;OSPP&#xff09;是由中科院软件所「开源软件供应链点亮计划」发起的、面向高校学生的暑期开源活动&#xff0c;旨在鼓励在校学生积极参与开源软件的开发维护&a…

CE-Net: Context Encoder Network for 2D MedicalImage Segmentation

Title:用于二维医学图像分割的上下文编码器网络 摘要&#xff1a;在医学图像分割领域中&#xff0c;基于UNet已经成为主流的应用框架。但是在UNet结构中连续的池化和跨步卷积操作会导致一些空间信息的丢失。在本文中提出了一个上下文编码器网络&#xff08;简称为CE-Net&#…