Zinx-V0.6多路由的模式
不同的Message应该对应不同的业务处理方式
1.消息管理模块(支持多路由调度管理–拥有一个Router集合属性) MsgHandler模块
1.1.抽象层
type IMsgHandler interface {
//添加路由到map集合中
AddRouter(msgID uint32, router IRouter)
//调度路由, 根据MsgID
DoMsgHandler(request IRequest)
}
1.2.实现层
type MsgHandler struct {
//存放路由集合的map
Apis map[uint32] ziface.IRouter //就是开发者全部的业务,消息ID和业务的对应关系
}
//初始化方法
func NewMsgHandler() ziface.IMsgHandler {
//给map开辟头空间
return &MsgHandler{
Apis:make(map[uint32]ziface.IRouter),
}
}
//添加路由到map集合中
func (mh *MsgHandler) AddRouter(msgID uint32, router ziface.IRouter) {
//1 判断新添加的msgID key是否已经存在
if _, ok := mh.Apis[msgID]; ok {
//msgId已经注册
fmt.Println("repeat Api msgID = ", msgID)
return
}
//2 添加msgID 和 router的对应关系
mh.Apis[msgID] = router
fmt.Println("Apd api MsgID = ", msgID, " succ!")
}
//调度路由, 根据MsgID
func (mh *MsgHandler) DoMsgHandler(request ziface.IRequest) {
// 1 从Request 取到MsgiD
router, ok := mh.Apis[request.GetMsg().GetMsgId()]
if !ok {
fmt.Println("api MsgID = ", request.GetMsg().GetMsgId(), " Not Found! Need Add!")
return
}
//2 根据msgID 找到对应的router 进行调用
router.PreHandle(request)
router.Handle(request)
router.PostHandle(request)
}
2.集成到zinx中
2.1.server应该将之前的单一的Router属性 改成 MsgHandler属性
type Server struct {
//服务器ip
IPVersion string
IP string
//服务器port
Port int
//服务器名称
Name string
//多路由的消息管理模块
MsgHandler ziface.IMsgHandler
}
2.2.修改server New方法 将MsgHandler初始化
func NewServer(name string) ziface.IServer{
s := &Server{
Name:config.GlobalObject.Name,
IPVersion:"tcp4",
IP:config.GlobalObject.Host,
Port:config.GlobalObject.Port,
MsgHandler:NewMsgHandler(),
}
return s
}
2.3.修改Server模块的AddRouter方法 形参增加一个MsgID
type IServer interface {
//启动服务器
Start()
//停止服务器
Stop()
//运行服务器
Serve()
//添加路由方法 暴露给开发者的
AddRouter(msgID uint32, router IRouter)
}
func (s *Server) AddRouter(msgId uint32, router ziface.IRouter) {
s.MsgHandler.AddRouter(msgId, router)
fmt.Println("Add Router SUCC!! msgID = ", msgId)
}
2.4.connection应该将之前的单一的Router属性 也改成 MsgHandler属性
type Connection struct {
//当前链接的原生套接字
Conn *net.TCPConn
//链接ID
ConnID uint32
//当前的链接状态
isClosed bool
//消息管理模块 多路由
MsgHandler ziface.IMsgHandler
}
2.5.修改connection New初始化方法,将Router形参,改成MsgHandler,由Server创建connection时候传递进来的
func NewConnection(conn *net.TCPConn, connID uint32, handler ziface.IMsgHandler) ziface.IConnection {
c := &Connection{
Conn:conn,
ConnID:connID,
//handleAPI:callback_api,
MsgHandler:handler,
isClosed:false,
}
return c
}
2.6.在connection 中调度Router业务的方法的地方, 改成 调用MsgHander的DoMsgHandler方法
func (c *Connection) StartReader() {
//从对端读数据
fmt.Println("Reader go is startin....")
defer fmt.Println("connID = ", c.ConnID, "Reader is exit, remote addr is = ", c.GetRemoteAddr().String())
defer c.Stop()
for {
......
//将读出来的msg 组装一个request
//将当前一次性得到的对端客户端请求的数据 封装成一个Request
req := NewReqeust(c, msg)
//调用用户传递进来的业务 模板 设计模式
go c.MsgHandler.DoMsgHandler(req)
}
}