func runServer(c *cli.Context) { var rp reverseproxy.ReverseProxy switch c.String("engine") { case "native": rp = &reverseproxy.NativeReverseProxy{} case "fasthttp": rp = &reverseproxy.FastReverseProxy{} default: log.Fatal(errors.New("invalid engine")) } readOpts := backend.RedisOptions{ Host: c.String("read-redis-host"), Port: c.Int("read-redis-port"), SentinelAddrs: c.String("read-redis-sentinel-addrs"), SentinelName: c.String("read-redis-sentinel-name"), Password: c.String("read-redis-password"), DB: c.Int("read-redis-db"), } writeOpts := backend.RedisOptions{ Host: c.String("write-redis-host"), Port: c.Int("write-redis-port"), SentinelAddrs: c.String("write-redis-sentinel-addrs"), SentinelName: c.String("write-redis-sentinel-name"), Password: c.String("write-redis-password"), DB: c.Int("write-redis-db"), } routesBE, err := backend.NewRedisBackend(readOpts, writeOpts) if err != nil { log.Fatal(err) } if c.Bool("active-healthcheck") { err = routesBE.StartMonitor() if err != nil { log.Fatal(err) } } r := router.Router{ Backend: routesBE, LogPath: c.String("access-log"), DeadBackendTTL: c.Int("dead-backend-time"), } err = r.Init() if err != nil { log.Fatal(err) } addr, err := rp.Initialize(reverseproxy.ReverseProxyConfig{ Listen: c.String("listen"), Router: &r, RequestIDHeader: c.String("request-id-header"), FlushInterval: time.Duration(c.Int("flush-interval")) * time.Millisecond, DialTimeout: time.Duration(c.Int("dial-timeout")) * time.Second, RequestTimeout: time.Duration(c.Int("request-timeout")) * time.Second, }) handleSignals(rp) log.Printf("Listening on %s...\n", addr) rp.Listen() r.Stop() routesBE.StopMonitor() }