当前位置: 首页 > Linux

如何编写和使用kiss-rpcIDL协议

时间:2023-04-06 19:27:27 Linux

什么是IDL1。IDL是kissrpc接口代码生成协议。通过编写IDL协议,可以为服务端和客户端生成相应的RPC代码调用接口。生成对应的flatbufferprotocolInterface2.统一规范,统一接口,简单易用,真正的函数式调用方式。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文件代码,只需要复制到对应的client和server目录即可。4.消息的类型名必须大写,类型成员必须标上序号,否则无法编译。5、函数参数列表只能是一个,否则无法编译。IDLIDLD支持的类型langboolboolbytebyteubyteubyteshortshortshortintintintuintuintlonglongulongulongfloatfloatdoubledoublecharcharstringstring[]DynamicArrayList@messagestructIDL代码使用1、服务端只需要填写服务端目录下服务文件的函数接口代码即可。2、客户端只需要调用客户端目录下service文件的接口函数即可。kiss-rpcIDL编写示例//kissrpcidldemo@message:UserInfo{stringphone:3;字符串用户名:1??;年龄:2;双wiget:4;字符串[]地址列表:5;}@message:contacts{intnumber:1;用户信息[]用户信息列表:2;}@service:AddressBook//接口类{contactsgetContactList(stringaccountName);}客户端远程调用(示例目录:IDL-Example/client/source/app.d)IDL会同时生成一个同步接口和一个异步接口,异步接口就是参数回调的方法。导入头文件importKissRpc.IDL.kissidlService;importKissRpc.IDL.kissidlMessage;importKissRpc.Unit;客户端同步调用try{autoc=addressBookService.getContactList(name);foreach(v;c.userInfoList){writefln("syncnumber:%s,name:%s,phone:%s,age:%s",c.number,v.name,v.widget,v.age);}}catch(Exceptione){writeln(e.msg);}客户端异步调用try{addressBookService.getContactList(name,delegate(Contactsc){foreach(v;c.userInfoList){writefln("asyncnumber:%s,name:%s,phone:%s,age:%s",c.number,v.name,v.widget,v.age);}});}catch(Exceptione){writeln(e.msg);}调用压缩(支持动态压缩和强制压缩)绑定套接字方式压缩RpcClient.setSocketCompress(RPC_PACKAGE_COMPRESS_TYPE.RPCT_DYNAMIC);//动态压缩方式,默认压缩200字节以上.RpcClient.setSocketCompress(RPC_PACKAGE_COMPRESS_TYPE.RPCT_COMPRESS);//强制压缩方式单请求方式压缩,同步调用,强制压缩//使用compressdemotry{autoc=addressBookService.getContactList(name,RPC_PACKAGE_COMPRESS_TYPE.RPCT_COMPRESS);foreach(v;c.userInfoList){writefln("compresstest:syncnumber:%s,name:%s,phone:%s,age:%s",c.number,v.name,v.widget,v。年龄);}}catch(Exceptione){writeln(e.msg);}单次请求压缩,异步调用,设置100字节的动态压缩方式,请求超时30秒//使用动态压缩,设置请求超时try{RPC_PACKAGE_COMPRESS_DYNAMIC_VALUE=100;//重置压缩动态值100字节,默认:200字节addressBookService.getContactList(name,delegate(Contactsc){foreach(v;c.userInfoList){writefln("动态压缩测试:同步号码:%s,姓名:%s,手机:%s,年龄:%s",c.number,v.name,v.widget,v.age);}},RPC_PACKAGE_COMPRESS_TYPE.RPCT_DYNAMIC,30);}catch(Exceptione){writeln(e.msg);}服务器服务文件代码(示例目录:IDL-Example/server/source/IDL/kissidlInterface.d):服务器接口将处理异步事件RpcAddressBookService.getContactList联系人getContactList(AccountNameaccountName){联系人contactsRet;//为联系人类输入服务代码contactsRet.number=accountName.count;for(inti=0;i<10;i++){UserInfouserInfo;userInfo.age=18+i;userInfo.name=accountName.name~to!string(i);userInfo.widget=120+i;contactsRet.userInfoList~=userInfo;}返回contactsRet;}