【大白话系列】HTTP和RPC

一、首先说明什么是RPC?

RPC是指远程过程调用,也就是说两台服务器A,B。一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,但是由于两个应用程序不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。

RPC 解决了什么问题?让分布式或者微服务系统中不同服务之间的调用像本地调用一样简单。

二、HTTP和RPC的区别

只要是远程调用都可以叫RPC,不管通过什么方式,所以:

其实HTTP就是一种RPC,HTTP通过一定的方法去调用HTTP服务器的某个procedure,执行完以后把结果返回。但是在一些特定的场景,我们觉得标准的HTTP太慢/太复杂等待,我们就会自己定义一种新的方式。

    HTTP的"臃肿":

通常定义的HTTP1.1(HTTP2.0已经优化编码问题了)协议中包含太多废信息:比如报头的键值对使用的是文本编码,非常占字节数,使得无效报文占比非常高。

而RPC通常使用自定义的TCP协议来进行通信,TCP的报头只有16个字节,极大提高了传输效率。

 

三、实现一个RPC

  1. 首先,要解决通信的问题,主要是通过在客户端和服务端直接建立TCP连接

  2. 第二,要解决寻址的问题,即要告知RPC框架服务器的IP地址以及特定的端口,方法的名称等等。

  3. 数据在网络中传输时,是以二进制进行的,固需要进行序列化

  4. 服务端收到请求后,进行反序列化,然后找到对应的方法,进行本地调用,得到返回值

  5. 把返回值序列化后发给客户端,客户端进行反序列化后得到结果。

     

四、常见的 RPC 框架总结

这里只介绍较主流的两种:

Dubbo: Dubbo是 阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。目前 Dubbo 已经成为 Spring Cloud Alibaba 中的官方组件。

Thrift: Apache Thrift是Facebook开源的跨语言的RPC通信框架,目前已经捐献给Apache基金会管理,由于其跨语言特性和出色的性能,在很多互联网公司得到应用,有能力的公司甚至会基于thrift研发一套分布式服务框架,增加诸如服务注册、服务发现等功能。

 

 

  • 要实现一个RPC不算难,难的是实现一个高性能高可靠的RPC框架:

比如,既然是分布式了,那么一个服务可能有多个实例,你在调用时,要如何获取这些实例的地址呢?

这时候就需要一个服务注册中心,比如在Dubbo里头,就可以使用Zookeeper作为注册中心,在调用时,从Zookeeper获取服务的实例列表,再从中选择一个进行调用。

那么选哪个调用好呢?这时候就需要负载均衡了,于是你又得考虑如何实现复杂均衡,比如Dubbo就提供了好几种负载均衡策略。

这还没完,总不能每次调用时都去注册中心查询实例列表吧,这样效率多低呀,于是又有了缓存,有了缓存,就要考虑缓存的更新问题,blablabla……

 

你以为就这样结束了,没呢,还有这些:

  • 客户端总不能每次调用完都干等着服务端返回数据吧,于是就要支持异步调用;

  • 服务端的接口修改了,老的接口还有人在用,怎么办?总不能让他们都改了吧?这就需要版本控制了;

  • 服务端总不能每次接到请求都马上启动一个线程去处理吧?于是就需要线程池;

  • 服务端关闭时,还没处理完的请求怎么办?是直接结束呢,还是等全部请求处理完再关闭呢?

  • ……

如此种种,都是一个优秀的RPC框架需要考虑的问题。

当然,接下来我们还是先实现一个简单的RPC,再在上面一步步优化!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值