func (this *serviceMgr) UnregisteService(service *protocol.ServiceInfo) { if this == nil || service == nil { return } srvid := service.GetSrvId() srvtype := service.GetSrvType() if v, has := this.servicesPool[srvtype]; has { delete(v, srvid) } pack := &protocol.SSServiceShut{} pack.Service = service proto.SetDefaults(pack) sessiontypes := GetCareSessionsByService(service.GetSrvType()) areaId := service.GetAreaId() for _, v1 := range sessiontypes { ServerSessionMgrSington.Broadcast(pack, int(areaId), int(v1)) } }
func (sfcb *SessionHandlerClientBalance) OnSessionOpened(s *netlib.Session) { logger.Trace("SessionHandlerClientBalance.OnSessionOpened") services := srvlib.ServiceMgr.GetServices(srvlib.ClientServiceType) if services != nil { /*清理掉线的gate*/ for k, _ := range sfcb.gates { if _, has := services[k]; !has { delete(sfcb.gates, k) } } /*补充新上线的gate*/ for k, v := range services { if _, has := sfcb.gates[k]; !has { sfcb.gates[k] = &gateService{ServiceInfo: v, active: true} } } } /*查找最小负载的gate*/ var mls *libproto.ServiceInfo var min = 100000 for _, v := range sfcb.gates { if v.active && v.load < min { mls = v.ServiceInfo } } pack := &protocol.SCGateInfo{} if mls != nil { pack.SrvType = proto.Int32(mls.GetSrvType()) pack.SrvId = proto.Int32(mls.GetSrvId()) pack.AuthKey = proto.String(mls.GetAuthKey()) pack.Ip = proto.String(mls.GetIp()) pack.Port = proto.Int32(mls.GetPort()) } proto.SetDefaults(pack) s.Send(pack) time.AfterFunc(time.Second*5, func() { s.Close() }) }