kiss-rpc IDL協議編寫和使用方式

什麼是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會同時生成同步接口和異步接口,異步接口都爲參數回調的方式。
  • 倒入頭文件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);
            }

服務端service文件代碼(示例目錄:IDL-Example/server/source/IDL/kissidlInterface.d):

服務端接口都會異步事件處理。
  • 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;
    }
相關文章
相關標籤/搜索