func (this *Start) main() { ctx.LoadFromHome() this.zkzone = zk.NewZkZone(zk.DefaultConfig(this.zone, ctx.ZoneZkAddrs(this.zone))) zkConnEvt, ok := this.zkzone.SessionEvents() if !ok { panic("someone stealing my events") } registry.Default = zkr.New(this.zkzone) log.Info("ehaproxy[%s] starting...", gafka.BuildId) go this.runMonitorServer(this.httpAddr) zkConnected := false for { instances, instancesChange, err := registry.Default.WatchInstances() if err != nil { log.Error("zone[%s] %s", this.zkzone.Name(), err) time.Sleep(time.Second) continue } if zkConnected { if len(instances) > 0 { this.reload(instances) } else { // resilience to zk problem by local cache log.Warn("backend all shutdown? skip this change") time.Sleep(time.Second) continue } } select { case <-this.quitCh: return case evt := <-zkConnEvt: if evt.State == zklib.StateHasSession && !zkConnected { log.Info("zk connected") zkConnected = true } else if zkConnected { log.Warn("zk jitter: %+v", evt) } case <-instancesChange: log.Info("instances changed!!") } } }
func New(id string) *Gateway { this := &Gateway{ id: id, shutdownCh: make(chan struct{}), quiting: make(chan struct{}), certFile: Options.CertFile, keyFile: Options.KeyFile, } 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(this.zkzone) } metaConf := zkmeta.DefaultConfig() metaConf.Refresh = Options.MetaRefresh meta.Default = zkmeta.New(metaConf, this.zkzone) this.accessLogger = NewAccessLogger("access_log", 100) this.svrMetrics = NewServerMetrics(Options.ReporterInterval, this) rc, err := influxdb.NewConfig(Options.InfluxServer, Options.InfluxDbName, "", "", Options.ReporterInterval) if err != nil { log.Error("telemetry: %v", err) } else { telemetry.Default = influxdb.New(metrics.DefaultRegistry, rc) } // 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(Options.DummyCluster) case "open": cf := manopen.DefaultConfig(Options.Zone) cf.Refresh = Options.ManagerRefresh manager.Default = manopen.New(cf) manager.Default.AllowSubWithUnregisteredGroup(Options.PermitUnregisteredGroup) HttpHeaderAppid = "devid" HttpHeaderPubkey = "devsecret" HttpHeaderSubkey = "devsecret" default: panic("invalid manager store:" + Options.ManagerStore) } // initialize the servers on demand if Options.DebugHttpAddr != "" { this.debugMux = http.NewServeMux() } if Options.ManHttpAddr != "" || Options.ManHttpsAddr != "" { this.manServer = newManServer(Options.ManHttpAddr, Options.ManHttpsAddr, Options.MaxClients, this) } else { panic("manager server must be present") } 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, Options.Debug, Options.DryRun) case "dummy": store.DefaultPubStore = storedummy.NewPubStore(Options.Debug) default: panic("invalid message store") } switch Options.JobStore { case "mysql": var mcc = &config.ConfigMysql{} b, err := this.zkzone.KatewayJobClusterConfig() if err != nil { panic(err) } if err = mcc.From(b); err != nil { panic(err) } jm, err := jobmysql.New(id, mcc) if err != nil { panic(fmt.Errorf("mysql job: %v", err)) } job.Default = jm case "dummy": job.Default = jobdummy.New() default: panic("invalid job store") } // always create hh so that we can turn on/off it online switch Options.HintedHandoffType { case "disk": if len(Options.HintedHandoffDir) == 0 { panic("empty hh dir") } cfg := hhdisk.DefaultConfig() cfg.Dirs = strings.Split(Options.HintedHandoffDir, ",") if err := cfg.Validate(); err != nil { panic(err) } hhdisk.DisableBufio = !Options.HintedHandoffBufio if Options.AuditPub { hhdisk.Auditor = &this.pubServer.auditor } hh.Default = hhdisk.New(cfg) case "dummy": hh.Default = hhdummy.New() default: panic("unkown hinted handoff type") } if Options.FlushHintedOffOnly { meta.Default.Start() log.Trace("meta store[%s] started", meta.Default.Name()) if err = store.DefaultPubStore.Start(); err != nil { panic(err) } log.Trace("pub store[%s] started", store.DefaultPubStore.Name()) hh.Default.FlushInflights() os.Exit(0) } } 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.subServer.closedConnCh, Options.Debug) case "dummy": store.DefaultSubStore = storedummy.NewSubStore(this.subServer.closedConnCh, Options.Debug) default: panic("invalid store") } } 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 }