什么是微服务
本文内容
1. 单体应用
在讲微服务之前,肯定得先从单体应用说起,因为微服务架构的出现旨在优化单体应用的 “痛”,下面就来看看这个单体应用的 “痛” 到底是什么。
我相信大家都是从写单体应用过来的,在写单体应用的时候,各个功能模块,所有的服务都写到一个应用里。如果是一个 web 项目,只需要最后将其打一个 WAR 包,丢到 Tomcat 中,然后就可以对外提供服务了。
使用单体架构开发非常 简单快捷,对于一个简单的系统,也许你一个人就能完成。开发完成后,也 容易部署上线。
但是,前面开发有多爽,后面迭代升级就有多痛。随着业务规模的扩大,团队人员的扩张,单体应用的 “痛” 就开始了:
- 部署效率低,项目庞大、依赖的资源增多时,一次编译打包、部署测试可能需要消耗十来分钟;
- 团队协作复杂,一个大项目十几二十个人一起维护,这会使代码的分支管理变得非常复杂;
- 测试、扩展升级难度大大增加,测试一个功能点可能会牵扯到其他功能的代码,而且在扩展升级时,需要考虑到整个系统,牵一发而动全身;
- 系统高可用性差,所有的功能都部署到一个 WAR 包,运行在一个 Tomcat 进程中,一旦这个 JVM 进程出现崩溃,将导致所有服务都不可用。
2. 什么是服务化?
服务化,通俗来讲就是把传统的单机应用中的 本地方法调用,改造成 RPC 接口调用。
RPC(Remote Procedure Call)远程过程调用,可以让远程接口(其他机器/应用提供的接口)的调和本地接口的调用一样简单。
就拿微博系统来说,其中包含了内容模块、消息模块和用户模块,消息模块依赖内容模块,它们又都依赖用户模块。在单体应用中,这是三个耦合的功能模块,一旦某个功能出现 bug,将导致整个应用不可用。
所以,我们可以将 用户模块拆分出来,部署成一个独立的服务,以 RPC 接口的形式对外提供服务。这样内容模块和消息模块就可以调用用户模块提供出来的 RPC 接口,而代替掉本地调用。这样用户模块就可以独立开发、测试、上线和运维了,从而降低了耦合度。
接着,又可以进一步将内容模块和消息模块拆分开来,成为两个独立的模块,进行开发维护等工作,同样服务之间通过 RPC 来调用。
通过服务化,将功能模块部署成单独的服务,以 RPC 接口的形式供外部调用。这样就解决了单体应用膨胀、团队开发耦合度高、测试、升级等问题。
3. 什么是微服务?
前面提到的服务化,只是微服务的雏形,到后来容器化技术的成熟(如比 Docker、K8s),以及 DevOps(开发运维)的火爆,服务化开始逐渐演变成现在的微服务。
那么微服务和服务化有什么不同呢?主要有如下几点:
- 服务拆分粒度更细:微服务可以看作是更小的服务化,只要一个小模块依赖的资源与其他模块无关,就可以拆分为一个个小的微服务;
- 以最小的规模集中管理:每个微服务都独立打包部署成一个个的容器实例,互不影响;
- 服务独立开发维护:每个微服务可由一个小团队或个人来开发、测试、发布和运维,负责整个服务的生命周期;
- 服务治理要求:在拆分成微服务后,服务的数量变多,需要有统一的服务治理平台,来对各个服务进行管理。
再拿微博系统来说,可以对内容模块再进行拆分,分为 feed 模块(就是一条条的微博)、评论模块、个人页模块等等,这些都是一个个独立细小的功能点,都可以拆分成一个个小的微服务。这样,当某个模块需要修改、测试或重新部署时,只需要操作它自身即可,其他的都保持不变、不会受到影响。
简单了解一下容器吧
容器可以提供标准化的环境,包含了应用程序文件、运行时的环境、依赖的库等等,能使得开发环境和测试、部署环境无差异,从而避免了因运行环境不同而导致的运行差异。
经典问题:开发人员开发时运行的好好的,到了测试、运维人员那里,因为运行环境不同就跑不起来了。
4. 微服务有什么问题?
上面都谈的是微服务的好处,任何东西有两面性,那么微服务会带来哪些问题呢?
在把一个大系统拆分成多个微小的模块后,那么如何对这些微服务进行统一管理呢?其中的问题也就随之而出,比如:
- 微服务如何被其他服务发现?涉及 服务注册与发现;
- 微服务如何被其他服务调用?涉及 远程调用;
- 如何保证这么多微服务都是正常健康的?涉及 服务监控;
- 微服务难免会出现故障,此时整个系统应该怎么办?涉及 服务熔断、降级、限流等;
- 微服务在多实例部署时,怎么将请求均匀分配到各实例上?涉及 负载均衡;
- ......
但微服务架构的优势还是很明显的,因此,我们解决好上面的问题,也就能得心应手的使用微服务了。这些问题的解决方法都会在后续的文章中讲解。
5. 总结
从单体引用的痛点,到服务化,再到微服务的兴起,旨在解决复杂臃肿的单体应用在开发、测试、部署、运维、升级时候的不便,以及提高整个系统的可用性。
通过微服务架构,能够将一个庞大的系统拆分成一个个微小的独立模块,进而有如下诸多优点:
- 开发、测试、部署和运维简单,提高了效率;
- 低耦合,降低系统复杂度;
- 能使用不同的语言开发各个微服务;
- 修改、升级更容易。
而微服务也会带来许多问题,后面的将会讲解如何解决这些问题,从而构建处一个高并发、高性能、高可用的系统。