【SpringCloud微服务笔记04】分布式中的服务调用

目录

一、服务调用

1.1 什么是服务调用       

1.2 两大主流远程调用技术

1.2.1 RPC协议

1.2.2RESTful

二、如何实现调用的?

2.1 RPC技术

2.2 RESTful技术

2.3二者区别与联系


一、服务调用

1.1 什么是服务调用       

       我们先来看一下什么是远程调用,所谓的远程调用,我们可以用简单的图例进行说明:

        【SpringCloud微服务笔记04】分布式中的服务调用_第1张图片

         不管是微服务还是分布式服务,都有服务提供者和消费者两端,而两者之间是如何实现相互调用的,就是我们要研究的远程调用技术。

        在微服务架构中,目前流行的两种远程调用技术有:基于TCP的RPC协议基于HTTP的RESTFul接口两种。

1.2 两大主流远程调用技术

1.2.1 RPC协议

        对于RPC来说,RPC(Remote Procedure  Call)是一种进程间的通信方式,其主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。为实现该目标,RPC 框架负责屏蔽底层的传输方式(TCP或UDP)、序列化(XML或JSON或二进制)和通信细节,提供一种透明调用机制,让开发人员在使用时不必显式的区分本地调用和远程调用。   

        RPC框架包含4个核心的组件,分别是Client ,Server,Client Stub以及Server Stub,这个Stub大家可以理解为存根

  • 客户端(Client),服务的调用方。
  • 服务端(Server),真正的服务提供者。
  • 客户端存根,存放服务端的地址消息,再将客户端的请求参数打包成网络消息,然后通过网络远程发送给服务方。
  • 服务端存根,接收客户端发送过来的消息,将消息解包,并调用本地的方法

【SpringCloud微服务笔记04】分布式中的服务调用_第2张图片

        基于RPC协议的相关框架有:

  • Dubbo:国内最早开源的 RPC 框架,由阿里巴巴公司开发并于 2011 年末对外开源,仅支持 Java 语言。
  • SpringCloud:国外 Pivotal 公司 2014 年对外开源的 RPC 框架,提供了丰富的生态组件。
  • gRPC:Google 于 2015 年对外开源的跨语言 RPC 框架,支持多种语言。
  • Thrift:最初是由 Facebook 开发的内部系统跨语言的 RPC 框架,2007 年贡献给了 Apache 基金,成为Apache 开源项目之一,支持多种语言。

1.2.2 RESTful

        REST(英文:Representational State Transfer,简称REST,直译过来表现层状态转换)是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。需要注意的是REST并没有一个明确的标准,而更像是一种设计的风格,满足这种设计风格的程序或接口我们称之为RESTful(从单词字面来看就是一个形容词)。所以RESTful API 就是满足REST架构风格的接口。

        资源(Resources):
        所谓"资源",就是网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实在。你可以用一个URI(统一资源定位符)指向它,每种资源对应一个特定的URI。要获取这个资源,访问它的URI就可以,因此URI就成了每一个资源的地址或独一无二的识别符。REST的名称"表现层状态转化"中,省略了主语。“表现层"其实指的是"资源”(Resources)的"表现层"。
        表现层(Representation):
        “资源"是一种信息实体,它可以有多种外在表现形式。我们把"资源"具体呈现出来的形式,叫做它的"表现层”(Representation)。比如,文本可以用txt格式表现,也可以用HTML格式、XML格式、JSON格式表现,甚至可以采用二进制格式;图片可以用JPG格式表现,也可以用PNG格式表现。URI只代表资源的实体,不代表它的形式。严格地说,有些网址最后的".html"后缀名是不必要的,因为这个后缀名表示格式,属于"表现层"范畴,而URI应该只代表"资源"的位置。
        状态转化(State Transfer):
        访问一个网站,就代表了客户端和服务器的一个互动过程。在这个过程中,势必涉及到数据和状态的变化。互联网通信协议HTTP协议,是一个无状态协议。这意味着,所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生"状态转化"(State Transfer)。客户端用到的手段,只能是HTTP协议。具体来说,就是HTTP协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。
        综合上面的解释,我们总结一下什么是RESTful架构:

  • 每一个URI代表一种资源;
  • 客户端和服务器之间,传递这种资源的某种表现层;
  • 客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。
     

二、如何实现调用的?

2.1 RPC技术

        我们以一个图例来向大家展示其通信过程,如图:

                【SpringCloud微服务笔记04】分布式中的服务调用_第3张图片

简单主要分为一下几个步骤:

  1. 由于RPC的远程调用必然会通过网络进行数据传输,为了保证其可靠性,所以RPC一般默认采用TCP来进行传输。
  2. 网络传输的数据必须是二进制数据,但是服务消费者请求的出入参数都是对象,而对象是无法直接在网络中传输的,因此我们需要把对象转换为二进制数据才能在网络上传输,这个过程我们称之为“序列化”
  3. 经过序列化之后,通过网络传输之后我们还需要再将二进制数据转化为服务提供者要进行数据解析和服务调用的对象,这一个过程我们称之为”反序列化“
  4. 服务提供者将解析的数据的返回值再一次通过序列化转化为二进制数据,通过网络传输之后,以反序列化的形式将解析之后的返回值返回给服务的提供者,从而完成一次RPC调用。

2.2 RESTful技术

        REST使用HTTP+URI+XML /JSON 的技术来实现其API要求的架构风格:HTTP协议和URI用于统一接口和定位资源,文本、二进制流、XML、JSON等格式用来作为资源的表述。简单来说,还是以上图为例,就是应用当中暴露一个可以请求的地址,服务消费直接发送请求得到其返回即可。

        Rest架构的主要原则:

  1. 网络上的所有事物都被抽象为资源
  2. 每个资源都有一个唯一的资源标识符
  3. 同一个资源具有多种表现形式(xml,json等)
  4. 对资源的各种操作不会改变资源标识符
  5. 所有的操作都是无状态的

其中表述性状态,是指(在某个瞬间状态的)资源数据的快照,包括资源数据的内容、表述格式(XML、JSON)等信息。

其中无状态通信,是指服务端(响应端)不保存任何与特定HTTP请求相关的资源,应用状态必须由请求方在请求过程中提供。要求在网络通信过程中,任意一个Web请求必须与其他请求隔离,当请求端提出请求时,请求本身包含了响应端为响应这一请求所需的全部信息。

2.3 二者区别与联系

REST和RPC都常用于微服务架构中。

  1.   HTTP相对更规范,更标准,更通用,无论哪种语言都支持http协议。如果你是对外开放API,例如开放平台,外部的编程语言多种多样,你无法拒绝对每种语言的支持,现在开源中间件,基本最先支持的几个协议都包含RESTful。
  2.  RPC 框架作为架构微服务化的基础组件,它能大大降低架构微服务化的成本,提高调用方与服务提供方的研发效率,屏蔽跨进程调用函数(服务)的各类复杂细节。让调用方感觉就像调用本地函数一样调用远端函数、让服务提供方感觉就像实现一个本地函数一样来实现服务
比较项 RESTFul RPC
通讯协议 3 一般使用TCP
性能 略低 较高
灵活度
应用 微服务架构 SOA架构

    

你可能感兴趣的:(微服务,spring,cloud,rpc)