(如有不全,烦请指出,后续不断跟进修正)
一、什么是RPC?为什么要学习RPC?有没有RPC的代替品?
——今后所有的学习笔记都将以此三问起头。关于编程,个人觉得由此三问,可助于编码人更加透彻清晰的了解学习目的,以及学下去的动力!
1. 什么是RPC(Remote Procedure Call Protocol,远程过程调用)?
(部分摘抄于https://www.zhihu.com/question/25536695用心阁回答)
官解:它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
通解:简单的来说就是像调用本地服务一样调用远程服务。比如两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。
用例:定义一个方法:Employee getEmployeeByName(String fullName)
需要解决的问题:(1.通讯 | 2.寻址 | 3.序列化和编组 | 4.反序列化 | 5. 3 4问题的重复)
2.为什么要学习RPC?
学习契机:公司游戏服务器需要与我这边的代理后台交互,主要的交互有:充值及反馈、查询游戏数据、公告等等。同时双方使用不同数据库。游戏服务器这边的大神使用GO,熟悉Google的gRPC框架,商讨下决定使用RPC通信。
比较决定:
相较于HTTP通信:速度慢、数据包大、实时交互压力大(无连接、无状态)、数据传输、安全性差。
相较于socket通信:较高的开发水平要求、较大的开发量
优势:
可以实现跨语言跨平台调用,GO可以调用JAVA服务,反之亦可。
每一次调用方只需要提出需求,不需要了解对方具体的业务。
各自模块各自业务隔离开来,满足面向对象思维,各自封装各自的业务逻辑,不会因为不熟悉业务的人的修改而导致系统崩溃。
易于拓展,易于复用(当然满足了面向对象的特性肯定有具有面向对象的优势。)
3.有没有RPC的代替品?
本地通信——内存映射
网络通信——socket、rpc。RESTful
二、目前开源的RPC框架有:
推荐大家阅读分布式RPC框架性能大比拼 ,有详细比较,这里我只加入了去年刚刚开源的bRPC。
1.Dubbo(阿里的soa服务化治理方案的核心框架,内置有rpc组件,国内最流行的rpc框架,目前听说又开始维护了)
2.gRPC(Google开发,2016年开源)
3.THrift(facebook开发,2007年贡献到apache基金)
4.bRPC(百度开发,据说是百度唯一良心的项目,可惜目前仅开源了C++)
5.Motan(新浪开发,2016/5开源)