1. IDL是kiss rpc接口代碼生成協議, 編寫IDL協議, 能夠生成對應的服務端和客戶端通用的RPC代碼調用接口.生成對應的flatbuffer協議接口 2. 規範統一化, 接口統一化, 使用簡單,真正意義上的函數式調用方式。
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 | 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 |
1. 服務端只要填充server目錄下service文件的函數接口代碼. 2. 客戶端只須要調用client目錄下service文件的接口的函數.
//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); }
倒入頭文件app
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); }
客戶端異步調用socket
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方式壓縮async
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秒ui
//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); }
RpcAddressBookService.getContactListcode
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; }