Stub学习
RPC
RPC(Remote Procedure Call)就是某台主机A(一般为client)像调用本地的过程一样去调用另一台主机B(一般为server)上的某个过程。RPC代码可能长成这个样子:
//client
void SampleFunc() {
Request req;
req.set_key("client");
vector<string> values = {"v1", "v2"};
req.set_values(values);
Response response = remoteHost.RemoteFunc(req);
cout << response.status() << endl;
}
//server
Response RemoteFunc(Request req) {
//...
}
在client调用remoteHost.RemoteFunc()时,其实已经发生了一次网络传输。参数被封包后传递给了server,传递方式可能是HTTP请求,也可能直接用TCP。server接收到参数后调用相应的RemoteFunc函数,并在离开函数时再将结果封包后传回给client。整个过程被称为一次RPC调用。
RPC调用可能像上面代码一样是同步的,但也可以是异步的,client在发起请求后需要主动去查询response。
由此我们可以看出RPC需要做的事有:
- 在client和server端各自准备好用于网络通信的函数,也就是上面代码中的RemoteFunc;
- 在client和server端各自准备好用于网络通信的数据类型,也就是上面代码中的Request和Response;
- 把请求分发给相应的函数。
这里面有两个问题:
- 如何保证client调用的函数和server端准备的函数是一致的(也就是可调用的);
- 如何保证Request和Response类型在client和server端是一致的(也就是可被正确解析的)。
stub就是用于解决这两个问题的代码。
Stub
wiki里的解释是:分布式计算中的stub是在RPC调用中用于转换参数的代码。进行RPC调用的两端都要装相应的RPC函数库,而stub就是RPC函数库里用于保证数据在两端一致的代码。
数据在两端为什么会不一致呢?可能有以下原因:
- 编程语言不同,那么使用的数据类型肯定不同;
- 位宽不同,一边是32位,一边是64位,整数长度不一致;
- 大小端不同,一边是大端,一边是小端;
- 结构体的内存布局不同,这个和整个编译环境有关;
- 字符串编码不同,一边是GBK,一边是UTF-8。
stub就是要选取一种中间形式,让两端的数据都可以正确可逆的与中间数据进行转换。常用的中间数据类型包括:纯字符串、XML、JSON、protobuf。
stub的代码可以手动去写,优点是可以处理非常复杂的数据类型,缺点是比较繁琐,如果数据类型需要修改,工作量很大。
一般来说stub都是通过现成的函数库自动生成的。这种方法需要用指定的语言(interface description language, IDL)完成一个描述文档,这个文档同时应用于client和server端。在使用时两端的stub编译器会将IDL文档翻译成指定的编程语言供两端的程序使用。如前面程序中使用的两种数据类型可以这样描述:
message Request{
required bytes key = ;
repeated bytes values = ;
}
message Response {
required int32 status = ;
optional bytes error_code = ;
}
当数据类型要进行修改的时候,只要改一下IDL文档,再用stub编译器进行编译就OK了。
除了数据,RPC过程也可以通过IDL进行定义:
service DefaultService {
rpc RemoteFunc(Request) returns(Response)
}
Stub学习的更多相关文章
- TDD学习笔记【六】一Unit Test - Stub, Mock, Fake 简介
这篇文章简介一下,如何通过 mock framework,来辅助我们更便利地模拟目标对象的依赖对象,而不必手工敲堆只为了这次测试而存在的辅助类型. 而模拟目标对象的部分,常见的有 stub objec ...
- RhinoMock学习-Stub方法
// Arrange var stub = MockRepository.GenerateStub<IDemo>(); stub.Stub(x => x.StringArgStrin ...
- springMVC学习笔记--知识点总结1
以下是学习springmvc框架时的笔记整理: 结果跳转方式 1.设置ModelAndView,根据view的名称,和视图渲染器跳转到指定的页面. 比如jsp的视图渲染器是如下配置的: <!-- ...
- 学习SpringMVC——你们要的REST风格的CRUD来了
来来来,让一下,客官,您要的REST清蒸CRUD来了,火候刚刚好,不油不腻,请慢用~~~ 如果说前面是准备调料,洗菜,切菜,摆盘,那么今天就来完整的上道菜,主要说的是基于REST风格实现数据的增删改查 ...
- Spring学习系列(一) Spring简介
Spring简介 之前一直想写点东西,可一直没有开始实施,各种原因都有,最大原因可能还是自己太懒了,嘿嘿.最近在看Spring in action这本书,为了能让自己坚持下去把书看完,这次决定同步的在 ...
- SpringMVC学习记录2
废话 最近在看SpringMVC...里面东西好多...反正东看一点西看一点吧... 分享一下最近的一些心得..是关于DispatcherServlet的 DispatcherServlet与Cont ...
- TDD学习笔记【五】一隔绝相依性的方式与特性
前言 在上一篇文章中,提到了如何通过 IoC 的设计,以及 Stub Object 的方式,来独立测试目标对象. 这一篇文章,则要说明有哪些设计对象的方式,可以让测试或需求变更时,更容易转换. 并说明 ...
- TDD学习笔记【四】--- 如何隔离相依性 - 基本的可测试性
前言 相信许多读者都听过「可测试性」,甚至被它搞的要死要活的,还觉得根本是莫名其妙,徒劳无功.今天这篇文章,主要要讲的是对象的相依性,以及对象之间直接相依,会带来什么问题.为了避免发生因相依性而导致设 ...
- TDD学习笔记【三】---是否需针对非public方法进行测试?
前言 在Visual Studio 2012 中,针对Unit Test 的部分,有一个重要的变动: 原本针对「测试对象非public 的部分」,开发人员可通过Visual Studio 2010 自 ...
随机推荐
- 【BZOJ4003】[JLOI2015]城池攻占 可并堆
[BZOJ4003][JLOI2015]城池攻占 Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池. 这 n 个城池用 1 到 n 的整数表示.除 1 号 ...
- iOS - 初学iPad开发入门
iPad是一款苹果公司于2010年发布的平板电脑定位介于苹果的智能手机iPhone和笔记本电脑MacBook产品之间跟iPhone一样,搭载的是iOS操作系统 iPhone和iPad开发的区别 屏幕的 ...
- Malformed \uxxxx encoding
今天碰到个问题. FATAL [btir.server.ServerStartup:54] - <java.lang.IllegalArgumentException: Malformed \u ...
- linux本机root账户无法登录,但是远程ssh可登录
1.故障状态 a.linux本机root账户无法登录(root和密码无误的情况下也无法登录,但是用远程ssh软件可以登录) b.查看/var/log/secure登录日志(提示无法找到pam_limi ...
- 【巷子】---vue路由懒加载---【vue】
一.懒加载 也叫延迟加载或者按需加载,即在需要的时候进行加载, 二.为什么要使用懒加载 像vue这种单页面应用,如果没有应用懒加载,运用webpack打包后的文件将会异常的大,造成进入首页时,需要 ...
- 【转】SQL Server编程游标
在关系数据库中,我们对于查询的思考是面向集合的.而游标打破了这一规则,游标使得我们思考方式变为逐行进行.对于类C的开发人员来着,这样的思考方式会更加舒服. 正常面向集合的思维方式是: 而对于游标来说: ...
- The key unit of modularity in OOP is the class, whereas in AOP the unit of modularity is the aspect.
Spring Framework Overview https://www.tutorialspoint.com/spring/spring_overview.htm Aspect Oriented ...
- python的pip的配置文件路径在哪里?如何修改pypi源?
官方文档: https://pip.pypa.io/en/stable/user_guide/#configuration 举个例子: Windows用户想要更改pypi源,可以在%APPDATA%目 ...
- android进入页面会定位到ListView问题解决方法
在我们的页面中如果存在有ListView,当我们进入这个activity时,页面会定位到ListView的位置去,而不是activity的头部,这是由于ListView会去默认获取焦点所造成的. 解决 ...
- 第1章 1.6计算机网络概述--OSI参考模型
ISO七层模式:国际标准组织对互联网通信规则进行的定义. 7.应用层:所有能产生网络流量的程序,如:QQ. 6.表示层:传输前对数据进行进行处理,是一种数据处理的规则,如:加密.压缩.传输二进制(图片 ...