什么是IDL
1. IDL是kiss rpc接口代碼生成協(xié)議, 編寫(xiě)IDL協(xié)議, 可以生成對(duì)應(yīng)的服務(wù)端和客戶端通用的RPC代碼調(diào)用接口.生成對(duì)應(yīng)的flatbuffer協(xié)議接口
2. 規(guī)范統(tǒng)一化, 接口統(tǒng)一化, 使用簡(jiǎn)單,真正意義上的函數(shù)式調(diào)用方式。
IDL使用方式
1. [idl文件路徑] [輸出名字] [輸出路徑,默認(rèn)為當(dāng)前目錄](méi). E."/root/home/kiss-rpc.idl" kiss-rpc "/root/home/rpc/"
2. 以模塊名稱(chēng)輸出, 模塊路徑為".": E."/root/home/kiss-rpc.idl" module.test.kiss-rpc "/root/home/rpc/"
3. 同時(shí)輸出client和server文件代碼,只需要拷貝到對(duì)應(yīng)的客戶端和服務(wù)端目錄就行了.
4. message的類(lèi)型名字必須首字母大寫(xiě),類(lèi)型成員必須標(biāo)上序列號(hào),否則無(wú)法編譯通過(guò)
5. 函數(shù)參數(shù)列表只能為一個(gè),否則無(wú)法編譯通過(guò)。
IDL支持的類(lèi)型
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. 服務(wù)端只要填充server目錄下service文件的函數(shù)接口代碼.
2. 客戶端只需要調(diào)用client目錄下service文件的接口的函數(shù).
kiss-rpc IDL 編寫(xiě)示例
//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 //接口類(lèi)
{
contacts getContactList(string accountName);
}
客戶端遠(yuǎn)程調(diào)用(示例目錄:IDL-Example/client/source/app.d)
IDL會(huì)同時(shí)生成同步接口和異步接口,異步接口都為參數(shù)回調(diào)的方式。
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);
}
以壓縮方式調(diào)用(支持動(dòng)態(tài)壓縮和強(qiáng)制壓縮)
RpcClient.setSocketCompress(RPC_PACKAGE_COMPRESS_TYPE.RPCT_DYNAMIC); //動(dòng)態(tài)壓縮方式,默認(rèn)超過(guò)200個(gè)字節(jié)壓縮.
RpcClient.setSocketCompress(RPC_PACKAGE_COMPRESS_TYPE.RPCT_COMPRESS); //強(qiáng)制壓縮方式
- 單個(gè)請(qǐng)求方式壓縮,同步調(diào)用,強(qiáng)制壓縮
//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);
}
- 單個(gè)請(qǐng)求方式壓縮,異步調(diào)用,設(shè)置100個(gè)字節(jié)的動(dòng)態(tài)壓縮方式,請(qǐng)求超時(shí)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);
}
服務(wù)端service文件代碼(示例目錄:IDL-Example/server/source/IDL/kissidlInterface.d):
服務(wù)端接口都會(huì)異步事件處理。
- 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;
}