kiss-rpc IDL协议编写和使用方式
2017-07-10 14:52
162 查看
什么是IDL
1. IDL是kiss rpc接口代码生成协议, 编写IDL协议, 可以生成对应的服务端和客户端通用的RPC代码调用接口.生成对应的flatbuffer协议接口 2. 规范统一化, 接口统一化, 使用简单,真正意义上的函数式调用方式。
IDL使用方式
1. [idl文件路径] [输出名字] [输出路径,默认为当前目录]. E."/root/home/kiss-rpc.idl" kiss-rpc "/root/home/rpc/" 2. 以模块名称输出, 模块路径为".": E."/root/home/kiss-rpc.idl" module.test.kiss-rpc "/root/home/rpc/" 3. 同时输出client和server文件代码,只需要拷贝到对应的客户端和服务端目录就行了. 4. message的类型名字必须首字母大写,类型成员必须标上序列号,否则无法编译通过 5. 函数参数列表只能为一个,否则无法编译通过。
IDL支持的类型
IDL | D lang |
---|---|
bool | bool |
byte | byte |
ubyte | ubyte |
short | short |
ushort | ushort |
int | int |
uint | uint |
long | long |
ulong | ulong |
float | float |
double | double |
char | char |
string | string |
[] | DynamicArrayList |
@message | struct |
IDL代码使用方式
1. 服务端只要填充server目录下service文件的函数接口代码. 2. 客户端只需要调用client目录下service文件的接口的函数.
kiss-rpc IDL 编写示例
//kiss rpc idl demo @message:UserInfo { string phone:3; string userName:1; int age:2; double wiget:4; string[] addressList:5; } @message:contacts { int number:1; UserInfo[] userInfoList:2; } @service:AddressBook //接口类 { contacts getContactList(string accountName); }
客户端远程调用(示例目录:IDL-Example/client/source/app.d)
IDL会同时生成同步接口和异步接口,异步接口都为参数回调的方式。倒入头文件
import KissRpc.IDL.kissidlService; import KissRpc.IDL.kissidlMessage; import KissRpc.Unit;
客户端同步调用
try{ auto c = addressBookService.getContactList(name); foreach(v; c.userInfoList) { writefln("sync number:%s, name:%s, phone:%s, age:%s", c.number, v.name, v.widget, v.age); } }catch(Exception e) { writeln(e.msg); }
客户端异步调用
try{ addressBookService.getContactList(name, delegate(Contacts c){ foreach(v; c.userInfoList) { writefln("async number:%s, name:%s, phone:%s, age:%s", c.number, v.name, v.widget, v.age); } } ); }catch(Exception e) { writeln(e.msg); }
以压缩方式调用(支持动态压缩和强制压缩)
绑定socket方式压缩
RpcClient.setSocketCompress(RPC_PACKAGE_COMPRESS_TYPE.RPCT_DYNAMIC); //动态压缩方式,默认超过200个字节压缩. RpcClient.setSocketCompress(RPC_PACKAGE_COMPRESS_TYPE.RPCT_COMPRESS); //强制压缩方式
单个请求方式压缩,同步调用,强制压缩
//use compress demo try{ auto c = addressBookService.getContactList(name, RPC_PACKAGE_COMPRESS_TYPE.RPCT_COMPRESS); foreach(v; c.userInfoList) { writefln("compress test: sync number:%s, name:%s, phone:%s, age:%s", c.number, v.name, v.widget, v.age); } }catch(Exception e) { writeln(e.msg); }
单个请求方式压缩,异步调用,设置100个字节的动态压缩方式,请求超时30秒
//use dynamic compress and set request timeout try{ RPC_PACKAGE_COMPRESS_DYNAMIC_VALUE = 100; //reset compress dynamaic value 100 byte, default:200 byte addressBookService.getContactList(name, delegate(Contacts c){ foreach(v; c.userInfoList) { writefln("dynamic compress test: sync number:%s, name:%s, phone:%s, age:%s", c.number, v.name, v.widget, v.age); } }, RPC_PACKAGE_COMPRESS_TYPE.RPCT_DYNAMIC, 30 ); }catch(Exception e) { writeln(e.msg); }
服务端service文件代码(示例目录:IDL-Example/server/source/IDL/kissidlInterface.d):
服务端接口都会异步事件处理。RpcAddressBookService.getContactList
Contacts getContactList(AccountName accountName){ Contacts contactsRet; //input service code for Contacts class contactsRet.number = accountName.count; for(int i = 0; i < 10; i++) { UserInfo userInfo; userInfo.age = 18+i; userInfo.name = accountName.name ~ to!string(i); userInfo.widget = 120+i; contactsRet.userInfoList ~= userInfo; } return contactsRet; }
相关文章推荐
- 使用lua脚本编写wireshark协议插件
- Spring Data MongoDB : Query document(MongoDB中使用Query时的Query的编写和调用方式)
- 打印不同的数(编写一个程序,使用指针访问数组方式,读入十个数,输出其中不同的数,即一个数如果出现多次,只打印一次)
- 使用Qt Designer和手动编写代码两种方式实现多窗口切换程序(Qt基础)
- Android ConstraintLayout详解-使用可视化的方式来编写界面
- 使用UDP协议编写一个网络程序,设置接收端程序的监听端口是8001,发送端发送的数据是“Hello, world”
- 怎么使用formBuilder以拖拽方式编写页面
- 4.使用接口+xml文件方式编写dao层
- 贪吃蛇C++源码,使用面向对象方式编写
- 使用 lua 编写 wireshark 协议解析插件
- 使用Lua脚本为wireshark编写自定义通信协议解析器插件 .
- GWT RPC 的使用方式
- odoo10使用继承的方式编写一个培训管理模块
- RPC框架——简单高效hessian的使用方式
- 使用INDY TCP组件实现基于协议采用XML方式的文件传输
- 使用UDP协议编写一个网络程序,设置接收端程序的监听端口是8001,发送端发送的数据是“Hello, world”。
- git bash命令行使用https协议方式进行克隆和提交到github服务器
- 在Eclipse上使用egit插件通过ssh协议方式上传项目代码的具体步骤
- http协议Authorization认证方式在Android开发中的使用
- wireshark的使用教程--用实践的方式帮助我们理解TCP/IP中的各个协议是如何工作的