作者:沈剑,曾任百度高级工程师,58高级架构师,C2C技术部负责人,58技术学院优秀讲师。目前,他主要负责58到家后端的技术管理工作,比如说架构部、后端平台部、基础服务部、DBA,还有测试平台等相关偏后台的技术工作。

来自:架构师之路

近期参加一些业界的技术大会,“微服务架构”的话题非常之火,也在一些场合聊过服务化架构实践,最近几期文章期望用通俗易懂的语言聊聊了个人对服务化以及微服务架构的理解,希望能给大伙一些启示。如果有遗漏,也欢迎大家补充。

一、互联网高可用架构,为什么要服务化?

【服务化之前高可用架构】

在服务化之前,互联网的高可用架构大致是这样一个架构:


(1)用户端是浏览器browser,APP客户端

(2)后端入口是高可用的nginx集群,用于做反向代理

(3)中间核心是高可用的web-server集群,研发工程师主要编码工作就是在这一层

(4)后端存储是高可用的db集群,数据存储在这一层


更典型的,web-server层是通过DAO/ORM等技术来访问数据库的。

可以看到,最初都是没有服务层的,此时架构会碰到一些什么痛点呢?

【架构痛点一:代码到处拷贝】

举一个最常见的业务的例子->用户数据的访问,绝大部分公司都有一个数据库存储用户数据,各个业务都有访问用户数据的需求:


在有用户服务之前,各个业务线都是自己通过DAO写SQL访问user库来存取用户数据,这无形中就导致了代码的拷贝。

【架构痛点二:复杂性扩散】

随着并发量的越来越高,用户数据的访问数据库成了瓶颈,需要加入缓存来降低数据库的读压力,于是架构中引入了缓存,由于没有统一的服务层,各个业务线都需要关注缓存的引入导致的复杂性:


对于用户数据的写请求,所有业务线都要升级代码:

(1)先淘汰cache

(2)再写数据

对于用户数据的读请求,所有业务线也都要升级代码:

(1)先读cache,命中则返回

(2)没命中则读数据库

(3)再把数据放入cache

这个复杂性是典型的“业务无关”的复杂性,业务方需要被迫升级。

随着数据量的越来越大,数据库需要进行水平拆分,于是架构中又引入了分库分表,由于没有统一的服务层,各个业务线都需要关注分库分表的引入导致的复杂性:


这个复杂性也是典型的“业务无关”的复杂性,业务方需要被迫升级。

包括bug的修改,发现一个bug,多个地方都需要修改。

【架构痛点三:库的复用与耦合】

服务化并不是唯一的解决上述两痛点的方法,抽象出统一的“库”是最先容易想到的解决:

(1)代码拷贝

(2)复杂性扩散

的方法。抽象出一个user.so,负责整个用户数据的存取,从而避免代码的拷贝。至于复杂性,也只有user.so这一个地方需要关注了。

解决了旧的问题,会引入新的问题,库的版本维护与业务线之间代码的耦合:

业务线A将user.so由版本1升级至版本2,如果不兼容业务线B的代码,会导致B业务出现问题;

业务线A如果通知了业务线B升级,则是的业务线B会无故做一些“自身业务无关”的升级,非常郁闷。当然,如果各个业务线都是拷贝了一份代码则不存在这个问题。

【架构痛点四:SQL质量得不到保障,业务相互影响】

业务线通过DAO访问数据库:


本质上SQL语句还是各个业务线拼装的,资深的工程师写出高质量的SQL没啥问题,经验没有这么丰富的工程师可能会写出一些低效的SQL,假如业务线A写了一个全表扫描的SQL,导致数据库的CPU100%,影响的不只是一个业务线,而是所有的业务线都会受影响。

【架构痛点五:疯狂的DB耦合】

业务线不至访问user数据,还会结合自己的业务访问自己的数据:


典型的,通过join数据表来实现各自业务线的一些业务逻辑。

这样的话,业务线A的table-user与table-A耦合在了一起,业务线B的table-user与table-B耦合在了一起,业务线C的table-user与table-C耦合在了一起,结果就是:table-user,table-A,table-B,table-C都耦合在了一起。

随着数据量的越来越大,业务线ABC的数据库是无法垂直拆分开的,必须使用一个大库(疯了,一个大库300多个业务表 =_=)。

【架构痛点六:…

二、服务化解决什么问题?

为了解决上面的诸多问题,互联网高可用分层架构演进的过程中,引入了“服务层”。


以上文中的用户业务为例,引入了user-service,对业务线响应所用用户数据的存取。引入服务层有什么好处,解决什么问题呢?

【好处一:调用方爽】

有服务层之前:业务方访问用户数据,需要通过DAO拼装SQL访问

有服务层之后:业务方通过RPC访问用户数据,就像调用一个本地函数一样,非常之爽

User = UserService::GetUserById(uid);

传入一个uid,得到一个User实体,就像调用本地函数一样,不需要关心序列化,网络传输,后端执行,网络传输,范序列化等复杂性。

【好处二:复用性,防止代码拷贝】

这个不展开叙述,所有user数据的存取,都通过user-service来进行,代码只此一份,不存在拷贝。

升级一处升级,bug修改一处修改。

【好处三:专注性,屏蔽底层复杂度】


在没有服务层之前,所有业务线都需要关注缓存、分库分表这些细节。


在有了服务层之后,只有服务层需要专注关注底层的复杂性了,向上游屏蔽了细节。

【好处四:SQL质量得到保障】


原来是业务向上游直接拼接SQL访问数据库。


有了服务层之后,所有的SQL都是服务层提供的,业务线不能再为所欲为了。底层服务对于稳定性的要求更好的话,可以由更资深的工程师维护,而不是像原来SQL难以收口,难以控制。

【好处五:数据库解耦】


原来各个业务的数据库都混在一个大库里,相互join,难以拆分。


服务化之后,底层的数据库被隔离开了,可以很方便的拆分出来,进行扩容。

【好处六:提供有限接口,无限性能】

在服务化之前,各业务线上游想怎么操纵数据库都行,遇到了性能瓶颈,各业务线容易扯皮,相互推诿。

服务化之后,服务只提供有限的通用接口,理论上服务集群能够提供无限性能,性能出现瓶颈,服务层一处集中优化。

三,写在最后

坚持的终极目标是无意识的行为,是与生活的无缝融合!真正坚持到最后的人不是靠激情,而是恰到好处的喜欢和投入!

如果想看沈剑的介绍和成长经历,请在公众号后台回复:沈剑。

推荐阅读:

技术:分布式唯一ID极简教程

职场:程序员职业规划

分享:2T架构师学习资料干货分享

觉得有帮助?请转发给更多人!


架构师小秘圈,聚集10万架构师的小圈子!不定期分享技术干货,行业秘闻!汇集各类奇妙好玩的话题和流行动向!长按左侧图片,扫码加入架构师微信群!

互联网架构为什么要做服务化相关推荐

  1. 互联网架构为什么要做服务化(Service)

    一.互联网高可用架构,为什么要服务化? [服务化之前高可用架构] 在服务化之前,互联网的高可用架构大致是这样一个架构: (1)用户端是浏览器browser,APP客户端 (2)后端入口是高可用的ngi ...

  2. 互联网架构为什么要做服务化?

    一.互联网高可用架构,为什么要服务化? [服务化之前高可用架构] 在服务化之前,互联网的高可用架构大致是这样一个架构: (1)用户端是浏览器browser,APP客户端 (2)后端入口是高可用的ngi ...

  3. 架构 - 互联网架构服务化

    本人目前在单位的服务组,纯后台开发. 与外面同行交流的时候,很多人对于服务(服务组)没有概念,包括公司内部绝大部分人对于服务也没有概念. 甚至都不知道我所在的服务组是做什么的...╮(╯▽╰)╭ 之前 ...

  4. 如何站在双11的肩膀上 详解阿里云企业级互联网架构

    摘要:2015天猫双11全球狂欢节以912.17亿元的答卷完美收官.双11当天14万笔/秒的交易创建峰值和8.6万笔/秒的支付峰值双双刷新了世界纪录,相比首届双11,订单创建峰值增长了350倍,支付峰 ...

  5. 遵循互联网架构“八荣八耻”,解析EWS高质量架构6个维度的20个能力

    本文主要从最初的聚石塔容器服务EWS开始讲起,进而分享了EWS 高质量架构产品化的C2B方案和全渠道方案,着重说明了EWS的技术实现,包括EWS的总体架构以及EWS的功能实现等. 直播视频:点此进入 ...

  6. 互联网架构,究竟为啥要做服务化?

    "微服务架构"的话题非常之火,很多朋友都在小窗我,说怎么做服务化?解答"怎么做"之前,先得了解"为什么做". 画外音:做技术千万不能是这种思 ...

  7. 在传统企业做互联网架构是什么感受?

    作者 | 王晔倞 责编 | 郭   芮 最近与某位搞风险投资的朋友聊起中美贸易战,他对未来局势的走向很是悲观,而我却不屑一顾. 在他眼里,当下的美国已将中国列为竞争对手,曾今的大哥摆出了一副 &quo ...

  8. 给研发做的互联网架构设计理念培训

    给研发做的互联网架构设计理念培训,分享给大家 猛点这里下载 高并发高可用的可伸缩的架构设计的原则 空间换时间 数据与计算 多维度可用 伸缩 优化资源利用

  9. 朱晔的互联网架构实践心得S1E2:屡试不爽的架构三马车

    朱晔的互联网架构实践心得S1E2:屡试不爽的架构三马车 [下载本文PDF进行阅读] 这里所说的三架马车是指微服务.消息队列和定时任务.如下图所示,这里是一个三驾马车共同驱动的一个立体的互联网项目的架构 ...

最新文章

  1. 【bzoj3924】[Zjoi2015]幻想乡战略游戏 动态点分治
  2. Flink Window基本概念与实现原理
  3. Effective java笔记3--类和接口1
  4. 神经网络中的反向传播算法
  5. java SWT Browser实现浏览器功能并运行JavaScript代码
  6. 机器人峰会王伟_【“峰”景独好】大美中国探春中国机器人峰会举办地——浙江宁波余姚...
  7. STM32 F4 General-purpose Timers for Periodic Interrupts
  8. 禁止QQ自动转义表情字符
  9. Vin码识别即车架号识别
  10. 福建等保测评五流程,收藏收藏
  11. 鹿鼎记 · 韦小宝,丽春院、天地会、入皇宫等五个场景的恶搞版多线程锁学习!
  12. 手写Vue个人组件库——fl-Badge
  13. 【Java笔记+踩坑】SpringBoot基础3——开发。热部署+配置高级+整合NoSQL/缓存/任务/邮件/监控
  14. 文智背后的奥秘系列篇——情感分类
  15. 涨知识了,原来微信可以一键找到对方位置
  16. 2022江苏民丰农村商业银行社会招聘测试题及答案
  17. 黑马程序员视频教程学习mybatis框架常用注释SQL语句学习笔记?
  18. HTML+CSS基础文字和字体
  19. S5PV210 GPIO 操作
  20. 【基础算法】穷举算法 (暴力枚举) C++实现

热门文章

  1. python生成word目录_Word&Python-创建目录
  2. 2018 ICPC 徐州网络赛 D. Easy Math(思维,反演,杜教筛)
  3. 【第一道计算几何题】 UVA11178 Morley‘s Theorem (二维几何,旋转直线求求交点)
  4. python数学计算例子_Python OpenCV实例:直方图计算(数学公式简单实现)
  5. oracle 创建空文件系统,六分钟学会创建Oracle表空间的实现步骤
  6. debian安装oracle jdk
  7. web 监听器 过滤器等组件
  8. MySql JDBC
  9. 用ElasticSearch搭建自己的搜索和分析引擎
  10. 树链剖分 + 后缀数组 - E. Misha and LCP on Tree