本课时我们来学习微服务。
本课时主要包括如下内容。
-
单体系统的困难:编译部署困难、数据库连接耗尽、服务复用困难、新增业务困难。
-
微服务框架:Dubbo 和 Spring Cloud,微服务的架构策略。
-
微服务模式:事件溯源、查询与命令职责分离 CQRS、断路器、超时。
-
微服务最佳实践。
单体系统的困难
在微服务出现之前,互联网应用系统主要是单体系统,也就是说一个网站的整个系统由一个应用构成。如果是 Java,就打包成一个 war 包,一个 war 包包含整个应用系统,系统更新的时候,即使只是更新其中极小的一部分,也要重新打包整个 war 包,发布整个系统。
这样的单体系统面临的挑战主要是什么呢?
编译、部署困难
随着网站的业务不断发展,系统会变得越来越庞大,最后变成一个巨无霸的系统。
在我曾经工作过的公司,单个应用可能有几个 G 大,这对于网站开发工程师来说,开发编译和部署都是非常困难的。在开发的过程中,即使只改了庞大系统中的一行代码,也必须把完整的网站系统重新打包,才能做测试。这会经历漫长的编译过程:出去抽一支烟回来一看,在编译;又去喝了一杯水回来,还在编译;再去趟厕所,回来还在编译。好不容易编译结束了,如果某个配置项错误导致编译失败,又得重来一次,浪费大半天的时间。这样的单体系统对于开发部署和测试都是非常困难的。
代码分支管理困难
因为单体应用非常庞大,所以代码模块也是由多个团队共同维护的。但最后还是要编译成一个单体应用,统一发布。这就要求把各个团队的代码 merge 在一起,这个过程很容易发生代码冲突。而 merge 的时候又是网站要进行发布的时候,发布过程本来就复杂,再加上代码 merge 带来的问题,各种情况纠缠在一起,极易出错。所以,在单体应用时代每一次网站发布都需要搞到深更半夜。
数据库连接耗尽
对于一个巨型的应用而言。因为有大量的用户进行访问,所以必须把应用部署到大规模的服务器集群上。然后每个应用都需要与数据库建立连接,大量的应用服务器连接到数据库,会对数据库的连接产生巨大的压力,某些情况下甚至会耗尽数据库的连接。
新增业务困难
巨无霸单体应用的另一个挑战是新增业务困难。因为所有的业务都耦合在一个单一的大系统里,通常随着时间的发展,这个系统会变得非常的复杂,里面的各种结构也非常乱,想要维护这样一个系统是非常困难和复杂的。很多工程师入职公司半年,都还不能熟悉业务,因为业务太过庞大和复杂,经常会出各种错误。所以就会出现这种现象:熟悉系统的老员们工忙得要死,加班加点干活,不熟悉系统的新员工们一帮忙就出乱,跟着加班加点干活。整个公司热火朝天地干活,但最后还是常常出故障,新的功能迟迟不能上线。
发布困难
因为一个 war 包包含了所有的代码,进行新版本发布的时候,发布代码跟自己的开发的代码一点关系没有,但是因为 war 包包含了自己的代码,为了以防万一,也不得不跟着发布值班。结果真正更新代码功能的只有几个人,而整个部门都要跟着加班。常常出现,到了深夜,有代码更新的同事汗流浃背进行代码冲突处理和修复发布 bug,没有代码更新的同事陪着聊天、打瞌睡、打游戏,这种情况。
微服务架构
解决上述问题