背景
随着时代的发展和开发技术的不断迭代更新,以及软件规模的日渐庞大,业务需求愈发复杂,对于系统的性能、高稳定性、高拓展性等提出了新的要求。早期软件多为单体架构,系统之间往往不需要进行交互,但是随着企业应用越来越多,业务需求越发复杂,便要求我们需要使用一种新的软件结构进行革新。在此过程中,业务需求的复杂度扮演着软件架构主要推动力的角色。
互联网时代,自前后端分离引出接口的概念,而后衍生了RESTful 架构风格以及JSON数据格式,而在微服务架构时代,则是将接口定义为不仅仅是前端可以调用,而且各个服务器后端也可以进行对应的调用。
发展历程
单体架构时代
单体架构是相对于微服务架构而言的另一个概念,也是传统的开发模型。单体架构应用直接包含了所有的业务逻辑在内,将各个模块在同一个项目中进行开发,相互之间存在依赖关系以及很强的耦合性。
单体架构并非全是缺点,其也存在相应的优点。具体概括如下
优点:
开发简洁:功能都在单个程序内部进行,便于软件设计以及开发的规划调整。
容易部署:程序单一,不存在复杂的部署环境,部署简单,以java为例,打包后直接放置在 Tomcat 下或者使用 nohup java -jar 命令即可完成部署
便于测试:系统之间只存在有内部调用关系,不存在复杂的服务调用,便于测试。
当然,对应的也有其缺点,比如难以维护,系统升级困难,模块之间耦合严重,无法应付高并发和大数据场景,无法快捷迭代。
只能采用同一种技术,很难用不同的语言或者相同语言不同版本开发不同模块。
系统耦合性太强,其中一个模块有问题,这个系统就会瘫痪,一个模块升级,整个系统就得停机维护。
要上线,必须一起上线,互相等待,无法快速相应市场需求。集群负担大,如果其中某个模块除了问题,只能对其整个系统进行升级,而无法拓展当个对应模块。且开发曲线有可能会在后期大幅度地上升,令开发不易。相较之下「微服务架构」能够解决这个问题。
微服务架构时代
微服务(Microservices)架构出现于分布式技术成熟阶段,其概念于2014年,由Martin Fowler 与 James Lewis 共同提出。主要目的在于解决单体式应用存在的问题,将一个单体应用拆分为多个模块独立,规模更小的微服务,服务之间各自独立但又可以相互调用,从而实现管理开发具体到单个模块。
举例而言,比方我们之前有个投票系统,但是因为用户的安全需求,我们需要在其中加入加密模块,在传统的单体式应用中,我们就需要在其中在增设一个模块,然后开发,之后再去停掉整个服务器做更新维护而后每次对于该加密模块的更新修改都需要停掉服务器。而在微服务架构中,解决方案则不同,我们所需要做的只是增设一个加密模块,然后将其作为微服务模块注册到注册中心,然后将其与主模块进行连接即可,而后的更新维护也只是需要更新单个服务,而无需整个项目停止掉。
图1 微服务注册图示
微服务作为新一代的架构体系,其最重要的特性体现为:
可用性:描述一个系统在一段时间内提供有用资源的能力,从而减少停工时间,而保持其服务的高度可用性。
伸缩性:根据需求动态添加和删除系统中资源的能力,是水平或垂直扩展的专门实现。
集群(负载均衡)可以解决系统的高可用和伸缩特性。
其主要优点体现在:
技术的广泛性
不同服务内部可以使用不同的语言进行编写,比如,我们可以用Java来开发服务A,同时使用 golang 来开发服务B,这种情况下体现了技术的一个广泛性,不必再被实现技术和语言所限制。
服务相互隔离
一个服务模块的瘫痪不会导致另一个服务也瘫痪,因为各个服务是相互独立的系统。这在单体应用程序中是做不到的,单体应用程序中某个模块瘫痪,必将导致整个系统不可用,当然,单体程序也可以在不同机器上部署同样的程序来实现备份,不过,同样存在上面说的资源浪费问题。
方便拓展
庞大的单体服务如果出现性能瓶颈只能对软件整体进行扩展,可能真正影响性能的只是其中一个很小的模块,但开发者却不得不付出升级整个应用的代价。这在微服务架构中得到了改善,我们可以只对那些影响性能的服务做扩展升级,这样对症下药的效果是很好的。
部署简化
在我们对一个巨大的单体项目进行重部署的时候,我们需要对其重新进行编译打包,如果其体量十分大,则整个过程也会产生很大的开销,而微服务架构通过将其拆分为单个小体量的服务模块,精简了打包中的开销,我们只需要对需要重新部署的模块进行重新部署即可,而不需对整个项目进行重编译和打包。
当然,没有任何技术是全优点无缺点的,微服务也有其所存在的缺点,比如说:
1.开发难度更大,系统结构更复杂。
2.运行效率低,网络调用成本很大。
提及微服务架构,离不开的便是服务的注册与发现部分。
服务的注册与发现
微服务之间之所以可以相互调用,并完成整体业务功能,便是因为“服务发现”这一功能的引入。常用的注册中心有 Eureka。微服务通过将自身作为 client 端注册到服务器 server 端获得向外开放的功能权限。最常用的便是将自己注册到注册中心,而后其他服务再通过注册中心去进行对应的服务调用,服务中心将其请求的服务地址接口返回,从而完成服务调用的过程。
服务监控
对于单体应用而言,监控并非一个难题,但是对于庞大的微服务体系而言,监控则需要具体到各个服务,这便要求我们有一套完整的服务监控体系用于对日志进行监控,调用信息进行监控以及资源信息进行监控等。
服务容错及稳定
任何服务都不能保证是百分百稳定安全,因此为了尽可能地降低在实际环境中产生的问题,需要引入“隔离”“熔断”“超时”等机制来保证服务的稳定性和容错性。
常用微服务框架
SpringCloud
SpringCloud基于SpringBoot的一整套实现微服务的框架。他提供了微服务开发所需的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等组件。最重要的是,跟spring boot框架一起使用的话,会让你开发微服务架构的云服务非常好的方便。 SpringBoot旨在简化创建产品级的 Spring 应用和服务,简化了配置文件,使用嵌入式web服务器,含有诸多开箱即用微服务功能。
是Spring 官方推出的针对于微服务的框架。
Dubbo
Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成。Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。主要组件有:Remoting网络通信框架,RPC 远程调用以及Registry服务目录框架。
Tars
TARS 是基于名字服务使用 TARS 协议的高性能 RPC 开发框架,同时配套一体化的服务治理平台,帮助个人或者企业快速的以微服务的方式构建自己稳定可靠的分布式应用。是将腾讯内部使用的微服务架构 TAF(Total Application Framework)多年的实践成果总结而成的开源项目。
当然也有其他的一些微服务框架,这里就不再赘述。
RPC 是什么?
我们在上文中已经提到了 RPC,这一小节就来介绍下什么是 RPC。
RPC (Remote Procedure Call)远程过程调用是一个计算机通信协议。RPC的概念与技术早在1981年由Nelson提出。我们一般的程序调用是本地程序内部的调用,RPC允许我们像调用本地函数一样去调用另一个程序的函数,这中间会涉及网络通信和进程间通信,但你无需知道实现细节,RPC框架为你屏蔽了底层实现。RPC是一种服务器-客户端(Client/Server)模式,经典实现是一个通过发送请求-接受回应进行信息交互的系统。
在 RPC 过程中,首先要解决的是通讯问题,主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。而后我们需要解决寻址问题,也就是如何发现服务,发现我们想要调用的方法?这一部分交由我们的注册中心来进行处理,通过对注册中心的请求,由其返回地址信息。
而后我们在请求端直接对对应地址和方法进行请求调用,该过程就像调用本地方法函数一般。RPC 的出现与微服务息息相关,主要是为了解决单个服务器性能的局限性以及开中的过耦合现象。
(图源:https://www.cs.rutgers.edu/~pxk/417/notes/03-rpc.html)
如果没有RPC协议的封装,我们将面临下面的请求方式:
1.以一种对方能够理解的协议构建请求包
2.将这个请求包设法发送到对方机器的进程上
3.对方机器根据协议理解请求包的内容
4.对方机器处理请求,并以客户机能够理解的协议构造回复包
在此过程中,我们会需要双方核定协议,确定之间交换的数据包格式类型,再回复包等复杂的核对过程。
典型的RPC框架介于传输层和应用中间,可以帮助处理以下问题:
可靠性:革除掉传输层遇到的错误
平台无关性:比如Windows平台是否可以和Linux平台进行通讯?64位得系统是否可以和32位系统进行通讯?
服务发现和路由选择:RPC调用实际上是对某个服务的调用,那么RPC框架需要解决具体调用需要落到哪台机器的哪个进程上。
消息分发:一般一个进程上会提供多种RPC调用,RPC框架需要提供区别不同类型RPC消息并转到相应处理函数上。
两者关系
RPC和微服务框架的关系基本已经明朗,RPC本质上而言也是服务的一种调用方式,这便为微服务提供了支撑,微服务架构中,服务的发现及调用便是离不开RPC 的参与的。通过RPC技术,让我们对于远程方法的调用也像本地方法一样方便轻松。
同时,微服务框架一般都包含了RPC的实现和一系列服务治理能力,是一套软件开发框架。我们可以基于大的微服务框架进行自己的个性化开发以及微服务米快的开发工作,充分的利用微服务框架提供的服务治理能力和RPC能力,所以微服务框架偶尔也会被称作RPC框架,我个人认为只是界限划分的问题,二者的技术是相互依赖共生的关系,所以这样说也并不为错。