func newSubServer(httpAddr, httpsAddr string, maxClients int, gw *Gateway) *subServer { this := &subServer{ webServer: newWebServer("sub_server", httpAddr, httpsAddr, maxClients, Options.HttpReadTimeout, gw), closedConnCh: make(chan string, 1<<10), idleConns: make(map[net.Conn]struct{}, 200), wsReadLimit: 8 << 10, wsPongWait: time.Minute, timer: timewheel.NewTimeWheel(time.Second, 120), throttleBadGroup: ratelimiter.NewLeakyBuckets(3, time.Minute), goodGroupClients: make(map[string]struct{}, 100), ackShutdown: 0, ackCh: make(chan ackOffsets, 100), ackedOffsets: make(map[string]map[string]map[string]map[int]int64), } this.subMetrics = NewSubMetrics(this.gw) this.waitExitFunc = this.waitExit this.connStateFunc = this.connStateHandler if this.httpsServer != nil { this.httpsServer.ConnState = this.connStateFunc } if this.httpServer != nil { this.httpServer.ConnState = this.connStateFunc } this.auditor = log.NewDefaultLogger(log.TRACE) this.auditor.DeleteFilter("stdout") _ = os.Mkdir("audit", os.ModePerm) rotateEnabled, discardWhenDiskFull := true, false filer := log.NewFileLogWriter("audit/sub_audit.log", rotateEnabled, discardWhenDiskFull, 0644) if filer == nil { panic("failed to open sub audit log") } filer.SetFormat("[%d %T] [%L] (%S) %M") if Options.LogRotateSize > 0 { filer.SetRotateSize(Options.LogRotateSize) } filer.SetRotateLines(0) filer.SetRotateDaily(true) this.auditor.AddFilter("file", logLevel, filer) return this }
func New(id string) *Gateway { this := &Gateway{ id: id, shutdownCh: make(chan struct{}), certFile: Options.CertFile, keyFile: Options.KeyFile, clientStates: NewClientStates(), } this.zkzone = gzk.NewZkZone(gzk.DefaultConfig(Options.Zone, ctx.ZoneZkAddrs(Options.Zone))) if err := this.zkzone.Ping(); err != nil { panic(err) } if Options.EnableRegistry { registry.Default = zk.New(Options.Zone, this.id, this.InstanceInfo()) } metaConf := zkmeta.DefaultConfig() metaConf.Refresh = Options.MetaRefresh meta.Default = zkmeta.New(metaConf, this.zkzone) this.guard = newGuard(this) this.timer = timewheel.NewTimeWheel(time.Second, 120) this.accessLogger = NewAccessLogger("access_log", 100) this.svrMetrics = NewServerMetrics(Options.ReporterInterval, this) // initialize the manager store switch Options.ManagerStore { case "mysql": cf := mandb.DefaultConfig(Options.Zone) cf.Refresh = Options.ManagerRefresh manager.Default = mandb.New(cf) manager.Default.AllowSubWithUnregisteredGroup(Options.PermitUnregisteredGroup) case "dummy": manager.Default = mandummy.New() default: panic("invalid manager store") } // initialize the servers on demand if Options.ManHttpAddr != "" || Options.ManHttpsAddr != "" { this.manServer = newManServer(Options.ManHttpAddr, Options.ManHttpsAddr, Options.MaxClients, this) } if Options.PubHttpAddr != "" || Options.PubHttpsAddr != "" { this.pubServer = newPubServer(Options.PubHttpAddr, Options.PubHttpsAddr, Options.MaxClients, this) switch Options.Store { case "kafka": store.DefaultPubStore = storekfk.NewPubStore(Options.PubPoolCapcity, Options.PubPoolIdleTimeout, Options.UseCompress, &this.wg, Options.Debug, Options.DryRun) case "dummy": store.DefaultPubStore = storedummy.NewPubStore(&this.wg, Options.Debug) default: panic("invalid store") } } if Options.SubHttpAddr != "" || Options.SubHttpsAddr != "" { this.subServer = newSubServer(Options.SubHttpAddr, Options.SubHttpsAddr, Options.MaxClients, this) switch Options.Store { case "kafka": store.DefaultSubStore = storekfk.NewSubStore(&this.wg, this.subServer.closedConnCh, Options.Debug) case "dummy": store.DefaultSubStore = storedummy.NewSubStore(&this.wg, this.subServer.closedConnCh, Options.Debug) default: panic("invalid store") } } return this }