资讯专栏INFORMATION COLUMN

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

xuweijian / 2485人阅读

摘要:什么是是接口代码生成协议编写协议可以生成对应的服务端和客户端通用的代码调用接口生成对应的协议接口规范统一化接口统一化使用简单,真正意义上的函数式调用方式。

什么是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;
    }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/10154.html

相关文章

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

    摘要:支持和手动编写协议两种方式。支持压缩算法,压缩速度,性能优越。单请求压缩对于单个请求进行压缩,也会根据请求的数据包压缩方式进行压缩。待开发数据加密使用多证书加密和单证书加密,更加安全。负载均衡,反向代理主动发现服务器,动态感知集群状态。 kiss-rpc特性: 1. 轻量级,简单易用。支持idl和手动编写协议两种方式。模拟函数式调用方式,更加符合rpc远程调用方式。 易修改易使用,已...

    gclove 评论0 收藏0
  • 干货 | Api 体系架构分享(上)

    摘要:最近呢,在做的设计对于设计,一方面是对于后端框架的设计,另一方面呢,是对于整个体系的设计在这里呢,我们来理理思路,先来大致分一下块风格就不用说了,我们就用风格,接下来,也就是我们所说的接口描述语言框架,整个服务的核心驱动版本控制还有一些辅助 最近呢,在做 api 的设计 对于设计,一方面是对于后端 server 框架的设计,另一方面呢,是对于整个 api 体系的设计 在这里呢,我们来理...

    impig33 评论0 收藏0
  • Thrift架构

    摘要:服务器端使用它来做顶层接口,编写实现类。会自动生成同步调用和异步调用的两个接口。方法参数的封装类,以方法名命名方法返回值的封装类,以方法名命名参考个人博客 基本概念 轻量级、跨语言的RPC框架 功能特点: 基于IDL(接口描述语言)生成跨语言的RPC clients and servers,支持超过20种语言 支持二进制的高性能的编解码框架 支持NIO的底层通信 相对简单的服务调用模...

    wall2flower 评论0 收藏0
  • 架构小试之IDL

    摘要:不合理的选型在后续维护上会带来不小的麻烦。因此一般公司会将所有服务的文件统一维护。生成的数据结构一般均支持序列化和反序列化,并且跨端跨语言。只支持,和数值三种结构,和支持相互嵌套,标准的的数值仅有这三种。只有大约的大小。本文转载自我自己的博客,感兴趣的老爷们可以关注~:https://www.miaoerduo.com/2021/11/16/arch-idl/为什么IDL的介绍也放在这里呢?...

    番茄西红柿 评论0 收藏2637
  • 从懵逼到再入门——JavaEE完整体系架构

    摘要:软件开发体系架构两层架构传统的客户服务器系统仅只简单地基于两层体系来构建,即客户端前台和企业信息系统后台,没有任何中间件,业务逻辑层与表示层或数据层混在一起。 showImg(https://segmentfault.com/img/remote/1460000007090113); 理想的建筑师应该既是文学家又是数字家,他还应通晓历史,热衷于哲学研究,精通音乐,懂得医药知识,具有法学...

    ZweiZhao 评论0 收藏0

发表评论

0条评论

xuweijian

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<