一文详解微服务架构(一)

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

要理解微服务,首先要先理解不是微服务的那些。一般跟微服务相对的是单体应用,即将全部功能都打包成在一个独立单元的应用程序。从单体应用到微服务并非一蹴而就的,这是一个逐渐演变的过程。本文将以一个网上超市应用为例来讲明这一过程。前端

最初的需求

几年前,小明和小皮一块儿创业作网上超市。小明负责程序开发,小皮负责其余事宜。当时互联网还不发达,网上超市仍是蓝海。只要功能实现了就能随便赚钱。因此他们的需求很简单,只须要一个网站挂在公网,用户可以在这个网站上浏览商品、购买商品;另外还需一个管理后台,能够管理商品、用户、以及订单数据。程序员

咱们整理一下功能清单:面试

  • 网站
    • 用户注册、登陆功能
    • 商品展现
    • 下单
  • 管理后台
    • 用户管理
    • 商品管理
    • 订单管理

因为需求简单,小明左手右手一个慢动做,网站就作好了。管理后台出于安全考虑,不和网站作在一块儿,小明右手左手慢动做重播,管理网站也作好了。整体架构图以下:算法

小明挥一挥手,找了家云服务部署上去,网站就上线了。上线后好评如潮,深受各种肥宅喜好。小明小皮美滋滋地开始躺着收钱。数据库

随着业务发展……

好景不长,没过几天,各种网上超市紧跟着拔地而起,对小明小皮形成了强烈的冲击。小程序

在竞争的压力下,小明小皮决定开展一些营销手段:微信小程序

  • 开展促销活动。好比元旦全场打折,春节买二送一,情人节狗粮优惠券等等。
  • 拓展渠道,新增移动端营销。除了网站外,还须要开发移动端 APP,微信小程序等。
  • 精准营销。利用历史数据对用户进行分析,提供个性化服务。
  • ……

这些活动都须要程序开发的支持。小明拉了同窗小红加入团队。小红负责数据分析以及移动端相关开发。小明负责促销活动相关功能的开发。缓存

由于开发任务比较紧迫,小明小红没有好好规划整个系统的架构,随便拍了拍脑壳,决定把促销管理和数据分析放在管理后台里,微信和移动端 APP 另外搭建。通宵了几天后,新功能和新应用基本完工。这时架构图以下:安全

这一阶段存在不少不合理的地方:

  • 网站和移动端应用有不少相同业务逻辑的重复代码。
  • 数据有时候经过数据库共享,有时候经过接口调用传输。接口调用关系杂乱。
  • 单个应用为了给其余应用提供接口,渐渐地越改越大,包含了不少原本就不属于它的逻辑。应用边界模糊,功能归属混乱。
  • 管理后台在一开始的设计中保障级别较低。加入数据分析和促销管理相关功能后出现性能瓶颈,影响了其余应用。
  • 数据库表结构被多个应用依赖,没法重构和优化。
  • 全部应用都在一个数据库上操做,数据库出现性能瓶颈。特别是数据分析跑起来的时候,数据库性能急剧降低。
  • 开发、测试、部署、维护愈发困难。即便只改动一个小功能,也须要整个应用一块儿发布。有时候发布会不当心带上了一些未经测试的代码,或者修改了一个功能后,另外一个意想不到的地方出错了。为了减轻发布可能产生的问题的影响和线上业务停顿的影响,全部应用都要在凌晨三四点执行发布。发布后为了验证应用正常运行,还得盯到次日白天的用户高峰期……
  • 团队出现推诿扯皮现象。关于一些公用的功能应该建设在哪一个应用上的问题经常要争论好久,最后要么干脆各作各的,或者随便放个地方可是都不维护。

尽管有着诸多问题,但也不可否认这一阶段的成果:快速地根据业务变化建设了系统。不过紧迫且繁重的任务容易令人陷入局部、短浅的思惟方式,从而作出妥协式的决策。在这种架构中,每一个人都只关注在本身的一亩三分地,缺少全局的、长远的设计。久而久之,系统建设将会愈来愈困难,甚至陷入不断推翻、重建的循环。

是时候作出改变了

幸亏小明和小红是有追求有理想的好青年。意识到问题后,小明和小红从琐碎的业务需求中腾出了一部分精力,开始梳理总体架构,针对问题准备着手改造。

要作改造,首先你须要有足够的精力和资源。若是你的需求方(业务人员、项目经理、上司等)很强势地一心追求需求进度,以至于你没法挪出额外的精力和资源的话,那么你可能没法作任何事……

  • 用户服务
  • 商品服务
  • 促销服务
  • 订单服务
  • 数据分析服务

各个应用后台只需从这些服务获取所需的数据,从而删去了大量冗余的代码,就剩个轻薄的控制层和前端。这一阶段的架构以下:

这个阶段只是将服务分开了,数据库依然是共用的,因此一些烟囱式系统的缺点仍然存在:

  1. 数据库成为性能瓶颈,而且有单点故障的风险。
  2. 数据管理趋向混乱。即便一开始有良好的模块化设计,随着时间推移,总会有一个服务直接从数据库取另外一个服务的数据的现象。
  3. 数据库表结构可能被多个服务依赖,牵一发而动全身,很难调整。

若是一直保持共用数据库的模式,则整个架构会愈来愈僵化,失去了微服务架构的意义。所以小明和小红一气呵成,把数据库也拆分了。全部持久化层相互隔离,由各个服务本身负责。另外,为了提升系统的实时性,加入了消息队列机制。架构以下:

彻底拆分后各个服务能够采用异构的技术。好比数据分析服务可使用数据仓库做为持久化层,以便于高效地作一些统计计算;商品服务和促销服务访问频率比较大,所以加入了缓存机制等。

还有一种抽象出公共逻辑的方法是把这些公共逻辑作成公共的框架库。这种方法能够减小服务调用的性能损耗。可是这种方法的管理成本很是高昂,很难保证全部应用版本的一致性。

数据库拆分也有一些问题和挑战:好比说跨库级联的需求,经过服务查询数据颗粒度的粗细问题等。可是这些问题能够经过合理的设计来解决。整体来讲,数据库拆分是一个利大于弊的。

微服务架构还有一个技术外的好处,它使整个系统的分工更加明确,责任更加清晰,每一个人专心负责为其余人提供更好的服务。在单体应用的时代,公共的业务功能常常没有明确的归属。最后要么各作各的,每一个人都从新实现了一遍;要么是随机一我的(通常是能力比较强或者比较热心的人)作到他负责的应用里面。在后者的状况下,这我的在负责本身应用以外,还要额外负责给别人提供这些公共的功能——而这个功能原本是无人负责的,仅仅由于他能力较强 / 比较热心,就莫名地背锅(这种状况还被美其名曰能者多劳)。结果最后你们都不肯意提供公共的功能。久而久之,团队里的人渐渐变得各自为政,再也不关心全局的架构设计。

从这个角度上看,使用微服务架构同时也须要组织结构作相应的调整。因此说作微服务改造须要管理者的支持。

改造完成后,小明和小红分清楚各自的锅。两人十分满意,一切就像是麦克斯韦方程组同样漂亮完美。

然而……


“不积跬步,无以致千里”,但愿将来的你能:有梦为马 随处可栖!加油,少年!

关注公众号:「Java 知己」,天天更新Java知识哦,期待你的到来!

  • 发送「Group」,与 10 万程序员一块儿进步。
  • 发送「面试」,领取BATJ面试资料、面试视频攻略。
  • 发送「玩转算法」,领取《玩转算法》系列视频教程。
  • 千万不要发送「1024」...
    每日福利

做者:古霜卡比
原文:http://www.javashuo.com/article/p-gptbslhj-eb.html

相关文章
相关标签/搜索