代码仓库,目前代码比较粗糙,欢迎各种改进建议。
因为go语言原生支持高并发(goroutine)和通信机制(channel),所以首先想到的就是使用这两个东西来构建我的消息分发机制。
核心思路:
- 有一个core模块维护了所有的服务
- 当有消息发送的时候,通过该core模块将消息发送到对应服务器的接收channel中
- 服务中开一个goroutine来从channel取出消息并处理
主要函数:
- core.RegisterService(s) 注册一个服务到core,并且返回服务的id
- core.Name(id, name) 给一个已经注册的服务取名字,以
.
开头的名字表示本地名字,其他的表示全局名字,如果是多节点的时候,可以被注册到master上。 - core.SendName(dstServiceName, srcid, param …interface{})
- core.Send(dstid, srcid, param …interface{}) 发送消息到指定服务,可以通过id或者名字来发送
- core.Close(dstid, srcid) 发送关闭消息给服务,同时将服务从core模块中移除。
目前只支持一个服务的消息只在一个goroutine中处理,且也只在这个goroutinue发送该服务的消息,如果在多个goroutinue处理,core模块中实现的service基本功能部分可能会有竞争风险,处理如下:
OUTER_FOR:
for {
msg, ok := <-m.In()
if !ok {
log.Info("m.In is closed.")
a <- 1
break OUTER_FOR
}
m.DispatchM(msg)
}
其中m就是一个service,DispatchM函数是在core模块内部实现的,这个函数会把消息分发到注册dispatcher的对应方法中,一般dispatcher就是就是service自身。
core模块基本功能使用完整用例可以参考https://github.com/sydnash/lotou/blob/master/core/core_test.go