【手游项目5】skynet-3

本文介绍了Skynet框架的集群通信、组播机制、Lua服务运行方式、对象管理和继承、消息包处理、数据库操作以及配置文件加载。Skynet通过harbor服务实现集群间通信,使用协程处理lua服务,支持类的创建与继承,并提供了数据库如MySQL和Redis的接口,同时具备消息解码与编码功能,以及配置文件的动态加载。
摘要由CSDN通过智能技术生成

本篇为实战了,如果有些代码看不懂,或者skynet找不到,请下载demo https://github.com/sundream/ggApp


1.集群
cluster = require "skynet.cluster"

集群间的通讯,是由一个独立的 harbor 服务来完成的。所有的消息包在发送时,skynet 识别出这是一个远程消息包时,都会把它转发到 harbor 服务内。
harbor 服务会建立 tcp 连接到所有它认识的其它 skynet 节点内的 harbor 服务上。

https://blog.codingnow.com/2012/08/skynet_harbor_rpc.html
https://blog.codingnow.com/2017/03/skynet_cluster.html
https://blog.csdn.net/lzb991435344/article/details/77219557

2.组播
播包的分配和释放策略和其它包不同。它需要有引用计数。和别的消息包,发送方分配,接收方释放是不同的。
组播服务并不解决分熟在不同集群节点上的服务归组的问题。即,每个分组内的成员都必须在同一系统进程内。这可以极大的简化设计。用户可以让不同的服务 handle 归属一个组号。向 skynet 索取这个组号对应的 handle 。
向这个组的 handle 发送消息,就等同于向组内所有 handle 发送消息。

3.lua
我们所有的lua服务,均是依附于一个叫snlua的c模块来运行的,lua服务每次收到一个消息,
就会产生一个协程(事实上,skynet每个服务均有一个协程池,lua服务收到消息时,会优先去池子里取一个协程出来,
这里为了理解方便,就视为收到一个消息,就创建一个协程吧),并通过协程执行注册函数,

每个skynet进程在启动时,都会启动一个lua层的launcher服务,该服务主要负责skynet运作期间,服务的创建工作。
我们在lua层创建一个lua层服务时,通常会调用skynet.newservice函数

4.对象管理

local cplayer = class("cplayer",gg.class.cobjevent,gg.class.cobjattrs)     //创建一个C对象
local cbag_sys = class("cbag_sys")                                        //创建一个系统
local cbag_item = class("cbag_item")                                    //创建一个道具

--玩家系统
local cplayer = class("cplayer",gg.class.cobjevent,gg.class.cobjattrs)

function cplayer:init(data)
    --基类初始化
    gg.class.cobjevent.init(self)
    gg.class.cobjattrs.init(self,true)
    -------------------功能-----------------------
    self.bag_sys = gg.class.cbag_sys.new(self,data) --背包系统
end

--背包系统
local cbag_sys = class("cbag_sys")

function cbag_sys:init(player,player_data)
    self.player = player
    self.bag_items = {}
    for _,v in ipairs(player_data.bag_data or {}) do
        if v.count>0 and self:get_item_conf(v.id) then
            self.bag_items[v.id] = gg.class.cbag_item.new(self,v)
        end
    end
    self.notify_history = {}
    self.notify_history_tips = {}
    self:init_events() --事件初始化
end    

--道具对象
local cbag_item = class("cbag_item")

function cbag_item:init(bag_sys,data)
    self.bag_sys = bag_sys
    self.id = data.id
    self.count = data.count or 0
end

5.继承
local cclient = class("cclient")
local cgate_client = class("cgate_client",gg.class.cclient)

function cgate_client:init()
    gg.class.cclient.init(self)--调用父类
end

6.消息包
--解码
local message =  global.codec:unpack_message(msg)

--发送一个包给前端 (linktype == "tcp",linktype == "kcp",linktype == "websocket")
skynet.send(linktype,"lua","write",linkobj.linkid,msg)

--发送到其他服务
skynet.send(global:getworldhdl(),"lua","client_message",linkid,msg)

--通过gate转发给前端
function cglobal:sendclient_bylink(linkid,cmd,message)
    --编码
    local bin = self.codec:pack_message({
        cmd = cmd,
        args = message,
    })
    if not bin then
        return logger.error("sendclient_bylink encode cmd(%s) error",cmd)
    end
    skynet.send(self:getgatehdl(),"lua","server_sendlink",linkid,bin)
end

7.数据库

--MySQL
function dispatch_handle.mail_look(session,source,mail_id)
    local db = global:getsqldb()
    local lock = db:getqueue()
    lock(function()
        db:update("mail",{state = 1},{Id=mail_id,state=0})
    end) 
end

--redis
function dispatch_handle.query_plattask_info(session,source,account_id,merchantid)
    --redis处理
    local db = global:getrsdisdb()
    local key = global:getrediskey("task",account_id,merchantid)
    --不存在
    local data = db:HGETALL(key)
    return skynet.retpack(data)
end

8.配置文件
--加载配置加载
function cglobal:loadconf(isreload)
    local op = "new"
    if isreload then
        op = "update"
    end
    --读取所有配置
    local dir = "./config/"
    for entry in lfs.dir("./config/") do
        if entry ~= '.' and entry ~= '..' and string.find(entry,"%s*.json") then
            logger.info("begin load %s config",entry)
            local prename = string.split(entry,'.')[1]
            local data = gg.load_json(dir,prename)
            if data then
                sharedata[op](prename,data)
                logger.info("end load %s config sucess",entry)
            else
                logger.info("end load %s config failure",entry)
            end
        end
    end
end    
--使用配置文件
function cbag_sys:get_item_conf(id)
    local item_conf = sharedata.query("item_config")
    if id then
        return item_conf[tostring(id)]
    end
    return item_conf
end
 
 

### 回答1: 《Skynet框架教程-非常详细.pdf》是一本关于Skynet框架的教程,它提供了关于Skynet框架的全面和详细的介绍。 该教程首先介绍了Skynet框架的背景和起源,以及它的特点和优势。Skynet是一个高度可扩展的分布式服务框架,具有高性能和低延迟的特点。它采用了基于actor模型的并发编程模型,并提供了丰富的工具和库来帮助开发者构建和管理分布式应用。 教程的下一部分介绍了Skynet框架的基本概念和架构。它解释了Skynet节点、服务和消息传递等核心概念,并提供了示例代码来说明这些概念的使用方法。读者可以通过这一部分了解Skynet框架的基本原理和用法。 接下来的章节详细介绍了Skynet框架的各个组件和功能。其中包括服务注册与发现、负载均衡、容错机制、监控和调试等方面。每个组件和功能都有详细的说明和示例代码,读者可以通过实践来学习和理解。 教程的最后一部分是一些实际应用案例的介绍。这些案例涵盖了不同领域和规模的应用,包括游戏服务器、在线教育平台、电子商务网站等。每个案例都详细介绍了Skynet框架在该应用中的具体应用和实现过程,对于读者来说是一个很好的参考和借鉴资料。 总之,《Skynet框架教程-非常详细.pdf》是一本很好的Skynet框架学习资料,它提供了全面而详细的内容,涵盖了Skynet框架的各个方面。无论是初学者还是有一定经验的开发者,都可以通过这本教程来学习和掌握Skynet框架的使用和开发技巧。 ### 回答2: 《Skynet框架教程-非常详细.pdf》是一本关于Skynet框架的详细教程文档,其中包含了关于Skynet框架的基本概念、核心功能、使用方法等内容。 Skynet框架是一个高性能、轻量级的分布式服务框架,适用于开发网络游戏、实时通信等高并发场景。该框架基于事件驱动模型,通过异步消息传递和多线程技术实现高并发处理能力。 在《Skynet框架教程-非常详细.pdf》中,首先介绍了Skynet框架的背景与发展历程,帮助读者了解该框架的起源和应用领域。接着详细介绍了Skynet框架的核心架构,包括节点管理、服务管理、消息传递等模块的设计与实现原理。 教程还详细介绍了Skynet框架的安装和配置,包括环境准备、编译与安装等步骤。然后,通过一系列实际案例演示了如何使用Skynet框架进行开发,包括创建节点、注册服务、消息处理、资源管理等方面的内容。 此外,教程还介绍了Skynet框架的调试和优化技巧,包括日志查看、性能测试工具的使用等方面的内容。最后,给出了一些常见问题的解答,帮助读者更好地解决在使用Skynet框架过程中遇到的困惑。 总的来说,《Skynet框架教程-非常详细.pdf》是一本适合初学者和有一定经验的开发人员的教程,通过阅读该教程可以深入了解Skynet框架的原理和使用方法,从而更好地应用于实际项目中。 ### 回答3: 《Skynet框架教程-非常详细.pdf》是一本非常详细的Skynet框架教程。Skynet框架是一个高性能、高可靠性的分布式服务框架,用于构建可扩展的游戏服务器、物联网平台等分布式应用。 这本教程从Skynet框架的基础知识讲起,介绍了Skynet框架的特点、架构和设计理念。然后详细介绍了Skynet框架的安装和配置,包括环境准备、编译安装和启动流程等。 接下来,教程深入讲解了Skynet框架的核心概念和基本用法,包括服务、消息、协议等。这些内容帮助读者理解Skynet框架的工作原理,并能够快速上手开发。 教程还介绍了Skynet框架的高级特性和扩展功能,如集群部署、负载均衡、动态扩容等。这些内容使读者能够在实际应用中解决复杂的问题,并提升系统的性能和可扩展性。 此外,教程还提供了大量的示例和实战案例,帮助读者将理论应用到实际项目中。通过这些实例,读者可以学习到如何使用Skynet框架构建真实的分布式应用,同时也能够了解到Skynet框架的一些最佳实践和常见错误。 综上所述,《Skynet框架教程-非常详细.pdf》是一本非常全面的Skynet框架教程,适合初学者和有一定经验的开发者阅读,对于了解Skynet框架的原理和使用方法都有很大帮助。无论是想要学习Skynet框架的基础知识,还是进一步提升Skynet框架的应用技巧,这本教程都是一个不错的选择。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值