美文网首页
kiss-rpc IDL协议编写和使用方式

kiss-rpc IDL协议编写和使用方式

作者: jasonsalex | 来源:发表于2017-06-29 19:29 被阅读0次

    什么是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会同时生成同步接口和异步接口,异步接口都为参数回调的方式。
    • 倒入头文件
    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;
        }
    
    

    相关文章

      网友评论

          本文标题:kiss-rpc IDL协议编写和使用方式

          本文链接:https://www.haomeiwen.com/subject/otjvcxtx.html