看到最近“微服务架构”这个概念这么火,做为一个积极上进的程序猿,成小胖忍不住想要学习学习。而架构师老王(不是隔壁老王)最近恰好在作公司基础服务的微服务化研究和落地,对此深有研究。java
因而成小胖立刻屁颠屁颠的跑过去向老王请教:“王哥,我看微服务架构这么火,我也想学,您给我讲讲啥是微服务架构呗?”数据库
老王笑了笑说:“要想知道什么是微服务架构,你得先知道什么系统架构设计。”服务器
成小胖的理想是成为一名架构师,平时积累了很多知识,所以对“系统架构设计”这个概念仍是很熟悉的,所以他立刻就给出了答案【1】:网络
系统架构设计描述了在应用系统的内部,如何根据业务、技术、组织、灵活性、可扩展性以及可维护性等多种因素,将应用系统划分红不一样的部分,并使这些部分彼此之间相互分工、相互协做,从而为用户提供某种特定的价值的方式。架构
老王满意的点点头,继续问:“你看最近我在作微服务的研究和落地,你知道为何要作这个事情吗?”框架
“由于目前的三层架构存在不少弊端,不知足业务发展的需求了呗。”运维
“对的,我看你对公司目前的架构也很是熟悉了,你来仔细说说如今的三层架构吧。”异步
因而成小胖拿了一张A4纸,图文并茂地给老王讲了他对三层架构的理解:
三层架构是指在业务和技术的发展过程当中,系统中不一样职责的部分被定义在不一样的层次,每一层负责的功能更加具体化。三层架构一般包括表示层、业务逻辑层和数据访问层,层与层之间互相链接、互相协做,构成一个总体,而且层的内部能够被替换成其余能够工做的部分,但对总体的影响不大。分布式
以 Web 应用程序为例,早期是将全部的表示逻辑、业务逻辑和数据访问逻辑放在一块儿,这就是一层架构。微服务
后来随着 java、.NET 等高级语言的发展,提供了愈来愈方便的数据访问机制,如 java 的 JDBC 和 .NET 的 ADO.NET。这时数据访问部分被分离开来,造成了二层架构。
再后来,随着面向对象设计、企业架构模式等理念的不断发展,表示逻辑和业务逻辑也被分离开来,造成了如今的三层架构。
三层架构的具体内容以下:
- 表示层: 用户使用应用程序时,看到的、听见的、输入的或者交互的部分。
- 业务逻辑层: 根据用户输入的信息,进行逻辑计算或者业务处理的部分。
- 数据访问层: 关注有效地操做原始数据的部分,如将数据存储到存储介质(如数据库、文件系统)及从存储介质中读取数据等。
老王对这个解释很是满意,做了进一步的补充:“你看虽然如今程序被分红了三层,但只是逻辑上的分层,并非物理上的分层。也就是说,对不一样层的代码而言,通过编译、打包和部署后,全部的代码最终仍是运行在同一个进程中。而这,就是所谓的单块架构。”
成小胖挠了挠头:“原来单块架构是这个意思啊~~”
“嗯。根据你的实际工做经验,你再总结下单块架构的优缺点吧。”
平时勤于总结的成小胖很快便列出了单块架构的优缺点:
优势:
- 易于开发: 开发方式简单,IDE 支持好,方便运行和调试。
- 易于测试: 全部功能运行在一个进程中,一旦进程启动,即可以进行系统测试。
- 易于部署: 只须要将打好的一个软件包发布到服务器便可。
- 易于水平伸缩: 只须要建立一个服务器节点,配置好运行时环境,再将软件包发布到新服务器节点便可运行程序(固然也须要采起分发策略保证请求能有效地分发到新节点)。
缺点:
- 维护成本大: 当应用程序的功能愈来愈多、团队愈来愈大时,沟通成本、管理成本显著增长。当出现 bug 时,可能引发 bug 的缘由组合愈来愈多,致使分析、定位和修复的成本增长;而且在对全局功能缺少深度理解的状况下,容易在修复 bug 时引入新的 bug。
- 持续交付周期长: 构建和部署时间会随着功能的增多而增长,任何细微的修改都会触发部署流水线。
- 新人培养周期长: 新成员了解背景、熟悉业务和配置环境的时间愈来愈长。
- 技术选型成本高: 单块架构倾向于采用统一的技术平台或方案来解决全部问题,若是后续想引入新的技术或框架,成本和风险都很大。
- 可扩展性差: 随着功能的增长,垂直扩展的成本将会愈来愈大;而对于水平扩展而言,由于全部代码都运行在同一个进程,没办法作到针对应用程序的部分功能作独立的扩展。
老王拍了拍成小胖的肩膀,眼睛眯成了一条缝:“小伙子总结的很不错!既然你已经对目前的单块架构的优缺点有了很好的理解,那如今我们就能够开始来学习微服务架构了。”
老王先从网上搜索“微服务架构”关键字,出来这么一段话:
微服务架构是一种架构模式,它提倡将单一应用程序划分红一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每一个服务运行在其独立的进程中,服务于服务间采用轻量级的通讯机制互相沟通(一般是基于 HTTP 的 RESTful API)。每一个服务都围绕着具体业务进行构建,而且可以被独立地部署到生产环境、类生产环境等。另外,应尽可能避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建。
成小胖看完了这段话,说:“看着有点晕,云里雾里的感受……”
老王嘿嘿一笑:“莫慌,如今就给你详细讲讲微服务架构的特性。”
1. 单一职责
微服务架构中的每一个服务,都是具备业务逻辑的,符合高内聚、低耦合原则以及单一职责原则的单元,不一样的服务经过“管道”的方式灵活组合,从而构建出庞大的系统。
2. 轻量级通讯
服务之间经过轻量级的通讯机制实现互通互联,而所谓的轻量级,一般指语言无关、平台无关的交互方式。
对于轻量级通讯的格式而言,咱们熟悉的 XML 和 JSON,它们是语言无关、平台无关的;对于通讯的协议而言,一般基于 HTTP,能让服务间的通讯变得标准化、无状态化。目前你们熟悉的 REST(Representational State Transfer)是实现服务间互相协做的轻量级通讯机制之一。使用轻量级通讯机制,可让团队选择更适合的语言、工具或者平台来开发服务自己。
3. 独立性
每一个服务在应用交付过程当中,独立地开发、测试和部署。
在单块架构中全部功能都在同一个代码库,功能的开发不具备独立性;当不一样小组完成多个功能后,须要通过集成和回归测试,测试过程也不具备独立性;当测试完成后,应用被构建成一个包,若是某个功能存在 bug,将致使整个部署失败或者回滚。
在微服务架构中,每一个服务都是独立的业务单元,与其余服务高度解耦,只须要改变当前服务自己,就能够完成独立的开发、测试和部署。
4. 进程隔离
单块架构中,整个系统运行在同一个进程中,当应用进行部署时,必须停掉当前正在运行的应用,部署完成后再重启进程,没法作到独立部署。
有时候咱们会将重复的代码抽取出来封装成组件,在单块架构中,组件一般的形态叫作共享库(如 jar 包或者 DLL),可是当程序运行时,全部组件最终也会被加载到同一进程中运行。
在微服务架构中,应用程序由多个服务组成,每一个服务都是高度自治的独立业务实体,能够运行在独立的进程中,不一样的服务能很是容易地部署到不一样的主机上。
理论上全部服务能够部署在同一个服务器节点,可是并不推荐这么作,由于微服务架构的主旨就是高度自治和高度隔离。
“王哥你真厉害,您这么一说个人思惟清晰了不少!”成小胖激动的几乎要叫起来。
“我以前了解过 SOA,好像跟微服务架构的思想很像啊,您能帮我区分一下吗?”成小胖追问到。
老王嘿嘿一笑,拿起成小胖手上的A4纸,翻到另一面画了个表格:
SOA实现 | 微服务架构实现 |
企业级,自顶向下开展实施 | 团队级,自底向上开展实施 |
服务由多个子系统组成,粒度大 | 一个系统被拆分红多个服务,粒度细 |
企业服务总线,集中式的服务架构 | 无集中式总线,松散的服务架构 |
集成方式复杂(ESB/WS/SOAP) | 集成方式简单(HTTP/REST/JSON) |
单块架构系统,相互依赖,部署复杂 | 服务能独立部署 |
接着老王又画了一张图:
成小胖看了以后说:“您这么一画我却是大概明白了,可是图里面的 DevOps 这个概念我不懂诶……”
“这个 DevOps 就说来话长了,有时间你本身先去查查资料了解下吧。”
“好的。如今我对微服务架构的概念有了了解,您能再深刻剖析下它的本质吗?”
“好,你可仔细听好了哈!”
1. 服务做为组件
微服务也能够被认为是一种组件,可是跟传统组件的区别在于它能够独立部署,所以它的一个显著的优点。另一个优势是,它在组件与组件之间定义了清晰的、语言无关、平台无关的规范接口,耦合度低,灵活性很是高。但它的不足之处是,分布式调用严重依赖于网络的可靠性和稳定性。
2. 围绕业务组织团队
在单块架构中,企业通常会根据技能划分团队,在这种组织架构下,即使是简单的需求变动都有可能须要跨团队协做,沟通成本很高。而在微服务架构中,它提倡以业务为核心,按照业务能力来组织团队,团队中的成员具备多样性的技能。
3. 关注产品而非项目
在单块架构中,应用基本上是基于“项目模式”构建的,即项目启动时从不一样技能资源池中抽取相关资源组成团队,项目结束后释放全部资源。这种状况下团队成员缺少主人翁意识和产品成就感。
在微服务架构中,提倡采用“产品模式”构建,即更倾向于让团队负责整个服务的生命周期,以便提供更优质的服务。
4. 技术多样性
微服务架构中,提倡针对不一样的业务特征选择合适的技术方案,有针对性的解决具体业务问题,而不是像单块架构中采用统一的平台或技术来解决全部问题。
5. 业务数据独立
微服务架构提供自主管理其相关的业务数据,这样能够随着业务的发展提供数据接口集成,而不是以数据库的方式同其余服务集成。另外,随着业务的发展,能够方便地选择更合的工具管理或者迁移业务数据。
6. 基础设施自动化
在微服务架构的实践过程当中,对持续交付和部署流水线的要求很高,将促进企业不断寻找更高效的方式完成基础设施的自动化及 DevOps 运维能力的提高。
听完成小胖忍不住表达了敬佩之意:“老司机就是老司机,噢说错了……架构师就是架构师,总结得这么简洁又深入!”
“咳咳,低调低调……”
“听您讲解了这么多,我以为微服务架构解决了不少当前三层架构的痛点。不过我以为没有任何一项技术或架构是完美的。”
“很是正确。进行微服务架构的落地是存在不少挑战的。”
1. 分布式系统的复杂性
微服务架构是基于分布式的系统,而构建分布式系统必然会带来额外的开销。
- 性能: 分布式系统是跨进程、跨网络的调用,受网络延迟和带宽的影响。
- 可靠性: 因为高度依赖于网络情况,任何一次的远程调用都有可能失败,随着服务的增多还会出现更多的潜在故障点。所以,如何提升系统的可靠性、下降因网络引发的故障率,是系统构建的一大挑战。
- 异步: 异步通讯大大增长了功能实现的复杂度,而且伴随着定位难、调试难等问题。
- 数据一致性: 要保证分布式系统的数据强一致性,成本是很是高的,须要在 C(一致性)A(可用性)P(分区容错性) 三者之间作出权衡。
2. 运维成本
运维主要包括配置、部署、监控与告警和日志收集四大方面。微服务架构中,每一个服务都须要独立地配置、部署、监控和收集日志,成本呈指数级增加。
3. 自动化部署
在微服务架构中,每一个服务都独立部署,交付周期短且频率高,人工部署已经没法适应业务的快速变化。所以如何有效地构建自动化部署体系,是微服务面临的另外一个挑战。
4. DevOps 与组织架构
在微服务架构的实施过程当中,开发人员和运维人员的角色发生了变化,开发者将承担起整个服务的生命周期的责任,包括部署和监控;而运维则更倾向于顾问式的角色,尽早考虑服务如何部署。所以,按需调整组织架构、构建全功能的团队,也是一个不小的挑战。
5. 服务间的依赖测试
单块架构中,一般使用集成测试来验证依赖是否正常。而在微服务架构中,服务数量众多,每一个服务都是独立的业务单元,服务主要经过接口进行交互,如何保证依赖的正常,是测试面临的主要挑战。
6. 服务间的依赖管理
微服务架构中,服务数量众多,如何清晰有效地展现服务间的依赖关系也是个不小的挑战。
“微服务的落地须要通过全面的考察和完善的试验,并非每一个场景都适合使用微服务架构,也不是每一个企业都有能力或者精力去面对这些挑战。”老王最后语重心长的说。
“嗯嗯,每件事都有两面性,最合适的才是最好的!对了王哥,您已经给我上完理论课了,啥时候带我实践下呗?”
“你先好好消化完今天讲的这些,下次再说吧……”
“好吧,很期待咱们的下一次交流……”
【1】图片源及内容主要参考《微服务架构与实践》。