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

  1. RPC数据的传输
  2. RPC消息 协议
  3. RPC服务注冊
  4. RPC消息处理
以下,我们先看一个普通的过程调用
class Client(object):

    def __init__(self):
self.remote = None ##
# 内部是托付给远程remote对象来获取结果。
def sayHello(self):
if self.remote: return self.remote.sayHello()
else : return None class Server(object): def __init__(self):
pass def sayHello(self):
return 'Hello World' if __name__ == '__main__':
server = Server()
client = Client()
client.remote = server
print(client.sayHello())

这是一个常见的过程调用的样例,client调用sayHello,实际托付给Server的sayHello方法来实现。但他不是RPC调用。由于起码不是远程的。另外,也没有我们提到的四个核心内容。

于是我们的任务就是通过一点点的代码改动,为其引入RPC框架。

第一步,订协议。

俗话说得好,没有规矩不成方圆。

还是继续能多简单就多简单。
RPC请求:Request, 包括一个请求id 和 一个请求命令,如‘sayHello'
class Request(object):
'''
@RPC请求,包括命令id和请求内容两部分。 这个实现,与详细的RPC协议相关。
@这里是简化起见,採用python自身的字典作为其协议的数据结构
''' def __init__(self):
'''
Constructor
'''
self.id = 0 #id的作用在于将Request和Response建立绑定关系.在异步调用时就实用
self.command = None #sayHello def __str__(self):
return ''.join(('id: ', str(self.id), ' command: ', str(self.command)))

相同的,对RPC Response,也定义例如以下

class Response(object):
'''
@RPC回复。 包括答复id和运行结果两部分内容。当中答复id与相应的请求id一致。 @简单起见。协议的实现使用python自家的字典
''' def __init__(self):
'''
Constructor
'''
self.id = 0
self.result = None def __str__(self):
return ''.join(('id: ', str(self.id), ' result: ', str(self.result)))

定义好协议之后,我就对Client稍作改动,将原来直接的接口调用 self.remote.sayHello更改为 send Request (command='sayHello')

    def sayHello(self):
req = Request() // 构建一个RPC请求消息
req.id = 1
req.command = 'sayHello'
return self.request(req) def request(self, req):
rsp = self.remote.procRequest(req) // 将请求消息发送给远程服务端。 但由于传输层这里还没实现,所以先临时还是直接调用远端接口
return rsp.result

然后。服务端也要对应改动,须要依据request请求中的command命令,调用详细的方法。并将运行结果封装到Response中,返回给client。

def procRequest(self,req):
rsp = Response()
rsp.id = req.id
if req.command == 'sayHello':
rsp.result = self.sayHello()
else:
raise Exception("unknown command") return rsp

到这里。RPC框架中的RPC消息已经初具雏形,只是

  • 我们并没有实现对应的encode和decode方法,没有基于能够跨设备的字符串传输,而是直接的内存变量传递。
  • 如今的RPC request不支持带參数的请求命令。如add(a, b), 怎样在RPC消息中描写叙述參数a,b 。
这些问题我们在后面还会继续展开处理


最新文章

  1. 安卓界面控件屏幕居中Layout例子
  2. 你不知道的this指向
  3. 【项目】'NSRangeException', reason: '*** -[__NSArrayM removeObjectAtIndex:]: index 2 beyond bounds [0 .. 1]'
  4. iOS YSKit系列
  5. 重新想象 Windows 8 Store Apps (48) - 多线程之其他辅助类: SpinWait, SpinLock, Volatile, SynchronizationContext, CoreDispatcher, ThreadLocal, ThreadStaticAttribute
  6. css样式表:样式分类,选择器。样式属性,格式与布局
  7. angularJs的工具方法
  8. 怎样解决MySQL数据库主从复制延迟的问题---流行网站的解决办法(转载)
  9. struts2 集成 easyui
  10. pc端有弹出层 并有滚动的时候遇到的问题以及解决
  11. Oracle存储过程和自定义函数
  12. MYSQL 数据库导入导出命令
  13. codeforces 651C Watchmen
  14. Centos7下安装PHP5.5,5.6,7.0----(转载记录一下)
  15. surface pro app
  16. collections和collection 还有集合
  17. 关于main函数的参数问题
  18. Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.0.2:resources 在我的myeclipse中新建maven工程总出现这个问题
  19. idea 设置格式化代码 快捷键
  20. liunx step by step(3)

热门文章

  1. CF949C Data Center Maintenance(建图+强联通分量)
  2. unity 美术注意事项
  3. 05002_Linux的安装
  4. Chrome无界面浏览模式与自定义插件加载问题
  5. Project Euler:Problem 58 Spiral primes
  6. shu_1171 十->二进制转换(输入输出控制)
  7. url与图片
  8. 分析一下jquery中的ajax操作
  9. XDoclet学习
  10. Swift学习笔记(1)--基本语法