开局篇我们说了,RPC框架的四个核心内容

  1. RPC数据的传输

  2. RPC消息 协议
  3. RPC服务注冊
  4. RPC消息处理   
接下来处理传输数据。实际应用场景一般都是基于socket。socket代码比較多,使用起来也比較麻烦。

并且详细的传输通道使用socket或者其它的方式,如更上层的http,或者android里的binder,都是可替换的。仅仅是详细的一种实现而已。所以,这里我就偷个懒,仅仅是引入一个非常easy的Connection类。用来描写叙述一下怎样将传输数据
这一层给独立出来。


首先简单列出Connection类的实现,非常easy,就是两个list。一个管发送。一个管接收。

(实现没有考虑多线程安全。实际是必须考虑的)。

须要说明的是,这里的recv的实现约定是堵塞式的,也就是假设没有收到不论什么数据。recv调用会一直堵塞。

class Connection(object):
'''
@RPC 连接。 一般说来。都是socket连接。这里简化起见,直接本地变量实现。
''' def __init__(self, sending_msg_list, recving_msg_list):
'''
Constructor
'''
self.sending_msg_list = sending_msg_list
self.recving_msg_list = recving_msg_list def send(self, message):
self.sending_msg_list.append(message) def recv(self):
while len(self.recving_msg_list) == 0: time.sleep(0.01)
return self.recving_msg_list.pop(0) def isClosed(self):
return False

有了这个connection,剩下的就仅仅要将rpc消息统统通过这个connection去发送。通过这个Connection去接收。


接着改动client的request请求,不再直接调用server端的procRequest方法,而是将请求交给connection,去发送。

然后等待connection收到server端的回复,将回复消息从connection中取出来。

def request(self, req):
# 所有简化处理。不考虑线程安全问题,不考虑异步
# 先是将RPC消息发送到服务端,然后服务端就会处理,并将结果发回到client,client这边接收处理结果。
# self.remote.procRequest(req) // 删除
self.conn.send(req)
rsp = self.conn.recv()
return rsp.result

相同的,改动服务端收到request请求后的处理。首先重复调用connection.recv()方法读取客户端发过来的请求。当请求处理完毕后,不再直接以函数返回的方式return。而是将rsp交给connection。由connection负责传输给client

    # def procRequest(self, req): 调整參数列表,不再须要req
def procRequest(self):
# 循环读取并处理收到的客户端请求
while True:
req = self.conn.recv()
rsp = Response()
rsp.id = req.id
if req.command == 'sayHello':
rsp.result = self.sayHello()
elif req.command == 'whoAreYou':
rsp.result = self.whoAreYou()
else:
raise Exception("unknown command") # return rsp # rsp也是通过connection终于传给client。而不是直接函数返回
self.conn.send(rsp)

最后。列一下connection的初始化

slist = []
rlist = []
client = Client(Connection(slist, rlist))
server = Server(Connection(rlist, slist))
server.start()

总结,引入传输层的意义在于

1. 实现client与server端的解耦,client端不再须要持有server端的对象了。 这也是实现“远程调用 ”所必须的。
2. 传输层的实现有非常大的自由度,一般说来,他无需关心详细的RPC消息的格式。仅仅须要完毕数据的可靠传输就能够了。
3. 传输层详细基于socket。binder, 是採用http,udp。tcp这些都是自由的。依据须要选择就能够了。也就是相当于一个能够自由拼接的组件。
4. 上面的模型实在过于简单,没有考虑多线程保护,没有考虑异常。

实际比較理想的情况。应该起码有个类,Connector,以及Channel。当中channel仅仅负责数据的传输,Connector负责管理channel。

兴许假设有时间,会再进行完好





一个简单RPC框架是怎样炼成的(V)——引入传输层的更多相关文章

  1. 一个简单RPC框架是怎样炼成的(VI)——引入服务注冊机制

    开局篇我们说了.RPC框架的四个核心内容 RPC数据的传输. RPC消息 协议 RPC服务注冊 RPC消息处理 接下来处理RPC服务的注冊机制.所谓注冊机制,就是Server须要声明支持哪些rpc方法 ...

  2. 一个简单RPC框架是怎样炼成的(IV)——实现RPC消息的编解码

    之前我们制定了一个非常easy的RPC消息 的格式,可是还遗留了两个问题,上一篇解决掉了一个.还留下一个 我们并没有实现对应的encode和decode方法,没有基于能够跨设备的字符串传输,而是直接的 ...

  3. 一个简单RPC框架是怎样炼成的(I)——开局篇

    开场白,这是一个关于RPC的相关概念的普及篇系列,主要是通过一步步的调整,提炼出一个相对完整的RPC框架. RPC(Remote Procedure Call Protocol)--远程过程调用协议, ...

  4. 一个简单RPC框架是怎样炼成的(II)——制定RPC消息

    开局篇我们说了,RPC框架的四个核心内容 RPC数据的传输. RPC消息 协议 RPC服务注冊 RPC消息处理 以下,我们先看一个普通的过程调用 class Client(object): def _ ...

  5. Java实现简单RPC框架(转)

    一.RPC简介 RPC,全称Remote Procedure Call, 即远程过程调用,它是一个计算机通信协议.它允许像本地服务一样调用远程服务.它可以有不同的实现方式.如RMI(远程方法调用).H ...

  6. 一个入门rpc框架的学习

    一个入门rpc框架的学习 参考 huangyong-rpc 轻量级分布式RPC框架 该程序是一个短连接的rpc实现 简介 RPC,即 Remote Procedure Call(远程过程调用),说得通 ...

  7. RPC笔记之初探RPC:DIY简单RPC框架

    一.什么是RPC RPC(Remote Procedure Call)即远程过程调用,简单的说就是在A机器上去调用B机器上的某个方法,在分布式系统中极其常用. rpc原理其实很简单,比较容易理解,在r ...

  8. 基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇

    基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇 前提 最近对网络编程方面比较有兴趣,在微服务实践上也用到了相对主流的RPC框架如Spring Cloud Gateway底层也切换 ...

  9. 基于Netty和SpringBoot实现一个轻量级RPC框架-Server篇

    前提 前置文章: Github Page:<基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇> Coding Page:<基于Netty和SpringBoot实现 ...

随机推荐

  1. python魔法函数__dict__和__getattr__的妙用

    python魔法函数__dict__和__getattr__的妙用 __dict__ __dict__是用来存储对象属性的一个字典,其键为属性名,值为属性的值. 既然__dict__是个字典那么我们就 ...

  2. https、socket、http协议

    一.https https 其实是由两部分组成:http+ssl(Secure Sockets Layer 安全套接层)/tls(Transport Layer Security 继任者安全传输层), ...

  3. 根据名字杀死进程Killall

    Killall命令可以用来给一个特定的进程发送一个信号.这个信号默认情况下是SIGTERM,但也可以由killall命令使用参数来指定其它信号.现在让我们通过一些实际的例子来看看这个命令的实际用法. ...

  4. html 简单学习

    通过记事本,依照以下四步来创建您的第一张网页. 步骤一:启动记事本 如何启动记事本: 开始    所有程序        附件            记事本 步骤二:用记事本来编辑 HTML 在记事本 ...

  5. appium---【Mac】Appium-Doctor提示WARN:“ ios_webkit_debug_proxy cannot be found”解决方案

    “ ios_webkit_debug_proxy cannot be found”报错截图如下: 解决方案: 打开terminal终端,分别输入执行结束,再次运行appium-doctor即可看到运行 ...

  6. PHP完整的AES加解密算法使用及例子(256位)

    依赖PHP自身的mcrypt扩展 <?php class aes { // CRYPTO_CIPHER_BLOCK_SIZE 32 private $_secret_key = 'default ...

  7. 基于Ubuntu系统搭建以太坊go-ethereum源码的开发环境

    第一.先安装geth的CLI环境sudo apt-get install geth,这个很重要 第二.下载源代码 git clone https://github.com/ethereum/go-et ...

  8. 牛客网 牛客小白月赛12 B.华华教月月做数学-A^B mod P-快速幂+快速乘

    链接:https://ac.nowcoder.com/acm/contest/392/B来源:牛客网 华华教月月做数学 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其 ...

  9. python沙盒逃逸

    前言 最近遇到了很多python沙盒逃逸的题目(不知道是不是因为现在python搭的站多了--),实际使用时发现只会复制别人的payload是不够用的,于是自己来总结一波(顺带一提python沙盒逃逸 ...

  10. http请求,HttpClient,调用短信接口

    项目中安全设置找回密码的功能,需要通过发送短信验证绑定手机,通过绑定的手机号验证并重新设置密码. 因为项目是通过maven管理的,所以需要在pom.xml文件中引入jar包, maven引入的jar包 ...