华为架构师谈如何理解运用模块与微服务

模块化还是微服务?

我们的业务由一个大型应用转向微服务的时候,除了很好展示漂亮的PPT,提升KPI之外,实际操作时将整个业务切成微型服务似乎也不费吹灰之力。但这种方法真的是我们的最佳选择吗?确实,维护凌乱的单片应用程序有许多缺点。但是有一个令人信服的替代方案经常被忽视:模块化应用程序开发。 在本文中,我们将探讨这种替代方案的含义,并展示它与构建微服务的关系。

什么是微服务?

微服务现在越来越火爆,但是到底什么是微服务?Sam Newman在《构建微服务》中提供了对微服务的简洁定义是:“微服务是一种小型,自主的服务,且相互之间可以协同工作。”

在《微服务架构》这本书中,作者Mike Amundsen,Irakli Nadareishvili,Ronnie Mitra和Matt McLarty通过概述微服务应用程序共享的特征说明微服务的细节:

  • 体积小
  • 启用消息
  • 以上下文为界
  • 自主开发
  • 可独立部署
  • 分散
  • 使用自动化流程构建和发布

一、模块化的微服务

“通过微服务,我们最终可以让团队独立工作”,或者“我们的应用太复杂,这让我们放慢脚步”。这些表达只是导致开发团队走上微服务道路的众多原因中的一小部分。另一个问题是需要可扩展性和弹性。开发人员似乎总是渴望的是系统设计和开发的模块化方法。

软件开发中的模块化可以归结为三个指导原则:

1.1,强大的封装

隐藏组件内部的实现细节,导致不同部件之间的低耦合。团队可以在系统的分离部分上独立工作。

1.2,定义良好的接口

您无法隐藏所有内容(否则您的系统不会做任何有意义的事情),因此组件之间定义良好且稳定的API是必须的。组件可以由符合接口规范的任何实现替换。

1.3,显式依赖

拥有模块化系统意味着不同的组件必须协同工作。你最好有一种表达(和验证)他们关系的好方法。

上述原则可以通过微服务实现。而微服务可以用任何方式实现,只要它为其他服务公开定义良好的接口(通常是REST API)即可。其实施细节是服务的内部细节,可以在没有全系统影响或协调的情况下进行更改。但微服务之间的依赖关系在开发时通常不是很明确,导致运行时可能的服务编排失败。

因此,微服务实现了重要的模块化原则,从而带来了实实在在的好处:

  • 团队可以独立工作和扩展。
  • 微服务规模小,重点突出,降低了复杂性。
  • 服务可在内部更改或替换,而不会产生全局影响。

当我们从一个(虽然有点臃肿)应用程序转变为分布式微服务系统,这其实带来了大量的操作复杂性。突然间,您需要不断部署许多不同的(可能是容器化的)服务。出现了新的问题:服务发现,分布式日志记录,跟踪等。现在更容易出现分布式计算下的错误了。接口和配置管理的版本控制也会成为一个主要问题。而且问题清单会一直增长下去。

事实证明,微服务之间的连接与所有单个微服务的组合业务逻辑一样复杂。虽然整体代码库中的“意大利面条代码”存在问题,但在这两者之间存在网络边界会使这些纠缠问题升级为彻头彻尾的痛苦。

ps:意大利面条代码是非结构化和难以维护的源代码的贬义词。可能由多种因素引起,例如易变的项目要求,缺乏编程风格规则以及能力或经验不足。

二、模块化替代方案

这是否意味着我们要么被降级为凌乱的大型应用,还是必须淹没在微服务疯狂的复杂性中?模块化也可以通过其他方式实现。重要的是我们可以在开发过程中有效地绘制和强制执行边界。但我们也可以通过创建一个结构良好的大型应用来实现这一目标。当然,这意味着我们往往会从编程语言和开发工具中获得帮助,以实施模块化原则。

例如,在Java中,有几个模块系统可以帮助构建应用程序。 OSGi是最着名的一个,但随着Java 9的发布,Java平台本身就添加了一个本机模块系统。模块这种特性作为一流的结构现在是语言和平台的一部分。 Java模块可以表达对其他模块的依赖关系,并在强大地封装实现类的同时公开导出接口。甚至Java平台本身(一个庞大的代码库)也使用新的Java模块系统进行了模块化。

其他语言提供类似的机制。例如,JavaScript从ES2015开始获得了一个模块系统。在此之前,Node.js已经为JavaScript后端提供了一个非标准的模块系统。但是,作为一种动态语言,JavaScript对实施接口(类型)和模块之间的封装的支持较弱。可以考虑在JavaScript之上使用TypeScript再次获得此优势。微软的.Net Framework确实具有类似Java的强类型,但它在强大的封装和程序集之间的显式依赖性方面没有直接等同于Java即将推出的模块系统。尽管如此,通过使用在.Net Core中标准化的Inversion-of-Control模式以及通过创建逻辑相关的程序集,可以实现良好的模块化体系结构。甚至C ++也在考虑在未来的版本中增加一个模块系统。许多语言对模块化越来越感兴趣,模块化本身就是一个引人注目的发展。

当我们有意识地使用开发平台的模块化功能时,您可以实现我们之前归因于微服务的相同模块化优势。从本质上讲,模块系统越好,在开发过程中获得的帮助就越多。不同的团队可以在不同的部分上工作,其中只有明确定义的接口才是团队之间的接触点。但是,在部署时,模块在一个部署单元中聚集在一起。这样,您可以防止与迁移到微服务开发和管理相关的实质复杂性和成本。当然,这意味着无法在不同的技术栈上构建每个模块,不过对大多数公司和开发团队而言,真的能掌控好多个技术栈?

三、设计模块

创建好的模块需要与创建良好的微服务相同的设计要求。模块应该模拟业务域的单个有界上下文。选择微服务边界是一项架构上重要的决策,如果做错了,会产生代价高昂的后果。而模块化应用程序中的模块边界更容易更改。类型系统和编译器通常支持跨模块的重构。重新划分微服务边界需要进行大量的人际交流,以免在运行时爆炸。

在许多方面,静态类型语言中的模块为定义良好的接口提供了更好的结构。通过另一个模块公开的类型化接口调用方法对于更改比在另一个微服务上调用REST端点要强大得多。 REST + JSON无处不在,但在没有(编译器检查的)模式的情况下,它不是良好类型的互操作性的标志。更重要的是,许多模块系统允许表达对其他模块的依赖性,当违反这些依赖项时,模块系统会禁止这样做,至少会有个明确的提示,但微服务之间的依赖关系仅在运行时实现,导致难以调试的系统。

模块也是代码所有权的自然单位。团队可以负责系统中的一个或多个模块。与其他团队共享的唯一事情是其模块的公共API。在运行时,与微服务相比,模块之间的隔离更少。毕竟,一切仍然在同一个进程中运行。

没有理由为什么单块中的模块不能像一个好的微服务那样拥有它的数据。然后,模块化应用程序内的共享可以通过模块之间定义良好的接口或消息进行,而不是通过共享数据存储区。微服务的最大区别在于一切都在进行中。不应低估最终的一致性问题。通过模块,最终的一致性可以是一个深思熟虑的战略选择,而不是无法避免的选择。对于微服务,没有选择:只能选择最终的一致性。

四、微服务什么时候适合您的组织?

那么什么时候应该转向微服务?到目前为止,我们主要专注于通过模块化来解决复杂性问题。为此,微服务和模块化应用程序都可以。但除了迄今为止提出的挑战之外,还有不同的挑战。

  • 当公司有Google或Netflix的规模时,完全有理由接受微服务。这意味着,有能力构建自己的平台和工具包,并且工程师的数量也已经足够。但是大多数组织并没有以这种规模运作。哪怕是公司有一天会成为价值10亿美元的独角兽,从模块化的大型应用开始也不会造成什么问题。

  • 启动单独的微服务的另一个好理由是,不同的服务本质上更适合于不同的技术栈。也就是锁,必须拥有足够的规模来吸引这些不同的技术栈中的人才,并保持这些平台的正常运行。

  • 微服务还可以独立部署系统的不同部分,这在大多数模块化平台中很难(甚至不可能)。隔离部署增加了系统的弹性和容错能力。此外,缩放特性对于每个微服务可以是不同的。可以将不同的微服务部署到匹配的硬件上。模块化的整体也可以水平缩放,但是更细微的就很困难。但是在一般实践中,模块化这种方式可以支持很久的业务发展。

五、结论

如何选择?其实取决于环境,组织和应用程序本身。我们可以从模块化应用程序开始,然后随时选择转移到微服务,还可以使用模块在内部构建微服务。

如果我们追求模块化的好处,请确保我们不要落入只能使用微服务的思维模式。尽可能的在最喜欢或者最擅长的技术栈使用内置的模块化功能或框架。

作者:享学课堂Mark

转载请注明出处。

持续关注我,分享更多干货。

转载于:https://juejin.im/post/5d0b55dc6fb9a07efe2dc316

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

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

相关文章

Node.js 可以和 Web 实现 HTTP 请求的跨平台兼容了!

大家好,我是若川。持续组织了6个月源码共读活动,感兴趣的可以点此加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列大家好…

zeplin加载 不出图片_为什么Zeplin不能解决您的所有问题

zeplin加载 不出图片Design handover involves communicating the visual styles and behaviours of your design so they can be translated into code.设计移交涉及传达设计的视觉样式和行为,以便可以将它们转换为代码。 Back in the Dark Ages of digital desig…

POJ 基础数学

数学 组合数学 POJ3252,poj1850,poj1019,poj1942 数论 poj2635, poj3292,poj1845,poj2115 计算方法(二分) poj3273,poj3258,poj1905,poj3122 组合数学 poj 3252 题意:如果一个数是round number,则它的二进制表示中&#xff…

使用uwsgi和gunicorn部署Django项目

https://uwsgi-docs.readthedocs.io/en/latest/Management.html https://uwsgi-docs.readthedocs.io/en/latest/Management.html 先了解下相关杀进程命令 ps -ef|grep uwsgi|grep -v grep|awk {print $2}|xargs kill -9//查看uwsgi相关接口 ps -ef|grep uwsgi #查看相关端口 ne…

推荐2022前端必看的新书 《Vue.js设计与实现》

大家好,我是若川。持续组织了6个月源码共读活动,感兴趣的可以点此加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列这本新…

汉堡菜单_汉堡菜单-可访问性和用户体验设计原则的挑战?

汉堡菜单重点 (Top highlight)I was recently designing a hamburger menu for a client and before I knew it, I had embarked on this journey where I was reading article after article about the accessibility issues which accompany a hamburger icon. Turns out, th…

Server2012R2 ADFS3.0 The same client browser session has made '6' requests in the last '13'seconds

本问题是在windows server2012R2系统ADFS3.0环境下遇到的,CRM2013部署ADFS后运行一段时间(大概有一两个月)后在IE浏览器中访问登陆界面点击登陆后就报以下错误 “Microsoft.IdentityServer.Web.InvalidRequestException: MSIS7042: The same client browser session…

(原创)RHEL/CentOS 5.x使用yum快速安装MySQL 5.5.x

PS:MySQL 5.5系列成为稳定版已经有一段时间了,但据我调查了解,在生产环境中还是以5.1系列为主。在国内的大公司里,只确定金山在使用5.5了。 公司的其中几台广告统计服务器,之前的运维直接用了自带安装的MySQL 5.0系列。…

又一个基于 Esbuild 的神器!esno

大家好,我是若川。持续组织了6个月源码共读活动,感兴趣的可以点此加我微信 ruochuan02 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列esno我…

c# ui 滚动 分页_UI备忘单:分页,无限滚动和“加载更多”按钮

c# ui 滚动 分页重点 (Top highlight)When you have a lot of content, you have to rely on one of these three patterns to load it. So, which is best? What will your users like? What do most platforms use? These are the questions we will explore today.当内容…

1.20(设计模式)模板模式

模板模式,定义了一个模板,模板内容通过子类实现模板的抽象方法去添加。 就类似学校需要建一个新校区,新校区有多栋宿舍,找了多个施工方,每个施工方负责一栋宿舍楼。 各个施工方都有自己的想法,建造的宿舍楼…

少年,看你异于常人,有空花2小时来参加有3000人的源码共读嘛~

大家好,我是若川。按照从易到难的顺序,前面几期(比如:validate-npm-package-name、axios工具函数)很多都只需要花2-3小时就能看完,并写好笔记。但收获确实很大。开阔视野、查漏补缺、升职加薪。已经有400笔…

HDU 3488 KM

http://acm.hdu.edu.cn/showproblem.php?pid3488 依然KM, 可以最小费用流 与HDU1853 差不多,但是1853要判断是否满足回路的的条件,KM还不会判回路,所以做1853时学了最小费用流做的,说是学最小费用流 只是皮毛了。。…

Java 面向对象的程序设计(二)

编写一个java程序,设计一个汽车类Vehicle,包含的属性有车轮的个数wheels和车重weight。小汽车类Car是Vehicle的子类,包含的属性有载人数loader。卡车类Truck是Car类的子类,其中包含的属性有载重量payload。每个类都有构造方法和输…

16位调色板和32位调色板_使调色板可访问

16位调色板和32位调色板Accessibility has always been a tough sell. Admittedly, less so than in the ‘nineties, when no prospective client was interested. But even today — more enlightened times — the majority of companies I encounter still prefer to make …

从零开始发布自己的NPM包

大家好,我是若川。持续组织了6个月源码共读活动,感兴趣的可以点此加我微信 ruochuan02 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列在Ver…

flash不能访问本地文件

flash出现"不能访问本地资源";解决方案 linux下,如果没有文件夹自行创建 在/home/{user}/.macromedia/Flash_Player/#Security/FlashPlayerTrust下面,随便建个文本文件,比如1.txt 然后写入路径,最省事的办法直接来个/ 凶…

Jest + React Testing Library 单测总结

大家好,我是若川。持续组织了6个月源码共读活动,感兴趣的可以点此加我微信 ruochuan02 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列1、背…

不怕神一样的对手就怕猪一样的队友

“不怕神一样的对手就怕猪一样的队友”这句话现在广为流传,实际上说的就是团队重要性,一个好的团队是可以克服很多你想象不大的困难, 做出你觉得不可能成绩。 但是很多时候我们面临的不是神一样的对手,而是猪一样的队友&#xff0…

着迷英语900句_字体令人着迷

着迷英语900句I’m crazy about fonts. My favorite part of any text editing software is the drop down menu for picking fonts. When I look at any text, I try to identify the font. Roboto is my favorite font.我为字体疯狂。 在任何文本编辑软件中,我最喜…