luanet最初只是一个网络框架,它简单的封装了一些网络相关接口然后暴露到lua中,让lua可以构建简单的网络应用.

随着我的手游服务器的开发,我发现在C语言中要实现一个简洁易用的RPC调用接口并不容易,于是开始考虑将整个服务器框架从主C,

辅lua的模式转变成主lua,辅C的模式.网络通讯,异步日志等一些在lua中无法实现或cpu消耗大的组件由C语言实现注册到lua中.由lua

组合这些组件来实现一 个分布式的网络框架.

进入主题,首先简单的介绍luanet的特性:

  • 单线程(日志另开一个线程用于往磁盘异步写)

  • 支持TCP,UDP,UNIX域套接字

  • 提供面向消息和RPC的通讯方式

  • 利用coroutine实现同步的远程调用接口

  • 谈化连接的概念,服务之间通过名字通讯

  • 直接使用lua table作为通讯协议

下面通过一个简单的实例来介绍luanet的使用:

local net = require "lua/net"
local table2str = require "lua/table2str" local nameservice = net.netaddr_ipv4("127.0.0.1",) local function Plus(arg)
return nil,arg[1] + arg[2]
end
luanet.RegRPCFunction("Plus",Plus)
luanet.StartLocalService("PlusServer",SOCK_STREAM,net.netaddr_ipv4("127.0.0.1",))
luanet.Register2Name(nameservice)

上面的代码实现了一个简单的服务器,提供一个叫做Plus的远程方法. 首先注册远程方法,名字就是Plus,之后用服务名PlusServer在8012

端口上启动一个TCP监听. 然后向名字服务注册自己.一个简单的远程调用服务就实现了,下面再来看下客户端.

local net = require "lua/net"
local table2str = require "lua/table2str"
local Sche = require "lua/scheduler"
local nameservice = net.netaddr_ipv4("127.0.0.1",)
--启动本地服务
luanet.StartLocalService("PlusClient",SOCK_STREAM,net.netaddr_ipv4("127.0.0.1",))
--注册到NameService
luanet.Register2Name(nameservice)
--启动100个lightprocess执行远程调用
for , do
Sche.Spawn(
function()
while true do
local ret,err = luanet.RPCCall("PlusServer","Plus",{,})
if err then
return
else
print(ret)
end
end
end
)
end

client首先用名字PlusClient在8012上启动一个TCP监听用于跟其它服务通信.之后向名字服务注册自己,然后 Spawn个coroutine不断的执行对

PluServer的Plus远程方法的调用.对于上面的示例需要说明的一点是,luanet中的所有代码都运行在coroutine环境下,输入luanet xxx.lua 的

时候,luanet首先会载入statr.lua文件,然后用xxx.lua作为参数调用start函数.由start函数启动一个coroutine去执行xxx.lua文件,具体可以

查看luanet.c和start.lua.

下面简单介绍luanet的公共接口:

StartLocalService(local_name,local_socktype,local_addr,cb_disconnected)

用local_name作为服务的名字,启动本地服务.这里需要说明的是,当服务A向服务B发送消息或调用远程方法的时候,A会建立一个到B的连接

(connect B的主监听),B在这个连接上接收A发过来的所有消息和请求,但不会通过这个连接往A发送消息或远程方法的响应.如果B要向A发送

消息或远程回应,则B要建立一条到A的连接(connect A 的主监听).也就是说A与B之间如果要双向通信需要建立两条单向的连接.

Register2Name(nameaddr)

将服务注册到名字服务.

SendMsg(name,msg)

向name服务发送一条消息

RPCCall(name,funcname,arguments)

调用name服务的funcname方法

RegRPCFunction(name,func)

注册一个远程方法

GetRemoteFuncProvider(funcname)

获取提供远程方法funcname的服务名字列表

GetMsg()

提取发往本服务的消息,如果消息队列为空阻塞当前coroutine.建议的使用方式是启动一组coroutine调用GetMsg,这样当一个

coroutine阻塞在远程调用上时还有其它的coroutine可以继续提取消息并服务.

有兴趣的朋友可以关注luanet

luanet分布式lua框架的更多相关文章

  1. 一个轻量级分布式RPC框架--NettyRpc

    1.背景 最近在搜索Netty和Zookeeper方面的文章时,看到了这篇文章<轻量级分布式 RPC 框架>,作者用Zookeeper.Netty和Spring写了一个轻量级的分布式RPC ...

  2. 微软开源 WCF 分布式服务框架,并入 .NET 基金会项目

    微软北京时间2015.5.20 在其 .NET Foundation GitHub 开源项目页中开放了 WCF 分布式服务框架的代码.WCF突然之间成为一个热门话题,在各大网站上都有不同的报道:dot ...

  3. 使用dubbo分布式服务框架发布服务及消费服务

    什么是DUBBO DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案. 准备工作 安装zookeeper ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服 ...

  4. 阿里巴巴分布式服务框架dubbo学习笔记

    Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的 ...

  5. dubbo分布式rpc框架用法

    dubbo是阿里巴巴开源的分布式服务框架,致力于提供高性能和透明化的rpc远程服务调用方案,以及soa服务治理方案,如果没有分布式需求,是不需要dubbo的,分布式环境dubbo的使用架构官方给出了一 ...

  6. 高性能的分布式服务框架 Dubbo

    我思故我在,提问启迪思考! 1. 什么是Dubbo? 官网:http://dubbo.io/,DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及作为SOA服务治理的 ...

  7. 5个强大的Java分布式缓存框架推荐

    在开发中大型Java软件项目时,很多Java架构师都会遇到数据库读写瓶颈,如果你在系统架构时并没有将缓存策略考虑进去,或者并没有选择更优的 缓存策略,那么到时候重构起来将会是一个噩梦.本文主要是分享了 ...

  8. Dubbo 分布式服务框架(spring、zookeeper)

    DUBBO DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架, alibaba资源 源码:https://github.com ...

  9. 微软分布式云计算框架Orleans(2):容灾与集群(1)

    在上一篇:微软分布式云计算框架Orleans(1):Hello World,我们大概了解了Orleans如何运用,当然上一篇的例子可以说是简单且无效的,因为用了Orleans不可能只写一个Hello ...

随机推荐

  1. VUE系列三:实现跨域请求(fetch/axios/proxytable)

    1. 在 config/index.js 配置文件中配置proxyTable 'use strict' // Template version: 1.3.1 // see http://vuejs-t ...

  2. (原创)关于FFmpeg的一些有关的初始化默认值的问题

    最近手头上要做一个媒体格式分析库,能解析文件,流的视频格式,编码格式等一些重要的视频参数能进行尽量多的提取.当我们做媒体相关方面的东西,自然而然就会想到FFmpeg这个强大的开源媒体库,所以我们肯定会 ...

  3. Git的杀手级功能之 一 远程仓库

    Git的杀手级功能之一:远程仓库 Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上. 一.注册GitHub账号,然后和本地Git仓库来关联免费获得Git远程仓库来学校git的远程仓 ...

  4. 一篇关于apache commons类库的详解[转]

    1.1. 开篇 在Java的世界,有很多(成千上万)开源的框架,有成功的,也有不那么成功的,有声名显赫的,也有默默无闻的.在我看来,成功而默默无闻的那些框架值得我们格外的尊敬和关注,Jakarta C ...

  5. WiFidog 广告路由可修改功能更加智能化的几点看法

    海蜘蛛Tomato出了mini版,这个对很多做WiFi营销的朋友来说,是一个福音,因为可以直接从FIR302B,一台30多块钱的路由直接刷成Hi-WiFi,而且界面这么漂亮 相信很多人已经对此界面OE ...

  6. middle源码

    CREATE TABLE `middle` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `innserSessionid` VARCHAR(250 ...

  7. android中YUV转RGB的方法

    在一个外国网站上看到一段YUV转RGB的程序很不错,根据维基上的知识,方法应该是没问题的,自己也用过了,效果没问题. 首先说一下android上preview中每一帧的信息都是YUV420的,或者叫N ...

  8. [转]jmeter实战

    [转]http://blog.csdn.net/ultrani/article/details/8309932 本文主要介绍性能测试中的常用工具jmeter的使用方式,以方便开发人员在自测过程中就能自 ...

  9. 移动端网页使用flexible.js加入百度联盟广告样式不一致问题解决

    flexible.js是淘宝推出的一款移动端手机自适应的库,源码内容很简洁,当网页使用了该库之后,页面会在head中加入对应的页面响应式的meta标签. 当使用flexible.js的时候,引入百度联 ...

  10. PHP框架 Yii framework 用yiic命令时提示“php.exe”不是内部或外部命令

    解决方案 yii/framework/yiic.bat,修改 if "%PHP_COMMAND%" == "" set PHP_COMMAND=php.exei ...