• 分散
  • 使用自动化流程构建和发布

一、模块化的微服务

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

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

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。在运行时,与微服务相比,模块之间的隔离更少。毕竟,一切仍然在同一个进程中运行。

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

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

难道这样就够了吗?不,远远不够!

提前多熟悉阿里往年的面试题肯定是对面试有很大的帮助的,但是作为技术性职业,手里有实打实的技术才是你面对面试官最有用的利器,这是从内在散发出来的自信。

备战阿里时我花的最多的时间就是在学习技术上,占了我所有学习计划中的百分之70,这是一些我学习期间觉得还是很不错的一些学习笔记,以及学习视频都是可以点击这里免费领取的!

我为什么要写这篇文章呢,其实我觉得学习是不能停下脚步的,在网络上和大家一起分享,一起讨论,不单单可以遇到更多一样的人,还可以扩大自己的眼界,学习到更多的技术,我还会在csdn、博客、掘金等网站上分享技术,这也是一种学习的方法。

今天就分享到这里了,谢谢大家的关注,以后会分享更多的干货给大家!

img-ZhQIEIRn-1628616232256)]

[外链图片转存中…(img-RM2OWwzs-1628616232258)]

华为架构师谈如何理解运用模块与微服务,系统学Java从零开始相关推荐

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

    模块化还是微服务? 我们的业务由一个大型应用转向微服务的时候,除了很好展示漂亮的PPT,提升KPI之外,实际操作时将整个业务切成微型服务似乎也不费吹灰之力.但这种方法真的是我们的最佳选择吗?确实,维护 ...

  2. 首席架构师推荐:史上最全微服务架构简史详解!

    本文将介绍微服务架构和相关的组件,介绍他们是什么以及为什么要使用微服务架构和这些组件.本文侧重于简明地表达微服务架构的全局图景,因此不会涉及具体如何使用组件等细节. 要理解微服务,首先要先理解不是微服 ...

  3. 听听八年阿里架构师怎样讲述Dubbo和Spring Cloud微服务架构

    微服务架构是互联网很热门的话题,是互联网技术发展的必然结果.它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.虽然微服务架构没有公认的技术标准和规范或者草案,但业 ...

  4. 听听八年阿里架构师怎样讲述Dubbo和Spring Cloud微服务架构吧

    微服务架构是互联网很热门的话题,是互联网技术发展的必然结果.它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.虽然微服务架构没有公认的技术标准和规范或者草案,但业 ...

  5. 十年架构师耗尽心血带你如何进行微服务的单元、集成和系统测试?

    如何进行微服务的测试 对于测试工作而言,微服务架构对于传统的架构引入了更多的复杂性.一方面,随着微服务数量的增长,测试的用例也会持续增长;另一方面,由于微服务之间存在着一定的依赖性,在测试过程中如何来 ...

  6. Java程序员进阶架构师必备学习文档:SSM+微服务+分布式+Nginx+MySQL

    SSM企业级战 SSM框架是以Spring为核心,整合Spring MVC和Mybatis的轻量级框架技术的组合.利用SSM整合框架可以开发出分层.易扩展.易维护的企业级应用系统,能够极大地满足企业需 ...

  7. 华为架构师8年经验谈:从单体架构到微服务的服务化演进之路

    本次分享的技术大纲如下: 传统应用开发面临的挑战 服务化实践 服务化不是银弹 服务化架构的演进方向 一 .传统应用开发面临的挑战 挑战1-- 研发成本高 主要体现在如下几个方面: 代码重复率高 在实际 ...

  8. 阿里P8架构师谈:流量高峰时期的性能瓶颈有哪些、以及如何来解决

    在高并发大量用户的场景,系统一般会面临如下三个挑战: 1. 日益增长的用户数量 2. 日渐复杂的业务 3. 急剧膨胀的数据 这些挑战对于性能优化而言表现为:在保持和降低系统TP95响应时间(指的是将一 ...

  9. 阿里P8架构师谈:Zookeeper的原理和架构设计,以及应用场景

    什么是 Zookeeper Zookeeper 分布式服务框架是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如: 统一命名服务 状态同步服务 集群 ...

最新文章

  1. 量子计算机区别于冯诺依曼机的一个显著特点,大学计算机基础习题答案西安交大.doc...
  2. python写文件读文件-Python 读写文件和file对象的方法(推荐)
  3. audio h5 src 变了之后_我在叩丁狼学H5
  4. 卡扇区数据教程_分享一款硬盘分区和数据恢复软件
  5. 你可以不在BAT,但大厂的眼界不能没有
  6. [LeetCode] Search in Rotated Sorted Array [35]
  7. qqkey获取原理_QQ key盗号木马原理分析
  8. [原]VC被控制时关闭极域电子教室、破解联想硬盘保护系统密码(下)
  9. 对粒子滤波算法的理解 特别通俗易懂
  10. 翻译:swift 5 iOS Accessibility从入门到精通
  11. 以Mesos和Docker为核心的云操作系统
  12. cv2.error: OpenCV(4.5.2) C:\Users\runneradmin\AppData\Local\Temp\pip-req-build-1y7gm6kn\opencv\modul
  13. MySQL8 一文读懂存储过程
  14. Type-infity Wasserstein Ball
  15. 矩阵乘法 基础训练-蓝桥杯
  16. J2ME(cldc/midp)简介
  17. 图形 2.3 HLSL常用函数介绍
  18. jmeter并发性能测试遇到返回202,信息为服务器繁忙
  19. Python图像处理之十行代码搞定圆型头像生成
  20. xd羽化怎么调_【Cyberpunk】用一加轻松调出赛博朋克风XD

热门文章

  1. chai.js------使用
  2. (三)对图像进行Gauss高斯平滑处理
  3. 使用nuget 打包并上传 nuget.org
  4. 8.1 Kotlin Sealed类
  5. 纯千兆电口模块和自适应电口模块的区别
  6. 疯狂的 ICO 终于被全面叫停;9 月全球数据库排名,Oracle 跌势明显
  7. 在线炒股天载分析市场呈现出一片跌势
  8. 安装使用python-pcl调用ICP算法|debug
  9. c语言 运算符op,1 简单计算器。请编写一个程序计算表达式:datal op data2的值。其中op为运算符+、—、*、/。...
  10. unlikely 与 likely的作用