func (self *KiteQServer) Start() { self.remotingServer = server.NewRemotionServer(self.kc.server, self.kc.rc, func(rclient *client.RemotingClient, p *packet.Packet) { event := pipe.NewPacketEvent(rclient, p) err := self.pipeline.FireWork(event) if nil != err { log.Error("RemotingServer|onPacketRecieve|FAIL|%s|%t\n", err, p) } else { // log.Debug("RemotingServer|onPacketRecieve|SUCC|%s|%t\n", rclient.RemoteAddr(), packet) } }) err := self.remotingServer.ListenAndServer() if nil != err { log.Crashf("KiteQServer|RemotionServer|START|FAIL|%s|%s\n", err, self.kc.server) } else { log.Info("KiteQServer|RemotionServer|START|SUCC|%s\n", self.kc.server) } //推送可发送的topic列表并且获取了对应topic下的订阅关系 succ := self.exchanger.PushQServer(self.kc.server, self.kc.topics) if !succ { log.Crashf("KiteQServer|PushQServer|FAIL|%s|%s\n", err, self.kc.topics) } else { log.Info("KiteQServer|PushQServer|SUCC|%s\n", self.kc.topics) } //开启流量统计 self.kc.flowstat.Start() //开启recover self.recoverManager.Start() }
func (self *KiteQServer) Start() { self.remotingServer = server.NewRemotionServer(self.kc.so.bindHost, self.kc.rc, func(rclient *client.RemotingClient, p *packet.Packet) { event := pipe.NewPacketEvent(rclient, p) err := self.pipeline.FireWork(event) if nil != err { log.ErrorLog("kite_server", "RemotingServer|onPacketRecieve|FAIL|%s|%t", err, packet.MarshalPacket(p)) } else { // log.Debug("RemotingServer|onPacketRecieve|SUCC|%s|%t\n", rclient.RemoteAddr(), packet) } }) err := self.remotingServer.ListenAndServer() if nil != err { log.Crashf("KiteQServer|RemotionServer|START|FAIL|%s|%s\n", err, self.kc.so.bindHost) } else { log.InfoLog("kite_server", "KiteQServer|RemotionServer|START|SUCC|%s\n", self.kc.so.bindHost) } //推送可发送的topic列表并且获取了对应topic下的订阅关系 succ := self.exchanger.PushQServer(self.kc.so.bindHost, self.kc.so.topics) if !succ { log.Crashf("KiteQServer|PushQServer|FAIL|%s|%s\n", err, self.kc.so.topics) } else { log.InfoLog("kite_server", "KiteQServer|PushQServer|SUCC|%s\n", self.kc.so.topics) } //开启流量统计 self.startFlow() //开启recover self.recoverManager.Start() //启动DLQ的时间 self.startDLQ() //检查配置更新 if len(self.kc.so.configPath) > 0 { self.startCheckConf() } //启动pprof host, _, _ := net.SplitHostPort(self.kc.so.bindHost) go func() { if self.kc.so.pprofPort > 0 { http.HandleFunc("/stat", self.HandleStat) http.HandleFunc("/binds", self.HandleBindings) log.Error(http.ListenAndServe(host+":"+strconv.Itoa(self.kc.so.pprofPort), nil)) } }() }
//当触发QServer地址发生变更 func (self *KiteClientManager) onQServerChanged(topic string, hosts []string) { //重建一下topic下的kiteclient clients := make([]*kiteClient, 0, 10) for _, host := range hosts { //如果能查到remoteClient 则直接复用 remoteClient := self.clientManager.FindRemoteClient(host) if nil == remoteClient { //这里就新建一个remote客户端连接 conn, err := dial(host) if nil != err { log.ErrorLog("kite_client", "KiteClientManager|onQServerChanged|Create REMOTE CLIENT|FAIL|%s|%s\n", err, host) continue } remoteClient = c.NewRemotingClient(conn, func(rc *c.RemotingClient, p *packet.Packet) { event := pipe.NewPacketEvent(rc, p) err := self.pipeline.FireWork(event) if nil != err { log.ErrorLog("kite_client", "KiteClientManager|onPacketRecieve|FAIL|%s|%t\n", err, p) } }, self.rc) remoteClient.Start() auth, err := handshake(self.ga, remoteClient) if !auth || nil != err { remoteClient.Shutdown() log.ErrorLog("kite_client", "KiteClientManager|onQServerChanged|HANDSHAKE|FAIL|%s|%s\n", err, auth) continue } self.clientManager.Auth(self.ga, remoteClient) } //创建kiteClient kiteClient := newKitClient(remoteClient) clients = append(clients, kiteClient) } log.InfoLog("kite_client", "KiteClientManager|onQServerChanged|SUCC|%s|%s\n", topic, hosts) self.lock.Lock() defer self.lock.Unlock() //替换掉线的server old, ok := self.kiteClients[topic] self.kiteClients[topic] = clients if ok { del := make([]string, 0, 2) outter: for _, o := range old { for _, c := range clients { if c.remotec.RemoteAddr() == o.remotec.RemoteAddr() { continue outter } } del = append(del, o.remotec.RemoteAddr()) } if len(del) > 0 { self.clientManager.DeleteClients(del...) } } }