系统的演变
在未进入微服务之前,让我们来首先了解一下在传统架构下我们的系统是如何搭建的。在这里我用淘宝大神子柳写的《淘宝技术这10年》来进行了解。这不是一本介绍具体技术的书籍,只是让我们来了解一下一个企业架构的演变过程。
单体架构
最初的时候,由于时间比较紧迫,阿里是直接花钱买的一套系统,然后对代码进行修改。采用的是lamp构。
我这种情况下,我们会发现几种问题:
1.客户请求量增多时,比如十万人同时抢购商品。
2.当需要新的功能时,系统扩展性不强。
3.当系统一旦发生错误时,整个系统都要停止。
4.排错性较差
在这种情况下,并发增大时,我们可能多打几个war包来部署到更多的机器上。
分步式应用
中级架构,分布式应用,中间层分布式+数据库分布式,是单体架构的并发扩展,将一个大的系统划分为多个业务模块,业务模块分别部署在不同的服务器上,各个业务模块之间通过接口进行数据交互。数据库也大量采用分布式数据库,如redis、ES、solor等。通过LVS/Nginx代理应用,将用户请求均衡的负载到不同的服务器上。其架构图如下所示:
-
把模块拆分,使用接口通信,降低模块之间的耦合度.
-
把项目拆分成若干个子项目,不同的团队负责不同的子项目.
-
增加功能时只需要再增加一个子项目,调用其他系统的接口就可以。
-
可以灵活的进行分布式部署.
-
提高代码的复用性,比如service层,如果不采用分布式rest服务方式架构就会在手机wap商城,微信商城,pc,android,ios每个端都要写一个service层逻辑,开发量大,难以维护一起升级,这时候就可以采用分布式rest服务方式,公用一个service层。
微服务架构
首先微服务并没有一个官方的定义,想要直接描述微服务比较困难,我们可以通过对比传统WEB应用,来理解什么是微服务。
- 易于开发和维护:一个微服务只会关注一个特定的业务功能,所以它业务清晰、代码量较少。开发和维护单个微服务相对简单。而整个应用是由若干个微服务构建而成的,所以整个应用也会被维持在一个可控状态。
- 单个微服务启动较快:单个微服务代码量较少, 所以启动会比较快。
- 局部修改容易部署:单体应用只要有修改,就得重新部署整个应用,微服务解决了这样的问题。一般来说,对某个微服务进行修改,只需要重新部署这个服务即可。
- 技术栈不受限:在微服务架构中,可以结合项目业务及团队的特点,合理地选择技术栈。例如某些服务可使用关系型数据库MySQL;某些微服务有图形计算的需求,可以使用Neo4j;
- 甚至可根据需要,部分微服务使用Java开发,部分微服务使用Node.js开发。微服务虽然有很多吸引人的地方,但它并不是免费的午餐,使用它是有代价的。使用微服务架构面临的挑战。
- 运维要求较高:更多的服务意味着更多的运维投入。在单体架构中,只需要保证一个应用的正常运行。而在微服务中,需要保证几十甚至几百个服务服务的正常运行与协作,这给运维带来了很大的挑战。
- 分布式固有的复杂性:使用微服务构建的是分布式系统。对于一个分布式系统,系统容错、网络延迟、分布式事务等都会带来巨大的挑战。接口调整成本高:微服务之间通过接口进行通信。如果修改某一个微服务的API,可能所有使用了该接口的微服务都需要做调整。
- 重复劳动:很多服务可能都会使用到相同的功能,而这个功能并没有达到分解为一个微服务的程度,这个时候,可能各个服务都会开发这一功能,从而导致代码重复。尽管可以使用共享库来解决这个问题(例如可以将这个功能封装成公共组件,需要该功能的微服务引用该组件),但共享库在多语言环境下就不一定行得通了。