微服务究竟是“灵丹”还是“毒药”?
点击关注,与你共同成长!
微服务架构是从单体架构演化而来的。所谓单体架构,指的是整个互联网系统所有代码打包在一个程序中,部署在一个集群上,一个单体应用构成整个系统。
而微服务架构则是将这个大的应用里面的一些模块拆分出来,这些模块独立部署在一些相对较小的服务器集群上,应用通过远程调用的方式依赖这些独立部署的模块完成业务处理。这些被独立部署的模块被称为微服务,而这样的应用架构也被称为微服务架构。
应该说,模块化、低耦合一直以来都是软件设计追求的目标,独立部署的微服务使模块之间的依赖关系更加清晰,隔离得也更好,让系统更易于开发、维护,代表了正确的技术方向。但是在实践中,有时使用了微服务系统反而变得更加难以开发、维护,技术团队痛苦不堪,觉得是微服务的“锅”,于是主张放弃微服务,退回到单体架构。
那么,究竟该不该使用微服务?微服务是“灵丹”还是“毒药”?
阿里巴巴大约是国内最早尝试微服务的企业之一。让我们先回顾一下这段历史,看看当年阿里巴巴为什么要使用微服务架构?微服务架构能解决什么问题?用好微服务需要做哪些准备?
阿里巴巴开始尝试微服务架构大约是在2008年。在此之前,一个网站就是一个大应用,一个用Java开发的war包就包含了整个应用。系统更新时,即使只是更新其中极小的一部分,也要重新打包整个war包,发布整个系统。
随着业务的不断发展,这样的单体巨无霸系统遇到了越来越多的困难。
1. 编译、部署困难
一个应用系统一个war包,这个war包的大小可能是几个GB。对于开发工程师来说,开发编译和部署这个war包都是非常困难的,当时我用自己的电脑编译,大约花了半个多小时。工程师在开发的过程中,即使只改了庞大系统中的一行代码,也必须重新打包完整的系统才能做开发测试。对这样的单体系统进行开发部署和测试都是非常困难的,有时甚至一天都写不了几行代码。
2. 代码分支管理困难
因为单体应用非常庞大,所以代码模块也是由多个团队共同维护的,但最后还是要编译成一个单体应用,统一发布。这就要求把各个团队的代码合并在一起,这个过程很容易发生代码冲突。而合并的时候又是应用要发布的时候,发布本就是复杂的过程,再加上代码合并带来的风险,各种情况纠缠在一起,极易出错。所以,在单体应用时代,每一次应用发布都需要搞到深更半夜。
3. 数据库连接耗尽
对于一个巨型的应用而言,因为有大量的用户进行访问,所以必须部署到大规模的服务器集群上,且每个应用都需要与数据库建立连接。大量的应用服务器连接到数据库,会对数据库的连接产生巨大的压力,某些情况下甚至会耗尽数据库的连接。
4. 新增业务困难
因为所有的业务都耦合在一个单一的大系统里,随着时间的推移,这个系统会变得非常复杂,想要维护这样一个系统是非常困难的。很多新入职的工程师不熟悉业务,于是熟悉系统的老员工要加班加点地干活,不熟悉系统的新员工虽然一帮忙就出乱,但也免不了要跟着加班。整个公司热火朝天地干活,但最后还是常常出故障,新的功能迟迟不能上线。
5. 发布困难
单体系统一个war包就包含了所有的代码,新版本发布的时候,即使跟自己开发的代码一点关系都没有,但就因为包含了自己的代码,所以也不得不跟着发布值班,真正更新代码功能的只有几个人,他们汗流浃背地处理代码冲突和修复发布Bug,没有代码更新的同事则陪着聊天、打瞌睡、打游戏。
这些单体架构带来的问题很多工程师都是有切身体会的。所以,在开始重构微服务架构时,虽然也遇到了很多挑战和困难,但是大家为了自身的利益,还是团结一致,成功完成了微服务架构重构。
当时,阿里自己开发了一个微服务框架重构微服务架构,这个微服务框架就是著名的Dubbo。Dubbo借鉴了此前更早的SOA架构方案,即面向服务的体系架构。SOA架构如图27-1所示。
Dubbo在借鉴SOA架构的基础上进行了优化,抛弃了SOA一些不必要的规范约束,使用二进制协议进行服务注册与调用,这使得执行效率和使用的简洁性都得到了极大提升。Dubbo架构如图27-2所示。
Dubbo架构和SOA架构一样,最核心的组件也是三个,分别是服务提供者、服务消费者和服务注册中心。
顾名思义,服务的提供者就是微服务的具体提供者,它通过微服务容器对外提供服务,而服务的消费者就是应用系统或是其他微服务。
具体过程是服务的提供者程序在Dubbo的服务容器中启动,通过服务管理容器向服务注册中心进行注册,声明服务提供者提供的接口参数和规范,并且注册自己所在服务器的IP地址和端口。
服务的消费者如果想要调用某个服务,只需依赖服务提供者的接口进行编程即可。而服务接口通过Dubbo框架的代理访问机制,调用Dubbo的服务框架客户端,服务框架客户端会根据服务接口声明,去注册中心查找对应的服务提供者启动在哪些服务器上,并且将这个服务器列表返回给客户端。客户端根据某种负载均衡策略,选择某一个服务器,通过远程通信模块发送具体的服务调用请求。
服务调用请求通过Dubbo底层的远程通信模块,也就是RPC调用方式,将请求发送到服务的提供者服务器,服务提供者服务器收到请求以后,将该请求发送给服务提供者程序,执行服务,并将服务执行的结果通过远程调用通信模块RPC返回给服务消费者客户端,服务消费者客户端将结果返回给服务调用程序,从而完成远程服务的调用,获得服务处理的结果。
微服务架构的落地实践
微服务和业务的关系是非常紧密的,仅仅用好微服务技术框架是无法成功实施微服务的。成功实施微服务最重要的是做好业务的模块化设计,模块之间要低耦合、高聚合,模块之间的依赖关系要清晰简单。只有实现这样的模块化设计,才能构建出良好的微服务架构。如果系统本身就是一团糟,强行将它们拆分在不同的微服务里,只会使系统变得更加混乱。
以上,便是今天的分享,希望大家喜欢,觉得内容不错的,欢迎「分享」「赞」或者点击「在看」支持,谢谢各位。