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 自 ...
随机推荐
- 【BZOJ4144】[AMPPZ2014]Petrol 最短路+离线+最小生成树
[BZOJ4144][AMPPZ2014]Petrol Description 给定一个n个点.m条边的带权无向图,其中有s个点是加油站. 每辆车都有一个油量上限b,即每次行走距离不能超过b,但在加油 ...
- mybatis-config.xml配置
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...
- apache工作模式worker以及prefork的切换
apache比较常用的工作模式有worker以及prefork两种方式. 如果在编译时候不指定,系统默认的是prefork模式:如果需要换成worker模式,需要在编译的时候带上编译参数:--with ...
- New Garbage Collector http://wiki.luajit.org/New-Garbage-Collector
New Garbage Collector http://wiki.luajit.org/New-Garbage-Collector GC Algorithms This is a short ove ...
- 前端 html span标签
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- rtcp多媒体控制协议应用
rtcp package send/recv demo main.c #include <stdio.h> #include <rtp.h> #include <rtcp ...
- HDU1575:Tr A(矩阵快速幂模板题)
http://acm.hdu.edu.cn/showproblem.php?pid=1575 #include <iostream> #include <string.h> ...
- PAT 1142 Maximal Clique[难]
1142 Maximal Clique (25 分) A clique is a subset of vertices of an undirected graph such that every t ...
- weiwo.wxmmd.com将您重定向的次数过多。尝试清除 Cookie.
折腾了很久,最后更换PHP版本解决了,我的项目用的tp3.1.2,出现上图问题时的php版本是7.1,换回5.6就没有这个问题.希望能为大家提供一个思路.
- http webservice socket的区别
1 数据传输方式1.1 socket传输的定义和其特点 所谓socket通常也称作"套接字",实现服务器和客户端之间的物理连接,并进行数据传输,主要有udp和tcp两个协议. ...