点击上方“程序猿技术大咖”,关注并选择“设为星标”

回复“加群”获取入群讨论资格!

文末有送书活动说明,《架构师的自我修炼:技术、架构和未来》等您来拿!

本文摘自机械工业出版出版的《架构师的自我修炼:技术、架构和未来》一书,作者李智慧,经出版方授权发布。

微服务架构是从单体架构演化而来的。所谓单体架构,指的是整个互联网系统所有代码打包在一个程序中,部署在一个集群上,一个单体应用构成整个系统。

而微服务架构则是将这个大的应用里面的一些模块拆分出来,这些模块独立部署在一些相对较小的服务器集群上,应用通过远程调用的方式依赖这些独立部署的模块完成业务处理。这些被独立部署的模块被称为微服务,而这样的应用架构也被称为微服务架构。

应该说,模块化、低耦合一直以来都是软件设计追求的目标,独立部署的微服务使模块之间的依赖关系更加清晰,隔离得也更好,让系统更易于开发、维护,代表了正确的技术方向。但是在实践中,有时使用了微服务系统反而变得更加难以开发、维护,技术团队痛苦不堪,觉得是微服务的“锅”,于是主张放弃微服务,退回到单体架构。

那么,究竟该不该使用微服务?微服务是“灵丹”还是“毒药”?

单体架构的困难和挑战

阿里巴巴大约是国内最早尝试微服务的企业之一。让我们先回顾一下这段历史,看看当年阿里巴巴为什么要使用微服务架构?微服务架构能解决什么问题?用好微服务需要做哪些准备?

阿里巴巴开始尝试微服务架构大约是在2008年。在此之前,一个网站就是一个大应用,一个用Java开发的war包就包含了整个应用。系统更新时,即使只是更新其中极小的一部分,也要重新打包整个war包,发布整个系统。

随着业务的不断发展,这样的单体巨无霸系统遇到了越来越多的困难。

1. 编译、部署困难

一个应用系统一个war包,这个war包的大小可能是几个GB。对于开发工程师来说,开发编译和部署这个war包都是非常困难的,当时我用自己的电脑编译,大约花了半个多小时。工程师在开发的过程中,即使只改了庞大系统中的一行代码,也必须重新打包完整的系统才能做开发测试。对这样的单体系统进行开发部署和测试都是非常困难的,有时甚至一天都写不了几行代码。

2. 代码分支管理困难

因为单体应用非常庞大,所以代码模块也是由多个团队共同维护的,但最后还是要编译成一个单体应用,统一发布。这就要求把各个团队的代码合并在一起,这个过程很容易发生代码冲突。而合并的时候又是应用要发布的时候,发布本就是复杂的过程,再加上代码合并带来的风险,各种情况纠缠在一起,极易出错。所以,在单体应用时代,每一次应用发布都需要搞到深更半夜。

3. 数据库连接耗尽

对于一个巨型的应用而言,因为有大量的用户进行访问,所以必须部署到大规模的服务器集群上,且每个应用都需要与数据库建立连接。大量的应用服务器连接到数据库,会对数据库的连接产生巨大的压力,某些情况下甚至会耗尽数据库的连接。

4. 新增业务困难

因为所有的业务都耦合在一个单一的大系统里,随着时间的推移,这个系统会变得非常复杂,想要维护这样一个系统是非常困难的。很多新入职的工程师不熟悉业务,于是熟悉系统的老员工要加班加点地干活,不熟悉系统的新员工虽然一帮忙就出乱,但也免不了要跟着加班。整个公司热火朝天地干活,但最后还是常常出故障,新的功能迟迟不能上线。

5. 发布困难

单体系统一个war包就包含了所有的代码,新版本发布的时候,即使跟自己开发的代码一点关系都没有,但就因为包含了自己的代码,所以也不得不跟着发布值班,真正更新代码功能的只有几个人,他们汗流浃背地处理代码冲突和修复发布Bug,没有代码更新的同事则陪着聊天、打瞌睡、打游戏。

这些单体架构带来的问题很多工程师都是有切身体会的。所以,在开始重构微服务架构时,虽然也遇到了很多挑战和困难,但是大家为了自身的利益,还是团结一致,成功完成了微服务架构重构。

微服务框架原理

当时,阿里自己开发了一个微服务框架重构微服务架构,这个微服务框架就是著名的Dubbo。Dubbo借鉴了此前更早的SOA架构方案,即面向服务的体系架构。SOA架构如图27-1所示。

在面向服务的体系架构里面,服务提供者向注册中心注册自己的服务后,服务调用者要到注册中心去发现服务,发现服务以后,根据服务注册中心提供的访问接口和访问路径对服务发起请求,由服务的提供者完成请求,返回结果给调用者。后来的各种微服务框架其实都可以认为是SOA架构的一种实现。但是在早期的SOA架构实践中,WSDL、SOAP这些协议都比较重,服务的注册与发现描述协议很复杂,服务的调用效率也比较低。

Dubbo在借鉴SOA架构的基础上进行了优化,抛弃了SOA一些不必要的规范约束,使用二进制协议进行服务注册与调用,这使得执行效率和使用的简洁性都得到了极大提升。Dubbo架构如图27-2所示。

Dubbo架构和SOA架构一样,最核心的组件也是三个,分别是服务提供者、服务消费者和服务注册中心。

顾名思义,服务的提供者就是微服务的具体提供者,它通过微服务容器对外提供服务,而服务的消费者就是应用系统或是其他微服务。

具体过程是服务的提供者程序在Dubbo的服务容器中启动,通过服务管理容器向服务注册中心进行注册,声明服务提供者提供的接口参数和规范,并且注册自己所在服务器的IP地址和端口。

服务的消费者如果想要调用某个服务,只需依赖服务提供者的接口进行编程即可。而服务接口通过Dubbo框架的代理访问机制,调用Dubbo的服务框架客户端,服务框架客户端会根据服务接口声明,去注册中心查找对应的服务提供者启动在哪些服务器上,并且将这个服务器列表返回给客户端。客户端根据某种负载均衡策略,选择某一个服务器,通过远程通信模块发送具体的服务调用请求。

服务调用请求通过Dubbo底层的远程通信模块,也就是RPC调用方式,将请求发送到服务的提供者服务器,服务提供者服务器收到请求以后,将该请求发送给服务提供者程序,执行服务,并将服务执行的结果通过远程调用通信模块RPC返回给服务消费者客户端,服务消费者客户端将结果返回给服务调用程序,从而完成远程服务的调用,获得服务处理的结果。

微服务架构的落地实践

阿里当时进行微服务架构重构的目标比较明确,要解决的问题也是工程师们日常开发的痛点,大家积极参与其中,所以阿里的微服务重构过程还是比较成功的。

即使在单体时代,war包内的模块关系也是比较清晰的。所以在重构微服务时,只需要对这些模块进行较小的改动,进行微服务部署就可以了。这也是阿里微服务重构成功的另外一个重要因素。

那么,回到本章开始的问题,为什么有些企业会觉得用了微服务之后,反而问题更多了呢?

有些实施微服务的技术团队,既没有达成共识,又没有做好模块划分,模块的职责边界不清,依赖关系混乱,很多单体架构下隐藏的问题到了微服务上反而变得更加严重,于是有人觉得是微服务这个技术有问题。

微服务不同于分布式缓存、分布式消息队列或者分布式数据库这些技术。这些技术相对来说是比较“纯粹”的,和业务的耦合关系并不大,使用这些技术的场景也比较明确。而微服务本身和业务强相关,如果业务关系没梳理好,模块设计不清晰,使用微服务架构很可能得不偿失,带来各种问题。

很多技术团队在实施微服务的时候,把关注的重点放在了微服务技术框架上。事实上,微服务技术框架作为一个工具对于成功实施微服务不是最重要的,最重要的是使用微服务究竟能得到什么,也就是自己的需求是什么。

实施微服务的关注点应该是如图27-3所示的倒三角模型。

首先明确自己的需求,即我们到底想用微服务达到什么样的目的。需求清晰了,再去考虑具体要实现的价值,并根据价值构建我们的设计原则,根据设计原则寻找最佳实践,最后根据实践去选择最合适的工具。

如果先找到一个工具,然后用工具硬往上套需求,只会导致技术用不好,业务也做不好,所有人都疲惫不堪,事情变得一团糟,最后还要反过来找技术的毛病。

小结

微服务和业务的关系是非常紧密的,仅仅用好微服务技术框架是无法成功实施微服务的。成功实施微服务最重要的是做好业务的模块化设计,模块之间要低耦合、高聚合,模块之间的依赖关系要清晰简单。只有实现这样的模块化设计,才能构建出良好的微服务架构。如果系统本身就是一团糟,强行将它们拆分在不同的微服务里,只会使系统变得更加混乱。

推荐阅读:

《架构师的自我修炼:技术、架构和未来》从四个方面,全方位阐述了架构师必须具备的各项知识。本书既包含了成为一个软件架构师必须具备的各种知识技能体系,也包含了修炼成为一个架构师的学习成长思考。阅读本书,相信您从中不但可以领会各种技术的内在联系,也可以领悟到更深刻的技术和成长之道。

送书规则

送书规则:感谢大家对公众号“程序猿技术大咖”的信任与支持。在留言区大声告诉我们,你对微服务、架构师等的看法小编会在留言池随机捞2条锦鲤(留言点赞数越高,几率越大哦),分别包邮送出1本正版书籍《架构师的自我修炼:技术、架构和未来》,快来邀请您的小伙伴为您点赞,一起领取吧!

截止日期5月9日晚22:00

特别注意

1、首先确保您是公众号“程序猿技术大咖”的粉丝,如若不是,请先关注我。

2、请按规则结合自身工作、学习经历以及个人看法留言。请规避百度式名词解释式言论,走心留言优先。

3、阅读最多、分享最多者优先。活动参与活跃者优先。


感谢您的阅读,也欢迎您发表关于这篇文章的任何建议,关注我,技术不迷茫!

  • 构建基于Spring Cloud向Service Mesh框架迁移的解决方案及思路

  • 我对技术架构的理解与架构师角色的思考

  • MySQL性能优化(七):MySQL执行计划,真的很重要,来一起学习吧

  • 微服务架构下的核心话题 (三):微服务架构的技术选型

喜欢就点个"在看"呗,留言、转发朋友圈

微服务究竟是“灵丹”还是“毒药”? | 文末送书相关推荐

  1. 《微服务架构设计模式》总结,文末送书

    经常翻阅微服务材料的话,总会碰到 microservices.io 这个网站,总结了微服务方方面面的设计模式.网站的作者是 Chris Richardson. 这些相关的经验在 2018 年成为了&l ...

  2. 性能无敌的HikariCP数据库连接池实战(文末送书)

    导读:数据库连接池在Java数据库相关中间件产品群中,应该算是底层最基础的一类产品,作为企业应用开发必不可少的组件,无数天才们为我们贡献了一个又一个的优秀产品,它们有的随时代发展,功成身退,有的则还在 ...

  3. 张益唐被曝已证明黎曼猜想相关问题,震动数学界(文末送书)

    金磊 Alex 发自 凹非寺 量子位 | 公众号 QbitAI 文末送书活动,记得看完啊 ! 先加群后抽奖,这次仅限群友参与 Breaking News! 网传数学家张益唐,已经攻克了朗道-西格尔零点 ...

  4. 【iToday】涵盖100+技术网站的一站式资讯平台 | 文末送书

    里面包含了上百个IT网站,欢迎大家访问:http://itoday.top/#/ iToday,打开信息的新时代.作为一家创新的IT数字媒体平台,iToday致力于为用户提供最新.最全面的IT资讯和内 ...

  5. 【英杰送书第三期】Spring 解决依赖版本不一致报错 | 文末送书

    Yan-英杰的主 悟已往之不谏 知来者之可追   C++程序员,2024届电子信息研究生 目录 问题描述 报错信息如下 报错描述 解决方法 总结 [粉丝福利] [文末送书] 目录: 本书特色: 问题描 ...

  6. 媳妇居然在家偷偷背着我偷看我的面试笔记,一个月后拿下大厂offer!(文末送书)...

    知乎热议: 到底要掌握哪些技术才能顺利的找一份20K的工作? 根据这些年的工作经验,加上网络搜集,我特意整理了一套针对职场进阶的干货! 有很多朋友靠着这些内容进行复习拿到了BATJ等大厂的offer, ...

  7. 月薪没过20K的程序员要注意了!(文末送书)

    知乎热议: 到底要掌握哪些技术才能顺利的找一份20K的工作? 根据这些年的工作经验,加上网络搜集,我特意整理了一套针对职场进阶的干货! 有很多朋友靠着这些内容进行复习拿到了BATJ等大厂的offer, ...

  8. 挖槽!堪称神级的Java技术手册火了???(文末送书活动)

    前言 本文是为了帮大家快速回顾了Java中知识点,这套面试手册涵盖了诸多Java技术栈的面试题和答案,相信可以帮助大家在最短的时间内用作面试复习,能达到事半功倍效果. 本来想将文件上传到github上 ...

  9. 文末送书 | WAF 那些事

    Hi!,我是小小,这是小小本周的最后一篇,本篇将会介绍WAF的事情,本篇将会文末送书.在此小小举出小手,相当欢迎各位快点快点快点参加. 什么是WAF WAF是一种产品,一种web应用防火墙,通过执行一 ...

  10. 文末送书 | 数据分析简单入门

    这是小小本周的最后一篇,本周重点!文末送书, 我是小小,下面是本期文章,为您奉上! 前言 本实例将会以一个完整的例子用来阐述一个较为简单的Python数据分析.其中Python基础部分不再讲解 构建数 ...

最新文章

  1. [UE4]RetainerBox,控制UI更新频率,把渲染后的UI当成Texture
  2. C#中调用Windows API的要点【转载】
  3. Linux - 收藏集 - 掘金
  4. Kafka学习 之 第一个例子(一)
  5. windows7 删除hiberfil.sys文件的方法
  6. centos ping不通内网 网关 外网 域名等以解决 通过设置为动态IP(启用dhcp协议)
  7. do_something方法解析
  8. overridden/inherited关键字的读书笔记
  9. linux给普通用户添加管理员权限,linux 赋予普通用户管理员权限
  10. ApacheCN 活动汇总 2019.7.27
  11. 爱奇艺影视剧智能配音系统奇声获2022年度CCF科技成果奖“科技进步一等奖”
  12. Spring中的用到的设计模式
  13. 标志设计|标识设计|商标设计|logo设计|的起源
  14. 政府行政管理思维与互联网思维
  15. easyUI datagrid 遍历集合
  16. 【PyG入门学习】三:信息传递机制
  17. 搞清楚 Python traceback
  18. 新一代人工智能有哪些新看点?
  19. Quartus调用ModelSim进行仿真的步骤
  20. 语音领域的自适应滤波

热门文章

  1. 41、海滩上有一堆桃子,五只猴子来分。
  2. figlet - 字符画工具
  3. keil中某个文件无法修改,不能输入
  4. uniapp 使用editor编辑器实现 发布文章的功能
  5. 如何实现欧姆龙C200H的PLC远程程序上下载?
  6. 五条计算机规则英语,常用英语口语900句(五)
  7. vs 2008 winfrom 水晶报表使用Crystal Reports
  8. 【word wps文字】目录页码中的格式在打印或打印预览时变为和正文页码格式一样,如何调整?
  9. 2017移动开发年终盘点
  10. 转转实时OLAP分析场景技术选型与应用实践