Yami4 开源轻量级跨平台RPC库详解

1 篇文章 0 订阅
1 篇文章 0 订阅

1 概述

    在程序的设计中,通常会将程序分层设计,如一个客户端程序在设计时,通常会划分为界面(view)、数据(data)、业务(worker)等,层次的划分大大降低了各个模块的耦合性,提高了各个模块的可重用性,然各个模块又有着一定的相关性,如:View依赖Data,Data的有效性又依赖Worker,那么问题来了,各个模块应该如何交互数据呢?如果分层中的某一层模块又可以跨平台使用呢?

    各个平台(Win、Linux、Android等) 各有各的特性,如:Windows操作系统在Win 2000及以后操作系统,自带RPC通信框架,如需详细了解,请参考《基于MIDL的Windows RPC实现》。这里主要介绍一款开源轻量级跨平台的RPC库 Yami4,也是一款简单易用高效的RPC库,c++语言编写,并提供了Ada, C++, Java, .NET and Python Library。Yami4提供了多种运行模型,可以根据自己业务的需求,来选择自己程序可能会用到的业务模型。本文将详细介绍Yami4提供的各种业务模型。

    这里不再赘述程序设计,主要介绍一下Yami4。

2 Yami4 RPC库的特性

2.1 支持多种业务模型

  • 点到点模型(peer,  remote-peer)

点对点模型适用于两个平级的模型,例如:Echo服务,如下图所示:

image

  • 客户端服务端模型(client1, client2, client3, …clientn,  server)

中心服务端模型,可用于多RPC服务,例如:calculator等,如下图所示:

image

  • 订阅发布模型(subscribe1, subscribe2, subscribe3, …subscriben, publish)

订阅者发布模型,可用于订阅了自己感兴趣的信息,当有信息发布时,subscribe可以第一时间获取到该信息详细内容,publisher需要将信息依次的发布到注册到自己的订阅者,例如:订阅者,订阅天气情况,当Wether中心发布了一条最新的天气信息后,交由发布者中心,发布者中心再将信息依次发给注册在自己服务列表的订阅者,流程图如下图所示:

image

  • 负载均衡自带故障转移模型

所谓的负载均衡故障转义功能,是在客户端是同failover指令配置多个服务器的地址,当客户端有业务请求时,会根据配置的组合随机选择,假如当其中一个Server go down时,请求将自动转移自正常的服务器,该服务模式提高了一定的容错机制,在现实生活中经常碰到这样的需求,比如:用户为了节省成本,在A地域核心链路只部署了一台线上服务器,并未购买备机,当线上服务器因为某些原因,出现故障后将是毁灭性的灾难,当然配置failover指令只是容错机制。流程图如下所示:

image

  • 命名服务模型

命名服务模型有点像DNS解析,NS客户端只知道name server 的地址,当NsClient发起访问时,先连接NameServe Resolve实际要通信的服务地址,而NsSever在运行前,需要向NameServer注册自己的Name和地址信息,这样NameSever将缓存当前已经注册过的NsServer信息,在客户端请求Resolve通信服务器的地址信息时,将缓存的地址发送给NsClient, 接下来的通信就和上面的模式一样了。这样设计的好处在于,针对复杂的Windows网络环境,自己的服务的端口很可能被其他程序占用,假如自己的服务有多个,那么出现这种情况的概率就比较高了,为了避免该问题,可以使用该设计模式,虽然NameServer也要占用一个端口号,但相对来说降低了冲突的改概率。详细模型见下图:

image

  • Cache 服务模型

相信大家对Cache这个词已经很熟悉了,应用程序(RPC)或者应用程序的模块(IPC)之间数据的共享,可以使用文件,共享内存,PIP,油槽,套接字,COM对象或者数据等来共享运行时数据,如果你的程序不对数据做持久化存储,那么可以选择使用Yami4做应用程序间的Cache服务,用于共享和缓存用户见的数据。同样如果部署在服务器端,也可以和数据库进行并行使用,就行被大家所熟悉的Memcache或redis一样。只不过Yami4功能相对简单,详细设计模型见下图:

image

  • Server Queues 服务模型

Queue模型和故障转移模型类似,都是起到了负载均衡的功能,不同的是客户端不再直接和服务端相连,取而代之的是Queue服务,客户端将请求的业务操作,提交给Queue服务,Queue服务根据调度算法,计算将任务队列中的内容依次的Disptch给已注册的服务端,最后将服务端处理的结果发送给客户端。该模型综合了负债均衡,自我故障转移,命名服务的特性。详细模型见下图所示:

image

  • Broker服务模型

Broker模型和Queue模型链路结构很像,但实际的业务并不相同,Broker模型是生产者和消费者模型,每个生产者可能提供的任务类型不一,生产者将自己的产出的任务类型提交给Broker,Broker根绝每个Consumer注册消费的业务对象,将任务列表发送给注册了可消费相同业务类型的Consumer,如下图所示,注意假如Broker收到的A,Broker会将A同时发送给第一和第三个Consumer,该模型很像Publusher模型,具体业务模型见下图所示:

image

3 源码分析

下一篇博客详细讲解

4 Win平台的编译

  • Yami4源码并没有提供visual stdio工程,也没有提供cmake脚本,所以我使用了比较笨的方法,查看Linux下的编译脚本MakeFile,将MakeFile编译的相关内容,创建vs工程文件,也没有完全创建所有的工程,只是给大家一个示例,有兴趣的可以去github中获取工程,并自己完善vs工程。
  • 在编译yamicore工程的时候,碰到了Yami适配不同平台的一个封装,Windows目录下的channel.cpp、listener.cpp、network_utils.cpp三个文件与Core目下的文件名冲突了,这将导致vs在编译的时候会随机的覆盖一个编译出来的*.obj,最终将表现在Example可执行程序连接yamicore.lib文件时,找不到符号连接(注:yamicore编译是没有问题,因为不存在编译问题)。解决方案: 方法一:直接更名冲突的文件名(这个方法比较直接,但是存在一定的缺陷,在修改文件名时,源码中的文件名也被修改);方法二: 右击冲突的明文名->属性->输出文件 在对象文件名中输入obj文件的名称与编译文件名不一,并且非工程中任意cpp文件名即可,如下图所示:

image

 

5 github

github地址:https://github.com/muxq/yami4-msvc

Yami4源码下载:http://www.inspirel.com/yami4/files/yami4-gpl-1.10.2.zip

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值