1. 什么是微服务
传统的软件项目大部分都是单体结构,也就是项目中的所有代码都放到同一个应用程序中,一般它们也都运行在同一个进程中,如下图:

单体结构的项目有结构简单、部署简单等优点,但是有如下的缺点:
- 代码之间耦合严重,代码的可维护性低。
- 项目只能采用单一的语言和技术栈,甚至采用的开发包的版本都必须统一。
- 一个模块的崩溃就会导致整个项目的崩溃。
- 我们只能整体进行服务器扩容,无法对其中一个模块进行单独的服务器扩容。
- 当需要更新某一个功能时,我们需要把整个系统重新部署一遍,这会导致新功能的上线流程变长。
微服务架构把项目拆分为多个应用程序,每个应用程序单独构建和部署,如下图:

微服务架构有如下的优点:
- 每个微服务只负责一个特定的业务,业务逻辑清晰、代码简单,对于其他微服务的依赖非常低,因此易于开发和维护。
- 不同的微服务可以用不同的语言和技术栈开发。
- 一个微服务的运行不会影响其他微服务。
- 可以对一个特定的微服务进行单独扩容。
- 当需要更新某一个功能的时候,我们只需要重新部署这个功能所在的微服务即可,不需要重新部署整个系统。
当然,万事万物都不会只有优点没有缺点,微服务架构的缺点如下:
- 在单体架构中,运维人员只需要保证一个应用的正常运行即可,而在微服务架构中,运维人员需要保证多个应用的正常运行,这给运维工作带来了更大的挑战。
- 在单体架构中,各模块之间是进程内调用,数据交互的效率高,而在微服务架构中,各微服务之间要通过网络进行通信,数据交互的效率低。
- 在单体结构中,各模块之间的调用都是进程内进行的,实现容错、事务一致性等比较容易,而在微服务架构中,各微服务之间通过网络通信,实现容错、事务一致性等非常困难。
2. 微服务架构的误区
在应用微服务架构的时候,我们可能会有微服务切分过细和微服务之间互相调用过于复杂这两个主要的误区。
有的技术人员并没有深刻理解微服务的本质,迷信微服务,把一个很简单的项目拆分成了几十个甚至上百个微服务,这么多微服务的管理是非常麻烦的,运维人员苦不堪言。
在设计不好的微服务架构中,微服务之间的调用关系非常复杂。
一个来自客户端的请求甚至要经过七八层的微服务调用,这样糟糕的设计不仅导致系统间耦合验证,而且使得服务器端的处理效率非常低。
架构应该是进化而来的,同样微服务架构也应该是进化而来的。
因此在进行系统架构设计的时候,我们应该认真思考”这个项目真的需要微服务架构吗”。
如果经过思考后,我们仍然决定要采用微服务架构,那么也要再思考”能不能减少微服务的数量”。
第一个版本的项目可以只有几个微服务,随着系统的发展,当我们发现一个微服务中某个功能已经发展到可以独立的程度时,我们再把这个功能拆分为一个微服务。
总之,是否采用微服务及如何采用微服务,应该是仔细思考后的结果,我们不能盲目跟风。
马丁·福勒曾经提过”分布式第一定律”,那就是”避免使用分布式”,由此,本书作者提出”微服务第一定律”,那就是”避免使用微服务,除非有充足的理由”。