RPC和REST

一、背景

之前leader问我feign支持的是http的rest调用还是tcp/ip的rpc调用,这个问题其实我到现在都不是很清楚,只通过印象记得feign是基于http协议实现的,当时就回答了http,leader说feign确实是一个基于http远程调用服务框架,但是它也支持rpc,其实只要是像调本地接口一样调用远程接口的方式,就是rpc.要记住他们的区别但对于feign也不用把它们分的太死,不过要记住它是基于http协议实现的。
其实这段话当时我挺懵的,主要还是自己对于rpc和rest完全分不清,甚至觉得它们就是一样东西,那么现在就来分别学习一下以及它们之间的区别。

二、RPC调用

  • RPC是远程调用过程的简写,是一个协议,处于网络通信协议的第五层:会话层,其下就是TCP/IP协议,在建立在其基础上的通信会话协议。RPC定义了交互的模式,而应用程序使用这些模式,来访问其他服务器的方法,并不需要关系具体的网络上的细节。

2.1、RPC基础知识

1.RPC模式

①RPC采用C/S模式,客户端发送请求,服务端响应。

  • 服务器-客户机,即Client-Server(C/S)结构。C/S结构通常采取两层结构。服务器负责数据的管理,客户端负责完成与用户的交互任务。

②基于底层的协议,比如TCP/IP模式。
在这里插入图片描述

  • RPC 不等同于 RPC 框架,RPC 是一个概念,是一个分布式通信方式
  • 基于 RPC 产生了很多 RPC 框架:Dubbo、Netty、gRPC、BRPC、Thrift、JSON-RPC 等等
  • RPC 框架对 RPC 进行了功能丰富,包括:服务注册、服务发现、服务治理、服务监控、服务负载均衡等功能
  • 两台机器之间进行交互,那么肯定离不开网络通信协议,TCP / IP 也就成了绕不开的点,所以先辈们最初想到的方法就是通过 TCP / IP 来实现远程方法的调用

2.设计目的

①通过固定的协议,调用非本机的方法

②实现不同程序语言之间的通信

不需要了解底层协议,像本地方法一样调。它完全封装了网络传输,以及其他细节。

2.2、RPC过程详解

在这里插入图片描述

  • 从RPC的角度看,应该有服务的提供方,即生产者;还有服务的调用方,即消费者
  • 对消费者来时,在RPC调用过程中,使用第1步、第2步、第3步、第4步是透明的,其他的都是使用RPC框架去封装这些事情。当应用开始调用RPC的方式时,就会去容器中去取Bean对象,所以我们应该首先注册Bean对象到容器中,我们通过Java的动态代理,将代理过程封装到代理对象中,代理对象实现接口,创建实例到容器中。相应的,在调用远程对象的对象方法时,就会调用动态代理中的方法,这就是代理层的作用。
  • 代理对象在获取到请求方法、接口和参数时,就会用序列化层,将这些信息封装成一个请求报文,再让通信层向服务端传送报文的内容,然后就到了生产者这块。
  • 相应的服务必须有个监听器,来监听来自其他服务的请求,一般都会用容器做消息的监听,就会调用对应的Bean对象的方法,去处理响应的请求。当然,RPC框架不会让容器中的每一个框架都会被调用,所以只有注册了的Bean才会被RPC的请求调用到。然后,通过请求中的类、方法、参数,反射调用对应的Bean,拿到结果之后,通过序列化层,封装好结果报文,服务端的通信层将报文反馈给调用方,调用方解析到返回值,动态代理类返回结果,调用结束。
  • 这样,一个完整的RPC调用反馈链条就完成了。

2.2.1、消费者设计

在这里插入图片描述

①代理层:

  • 消费者将对应的接口,通过RPC框架的代理来生成一个对象到Spring容器中。代理层将代理接口生成该接口的对象,该对象处理调用时传过来的对象、方法、参数,通过序列化层封装好,调用网络层。

②序列化层:

  • 将请求的参数序列化成报文;将返回的报文反序列化成对象;

③网络层:

  • 将报文与服务端通信;接收返回结果。

2.2.2、生产者设计

在这里插入图片描述
①代理层:

一个应用提供服务,必须有一个网络监听的模块,这个模块大多有开源的容器来处理网络上的监听;服务需要注册,只有注册了的服务才可以被调用;注册的服务需要被我们发射调用到,来进行相应的处理。

②序列化层:

就是相应的做请求的反序列化和结果的序列化。

③网络层:

接收客户端报文;将序列化的结果返回给客户端。

2.3、RPC模式总结

2.3.1、模块设计

在这里插入图片描述

1.Proxy代理层

用于对象的代理;对象的反射调用;RPC流程的控制。

2.Serialize序列化层

将请求序列化和结果反序列化。

3.Invoke网络模块

主要用于网络通信的相关处理。

4.Container容器组件

这层主要用于代理层监听网络请求。

  • 组成要素

①三要素:动态代理、序列化与反序列化协议、网络通信协议

②网络通信协议可以是 TCP、UDP,也可以是 HTTP 1.x、HTTP 2,甚至有能力可以是自定义协议

2.3.2、RPC 的演进过程
在这里插入图片描述

三、REST调用

REST代表表现层状态转移(representational state transfer),由Roy Fielding在他的论文中提出。REST用来描述客户端通过某种形式获取服务器的数据,这些数据资源的格式通常是JSON或XML。同时,这些资源的表现或资源的集合是可以修改的,伴随着行为和关系可以通过多媒体来发现。在我看来,一种简单的理解就是:在设计API时,使用路径定位资源,方法定义操作,通过Content-Type和Accept来协商资源的类型。REST也有一些限制

  1. REST是无状态的,请求之间没有持久的会话信息
  2. 响应需要声明成可缓存的
  3. REST关注一致性,如果使用HTTP,需要尽可能使用HTTP的特性,而不是去发明新的公约

这些限制允许REST架构的API更加稳定。

  • REST通过HTTP协议定义的通用动词方法(GET、PUT、DELETE、POST),以URI对网络资源进行唯一标识,响应端根据请求端的不同需求,通过无状态通信,对其请求的资源进行表述。
  • 满足REST约束条件和原则的架构,就被称为是RESTful架构。就像URL都是URI(统一资源标识)的表现形式一样,RESTful是符合REST原则的表现形式。

四、REST和RPC区别

  • REST是一种设计风格,它的很多思维方式与RPC是完全冲突的。
  • RPC的思想是把本地函数映射到API,也就是说一个API对应的是一个function,能通过某种约定的协议来调用,至于这个协议是Socket、是HTTP还是别的什么并不重要;
  • RPC中的主体都是 【动作,动词】
  • 而REST则不然,它的URL主体是 【资源,名词】。 而且也仅支持HTTP协议,规定了使用HTTP
    Method表达本次要做的动作,类型一般也不超过那四五种。
  • 这些动作表达了对资源仅有的几种转化方式。
  • RPC的中文意思是远程过程调用,HTTP是一种应用层传输协议。二者不是一个层面的东西,所以我们一般会称呼RPC为框架,HTTP为协议,在RPC框架中可以选择HTTP作为传输协议
  • RPC,远程过程调用可能让人感觉到一头雾水,无法很直观的感受到这是个什么东东。其实,说的简单一点,远程过程调用其实描述的是一件事儿,一件客户端如何调用服务端的事儿。在这件事儿里,包括了很多内容,例如:序列化和反序列化协议怎么弄,传输协议选什么等等。这些我们在上面介绍RPC已经介绍过。
    那么我们说回一开始的Feign
  • Feign是Spring Cloud全家桶中推荐使用的RPC框架,但是Feign也是使用了HTTP作为传输层协议的
  • 上文介绍了RPC,并且列举了一些常见的RPC框架。总的来说,RPC和HTTP二者并不是一个层面的东西在RPC框架中可以选择使用HTTP作为其传输层协议,而在微服务体系中,无论使用Feign还是使用RestTemplate,传输层都是基于HTTP协议进行传输的
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨~旋律

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值