Zinx-V0.6多路由的模式

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)
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值