4006-998-758
新闻动态

互联网架构,究竟为啥要做微服务?

2021-10-26
作者沈剑——快狗打车CTO,到家集团技术委员会主席,互联网架构技术专家,“架构师之路”作者。曾任百度高级工程师,58同城技术委员会主席,高级架构师,技术学院优秀讲师。


“微服务架构”的话题非常之火,很多朋友都在小窗我,说怎么做微服务?解答“怎么做”之前,先得了解“为什么做”。


画外音:做技术千万不能是这种思路,“别人都在做,所以我们也要搞”。


并不是所有的业务都适合“微服务”,互联网高可用架构,到底为什么要微服务化?


微服务化之前,高可用架构是什么样的?


在微服务化之前,互联网的典型高可用架构如下:


互联网架构,究竟为啥要做微服务?(图1)

(1)客户端,APP,H5,小程序,PC浏览器;

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

(3)站点应用,高可用的web-server集群;

(4)后端存储,高可用db集群;


互联网架构,究竟为啥要做微服务?(图2)


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

 

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


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

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


互联网架构,究竟为啥要做微服务?(图3)


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

 

架构痛点二:复杂性扩散

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


互联网架构,究竟为啥要做微服务?(图4)

对于写请求,所有业务线都要升级代码:

(1)先淘汰cache;

(2)再写db;


对于读请求,所有业务线也都要升级代码:

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

(2)没命中则读db;

(3)再把数据放入cache;


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

 

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


互联网架构,究竟为啥要做微服务?(图5)


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


典型的耦合,还包括bug的修改,发现一个bug,多个地方都需要修改。

 

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

服务化并不是唯一的解决上述两痛点的方法,抽象出统一的“库”是最先容易想到的解决的方法,即(1)代码拷贝、(2)复杂性扩散。


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

 

解决了旧的问题,会引入新的问题,库的版本维护会导致业务线之间的耦合。


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


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

画外音:有时候拷贝代码也是有好处的。

 

架构痛点四:SQL质量无法保障,业务相互影响


互联网架构,究竟为啥要做微服务?(图6)


业务线通过DAO访问数据库,本质上SQL语句还是各个业务线拼装的,资深工程师写出高质量的SQL,经验没有这么丰富的工程师可能会写出一些低效的SQL。


假如业务线A写了一个全表扫描的SQL,导致数据库的CPU达到100%,那么影响的不只是一个业务线,而是所有的业务线。

画外音:临时工程序员要背锅了。

 

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


互联网架构,究竟为啥要做微服务?(图7)


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

画外音:user_biz表,也是用uid做主键。


典型的,通过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多个业务表 =_=)。

 

架构痛点六:…

 

微服务化后,高可用架构如何?

互联网高可用分层架构演进的过程中,引入了“服务层”。


互联网架构,究竟为啥要做微服务?(图8)


以上文中的用户业务为例,引入了高可用user-service,对业务线响应所用用户数据的存取。


引入服务层有什么好处,到底解决什么问题呢?


好处一:调用方爽

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


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

User = UserService::GetUserById(uid);

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

 

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

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


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

 

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


互联网架构,究竟为啥要做微服务?(图9)


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

 

互联网架构,究竟为啥要做微服务?(图10)


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

 

好处四:SQL质量得到保障


互联网架构,究竟为啥要做微服务?(图11)


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

 

互联网架构,究竟为啥要做微服务?(图12)


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

 

好处五:数据库解耦


互联网架构,究竟为啥要做微服务?(图13)


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


互联网架构,究竟为啥要做微服务?(图14)


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

 

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

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


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

 

好处七:…


服务化不能解决所有问题,如果没有碰到这些问题,架构未必需要微服务。


一切脱离业务的架构设计,都是耍流氓。


希望大家有收获。




互联网架构,究竟为啥要做微服务?(图15)


随着业务越来越复杂,数据量越来越大,并发量越来越高,微服务架构是架构演进中的必经之路。云原生架构下的微服务架构,如何保证扩展性与可用性,如何做好容器化,如何做好NG网关,如何做好服务治理,如何做好全链路压测,是架构人当前面临的普遍问题。

本文,沈剑老师通过摆出目前高可用架构的六大痛点,阐释了微服务架构的必要性,并通过合理分析明确微服务在架构应用中的七大好处,让大家清楚微服务的意义。那么,“究竟要怎么做微服务?”这个问题,沈剑老师将在11月19-20日上海举办的“K+全球软件研发行业创新峰会”中,以“微服务架构的工程实践”专题出品人身份,携手三位资深架构专家,分别为转转架构部负责人杜云杰;中邮消费金融有限公司科技发展部副总经理刘锋;Nginx技术专家/OpenResty开源项目贡献者罗剑锋,为大家带来不同行业的微服务最佳实践案例。

了解更多大会详情,请点击下方阅读原文

返回列表