前言
本文将简单介绍RPC,以及通过Eggjs框架搭建RPC客户端和服务端。
过程遇到的问题记录在这:Node.js Eggjs使用RPC模块 egg-sofa-rpc 踩坑记录
RPC介绍
RPC ( Remote Procedure Call ) 即 远程过程调用,就是像调用本地的函数一样去调用远程的函数。简单讲,就是本地调用的逻辑处理的过程放在的远程的机器上,而不是本地服务代理来处理。
也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。
HTTP和RPC的对比
在HTTP和RPC的选择上,可能有些人是迷惑的,主要是因为,有些RPC框架配置复杂,如果走HTTP也能完成同样的功能,那么为什么要选择RPC,而不是更容易上手的HTTP来实现了。
以下是阐述HTTP和RPC的异同。
- 传输协议
- RPC,可以基于TCP协议,也可以基于HTTP协议
- HTTP,基于HTTP协议
- 传输效率
- RPC,使用自定义的TCP协议,可以让请求报文体积更小,或者使用HTTP2协议,也可以很好的减少报文的体积,提高传输效率
- HTTP,如果是基于HTTP1.1的协议,请求中会包含很多无用的内容,如果是基于HTTP2.0,那么简单的封装以下是可以作为一个RPC来使用的,这时标准RPC框架更多的是服务治理
- 性能消耗,主要在于序列化和反序列化的耗时
- RPC,可以基于thrift实现高效的二进制传输
- HTTP,大部分是通过json来实现的,字节大小和序列化耗时都比thrift要更消耗性能
- 负载均衡
- RPC,基本都自带了负载均衡策略
- HTTP,需要配置Nginx,HAProxy来实现
- 服务治理(下游服务新增,重启,下线时如何不影响上游调用者)
- RPC,能做到自动通知,不影响上游
- HTTP,需要事先通知,修改Nginx/HAProxy配置
总结:
RPC主要用于公司内部的服务调用,性能消耗低,传输效率高,服务治理方便。HTTP主要用于对外的异构环境,浏览器接口调用,APP接口调用,第三方接口调用等。
HTTP接口是在接口不多、系统与系统交互较少的情况下,解决信息孤岛初期常使用的一种通信手段;优点就是简单、直接、开发方便。利用现成的HTTP协议进行传输。但是如果是一个大型的网站,内部子系统较多、接口非常多的情况下,RPC框架的好处就显示出来了,首先就是长链接,不必每次通信都要像HTTP一样去3次握手什么的,减少了网络开销;其次就是RPC框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作。第三个来说就是安全性。最后就是最近流行的服务化架构、服务化治理,RPC框架是一个强力的支撑
准备工作
本文以windows为例,其他操作系统的安装、使用方法请自行 google。
安装 nodejs
要求版本 >= 8.0.0
- 下载安装包:https://nodejs.org/zh-cn/
- 执行安装
安装 zookeeper
下载安装包:http://zookeeper.apache.org/releases.html
如果是最新版本则下载带有bin的包,不带bin是源码,需要自行编译
启动 zookeeper
服务
-
复制
conf/zoo_sample.cfg
为conf/zoo.cfg
-
在bin目录打开cmd,执行命令运行服务