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. 使用Photoshop画一个圆锥体

    一.准备工作 软件环境:PhotoshopCS6 实验目的:通过运用变换和选区工具,画出一个圆锥体 二.实验步骤 1,新建文件 2,前景色设置为黑色,并进行填充(快捷键 Alt+Delete) 3,创 ...

  2. SpringBoot系列二:搭建自己的第一个SpringBoot程序

    声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 一.根据官网手工搭建(http://projects.spring.io/spring-boot/#quick-start) 1 ...

  3. Mybatis系列(三):Mybatis实现关联表查询

    原文链接:http://www.cnblogs.com/xdp-gacl/p/4264440.html 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 ...

  4. Spring Boot Controller相应JSP页面 错误whitelabel error page

    在学习SpringBoot显示JSP页面的时候出现了错误,Controller可以正常调用,但是JSP页面就是不能正常显示. whitelabel error page 解决:注释掉scope < ...

  5. systemd的运行级别与服务管理命令简介

    从很久很久以前我们就在使用静态运行级别.而systemd提供了更为动态灵活的机制,来管控你的系统. 在开始介绍systemd命令前,让我们先简单的回顾一下历史.在Linux世界里,有一个很奇怪的现象, ...

  6. JAVABEAN必须继承序列化借口的作用

    这里有人家对序列化的测试 http://www.javaeye.com/topic/350137 Java的"对象序列化"能让你将一个实现了Serializable接口的对象转换成 ...

  7. UNIX环境编程学习笔记(4)——文件I/O之dup复制文件描述符

    lienhua342014-08-23 UNIX 提供了两个函数 dup 和 dup2 用于复制一个现存的文件描述符. #include <unistd.h> int dup(int fi ...

  8. Ubuntu下安装配置redis

    安装redis apt-get install redis-server 查看是否启动 ps -aux|grep redis 客户端连接 注: 安装Redis服务器,会自动地一起安装Redis命令行客 ...

  9. 【QT】Cannot find file: untitled.pro,项目路径不要包含中文。

    Cannot find file: D:\文件及下载相关\文档\untitled\untitled.pro. 17:01:45: 进程"D:\Englishpath\QT5.9.3\5.9. ...

  10. Cannot retrieve the latest commit at this time.

    此时无法检索最新提交. GitHub页面上提示: Cannot retrieve the latest commit at this time. 还没更新的意思,等他更新就好了. 更新后: