这篇博客主要是从web技术发展来探索微服务的起源
要想了解微服务是什么得从web框架出来之后开始讲起,大部分可能不知道微服务,一定知道写web服务的框架,懂Java的可以用Spring Boot一把梭,懂Python的Flask、Django、Tornado也写的飞起
微服务也就是在这些框架出来后才慢慢出现的,首先我们就不谈MVC模式的兴起(主要就是把前端和后端解耦合),我们谈谈在MVC后要面临的问题
第一个就是接口越来越多,用户也越来越多,面临的第一个问题就是某些接口请求非常频繁,面临第二个问题就是某些接口我想升级怎么办,我们知道使用上面那些框架你要是想修改接口得把代码重新发布一下,然而线上就得暂停服务一会等服务升级
针对上面的问题,就开启了微服务的热潮,解决方法和MVC一样,我们把后端和后端进行解耦合,一个后端系统专门负责认证,一个后端系统专门负责订单,两者之间使用token来确认同一个用户,登录的请求接口不是很频繁,就用2台机子,订单非常频繁双十一的时候还会爆炸,就用10台机子,实现上非常简单,就是把在每台机子上面启动单独后端程序,再使用nginx作为负载均衡这样流量就均匀的打到每台机子上面去了,这样不管你是用Java还是Python都OK
这种解决方案能扛起很高的并发,但是还是有个问题,升级起来非常麻烦,要是想升级系统,得把每台机子的后端程序单独升级,管理起来非常麻烦
然后大家开始研究,大家把接口抽象起来,其实作为用户来说,他只是想调这个接口,能不能使用一个中间层把用户想调的接口和后端真正的提供的服务连接起来,这个就是中间件兴起的源头
让我们想想中间件的职责是什么,其实想想也很简单就是一个后端接口管理系统,能够实现注册接口的功能,并且打通接口和后端的接口,当然说起来简单,但是要实现一个高可用的中间件也是不容易的,具体可以去看看Spring Cloud、Dubbo这些中间件框架
我们想想这些中间件框架优缺点,优点也很明确,就是性能非常强,每个小模块只负责自己的接口,当业务量大起来的时候能迅速启动上万个进程来分流大流量,但是缺点也有就是只限定了自己的编程语言(Spring Cloud和Dobbo这些只能用Java写),而且随着接口越来越多,管理也越来越麻烦,调用链也越来越长了,有的时候你想加一个接口得涉及很多道调用链,先去请求用户信息,再去查询用户银行卡信息,再去查询商品信息,虽然分模块很爽,但是有些东西越分越累,模块越来越多,实现功能也越来越散
模块越来越多带来的一个副作用是测试调试越来越难了,而且随着摩尔定律,我们现在的内存越来越大了、CPU也越来越多了,以前写微服务为的就是省点内存,现在大家发现其实他也没有那么省内存,为了保证服务高可用,我们得用上百台机器来搭一个集群,但是大部分时间,业务量没有那么大,其实大部分时间那么大内存都放在那里浪费了,而且当业务量万一突然起来了,然而固定集群却没法承受这么大流量
后面随着Docker、K8S的兴起,大家慢慢的发现容器化能够解决上面的问题,当业务量小的时候启动少量容器,业务量大的时候启动多一点容器,而且可以实现动态扩容,所以这时候提出了一个Service Mesh模式
什么是Service Mesh,其实就是我们前面提到的nginx的负载均衡方案类似,就是使用一个nginx来把请求打在后端上面,但是不同点在于,原来nginx是写死在配置里面的,现在k8s里面的nginx(目前主流的方案是Istio)把接过来的请求打到容器网络上面去,而且当流量大的时候会自动新建新的实例来负载新的请求
兜兜转转我们又回到了最初的样子,你也不用学习什么后端中间件使用,你只要会写一个提供web接口的服务,打包成个容器,在k8s配置一下,轻轻松松就能扛着上千万并发,扛不住加实例就够了
现在我们来谈谈Service Mesh的原理,其实很简单,就是蚁群的思想,每一个容器都是一只小蚂蚁,功能齐全啥都能干,一只蚂蚁搬不动一座大山,但是上亿只蚂蚁可以搬的起,Service Mesh的思想有点像大数据分而治之的理论,当你的容器能服务1千人,那你1万个容器就能服务1亿个人,所以对于开发者来说,你只需要写好一个能服务1千个人的小web,你不需要去考虑当你要服务1万个人的时候,代码需要怎么改动,对于开发者来说,测试和开发都变得异常轻松,自己也不用去写原来的Dubbo那种大体量代码,你所有的接口都在一个项目中,测试开发都变得异常轻松,而且你也不用思考怎么使用Java调用Python的机器学习框架等等,你可以用Python写,用Go写,甚至可以用C来写,容器不在拘束于语言,你只要能对外提供服务就好了
总之在K8S容器化兴起之后,我们也不用再怎么思考如何解耦合代码,套上各种中间件把我们各个接口都打散,实现一套高并发系统,我们只需要写一个网站,能服务上千的用户,当我们业务量大起来的时候交给K8S,让它帮我们启动上万个相同网站,把流量给消化掉,所以在一定的程度上,在现在技术发展下,高并发的门槛越来越低,原来一个高并发专家得学会好多框架,dubbo各种组件,现在随便叫来一个小白随便把它从网上复制的代码拷拷,搭起来一个小网站,放到K8S上面,马上就可以服务上千万甚至上亿用户
所以说技术发展真的是快啊,记得以前一个架构师的道路是慢慢从学习各种nginx负载均衡Redis集群搭建,搭建起一套复杂的系统,你得去学习各种组件使用,现在呢,一个小白,网上拷拷代码,使用上内存作为缓存,使用MySQL当数据库,并发也就上个千,然后数据库配置一下把内存换成redis,MySQL换成Kudu,放进K8S里面并发就能上千万,高并发问题就解决了,原来一个百万年薪才能做的高并发技术专家在新的技术降纬打击下一个月薪1万的菜鸟也能搞定了
总而言之,高并发随着技术发展会越来越简单,微服务的提出有人说就是干掉架构师,所以有时候也会想,随着技术的发展,是不是不会有工程师这个职位了,的确技术在不断发展,但是只要抱着一个不断学习的心也就不怕了,技术不断推成出新,但是本质是不变的,所以也不用害怕。
资料 #
https://philcalcado.com/2017/08/03/pattern_service_mesh.html