skynet源码剖析06 service-src下的C服务实现文件说明

service-src

这个目录下存放了skynet用到的c service的实现

databuffer.h

hashid.h

servie_gate.c

这3个文件时gate服务的实现 gate主要用于skynet与外部的tcp通讯 可以理解为将外部的tcp消息转换成skynet内部的消息

所以像master harbor服务这些都需要以来gate与外界通信  

master = master + gate

harbor = harbor + gate

具体是说明见: http: blog.codingnow.com/2012/09/the_design_of_skynet.html

hashid    就是应用层连接到客户端的peer_fd

databuffer 保存了某个客户端fd对应的数据

skynet_master.c

skynet_harbor.c

用于实现skynet集群间的内部通讯 不同skynet节点间的通信 skynet需要建立n*n条tcp连接来实现内部节点的通信Harbor 间通过单向的 tcp 连接管道传输数据,完成不同的 skynet 节点间的数据交换。skynet 目前支持一个全局名字服务,可以把一个消息包发送到特定名字的服务上。这个服务不必存在于当前 skynet 节点中。这样,我们就需要一个机构能够同步这些全局名字。

为此,我实现了一个叫做 master 的服务。它的作用就是广播同步所有的全局名字,以及加入进来的 skynet 节点的地址。本质上,这些地址也是一种名字。同样可以用 key-value 的形式储存。即,每个 skynet 节点号对应一个字符串的地址。skynet的 master服务 master服务保存了key-value key就是skynet的handle value就handle对应的服务matser用于skynet不同节点间的同步我设计了一台 master 中心服务器用来同步机器信息。把每个 skynet 进程上用于和其他机器通讯的部件称为 Harbor 。每个 skynet 进程有一个 harbor id 为 1 到 255 (保留 0 给系统内部用)。在每个 skynet 进程启动时,向 master 机器汇报自己的 harbor id 。一旦冲突,则禁止连入。master 服务其实就是一个简单的内存 key-value 数据库。数字 key 对应的 value 正是 harbor 的通讯地址。另外,支持了拥有全局名字的服务,也依靠 master 机器同步。比如,你可以从某台 skynet 节点注册一个叫 DATABASE的服务节点,它只要将 DATABASE 和节点 id 的对应关系通知 master 机器,就可以依靠 master 机器同步给所有注册入网络的 skynet 节点。master 做的事情很简单,其实就是回应名字的查询,以及在更新名字后,同步给网络中所有的机器。skynet 节点,通过 master ,认识网络中所有其它 skynet 节点。它们相互一一建立单向通讯通道。也就是说,如果一共有 100 个 skynet 节点,在它们启动完毕后,会建立起 1 万条通讯通道。

skynet_multicast.c

用于skynet的多播

skynet_tunnel.c

设置转发地址 即设置 forward的目的地址而跨集群分组又如何做到呢?这里是在上层用 lua 来做了进一步的封装。首先,提供了一个简单的,用 C 编写的服务,叫做 tunnel 。它可以把发送给它的消息,无条件的转发到另一个 handle 上。这个转发 handle 可以是在不同 skynet 节点上的。

service_logger.c

skynet的日志服务

skynet_snlua.c

skunet_lua.h

lua 服务生成器lua服务的消息 先到 service_snlua,再分发到lua服务中 每个lua服务其实 是一个service_snlua + 实际的lua服务总和

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值