美文网首页
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协议编写和使用方式

    什么是IDL IDL使用方式 IDL支持的类型 IDL代码使用方式 kiss-rpc IDL 编写示例 客户端远程...

  • 高性能异步RPC框架 kiss-rpc-flatbuffer介绍

    kiss-rpc特性: 轻量级,简单易用。支持idl和手动编写协议两种方式。模拟函数式调用方式,更加符合rpc远程...

  • GRPC

    首先,GRPC是基于HTTP2来实现的网络传输协议 使用示例 编写IDL(接口描述语言),通过IDL来定义我们的服...

  • 什么是gRPC?

    本文会介绍gRPC和协议缓冲。gRPC可以使用协议缓冲作为它的IDL和底层信息交换格式。如果你刚接触gRPC或者协...

  • 用Swift编写网络层:面向协议方式

    用Swift编写网络层:面向协议方式

  • API的设计(3) - 实现方式

    protoapi实现的方式 接上文,我们选择了protobuf作为IDL,而在代码生成的工具上,我是选择了使用go...

  • Spring基于XML文件的方式配置AOP

    除了使用注解的方式配置切面,我们还可以使用XML文件的方式配置。 使用XML文件配置AOP 编写切面逻辑 编写接口...

  • Thrift IDL基本语法

    Thrift IDL基本语法 本文主要介绍Thrift的IDL基本语法。 IDL Thrift 采用IDL(Int...

  • Redis 数据结构简介

    【文章仅供非商业用途或交流学习使用】 简介 使用ANSI C语言编写,遵守BSD协议。 ...

  • .NET Core gRPC 流式调用

    gRPC 使用 Protocol buffers 作为接口定义语言(IDL)来描述服务接口和输入输出消息的结构,目...

网友评论

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

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