您的位置:首页 > 其它

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支持的类型

IDLD lang
boolbool
bytebyte
ubyteubyte
shortshort
ushortushort
intint
uintuint
longlong
ulongulong
floatfloat
doubledouble
charchar
stringstring
[]DynamicArrayList
@messagestruct

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  server kiss-roc
相关文章推荐