// startProxy launches an HTTP proxy for client communication which proxies to other etcd nodes. func startProxy() { pt, err := transport.NewTransport(clientTLSInfo) if err != nil { log.Fatal(err) } ph, err := proxy.NewHandler(pt, (*cluster).PeerURLs()) if err != nil { log.Fatal(err) } ph = &pkg.CORSHandler{ Handler: ph, Info: cors, } if string(*proxyFlag) == flagtypes.ProxyValueReadonly { ph = proxy.NewReadonlyHandler(ph) } lcurls, err := pkg.URLsFromFlags(flag.CommandLine, "listen-client-urls", "bind-addr", clientTLSInfo) if err != nil { log.Fatal(err.Error()) } // Start a proxy server goroutine for each listen address for _, u := range lcurls { l, err := transport.NewListener(u.Host, clientTLSInfo) if err != nil { log.Fatal(err) } host := u.Host go func() { log.Print("Listening for client requests on ", host) log.Fatal(http.Serve(l, ph)) }() } }
// startEtcd launches the etcd server and HTTP handlers for client/server communication. func startEtcd() { self := cluster.FindName(*name) if self == nil { log.Fatalf("etcd: no member with name=%q exists", *name) } if self.ID == raft.None { log.Fatalf("etcd: cannot use None(%d) as member id", raft.None) } if *dir == "" { *dir = fmt.Sprintf("%v_etcd_data", self.ID) log.Printf("main: no data-dir provided, using default data-dir ./%s", *dir) } if err := os.MkdirAll(*dir, privateDirMode); err != nil { log.Fatalf("main: cannot create data directory: %v", err) } pt, err := transport.NewTransport(peerTLSInfo) if err != nil { log.Fatal(err) } acurls, err := pkg.URLsFromFlags(flag.CommandLine, "advertise-client-urls", "addr", clientTLSInfo) if err != nil { log.Fatal(err.Error()) } cfg := &etcdserver.ServerConfig{ Name: *name, ClientURLs: acurls, DataDir: *dir, SnapCount: int64(*snapCount), Cluster: cluster, Transport: pt, } s := etcdserver.NewServer(cfg) s.Start() ch := &pkg.CORSHandler{ Handler: etcdhttp.NewClientHandler(s), Info: cors, } ph := etcdhttp.NewPeerHandler(s) lpurls, err := pkg.URLsFromFlags(flag.CommandLine, "listen-peer-urls", "peer-bind-addr", peerTLSInfo) if err != nil { log.Fatal(err.Error()) } for _, u := range lpurls { l, err := transport.NewListener(u.Host, peerTLSInfo) if err != nil { log.Fatal(err) } // Start the peer server in a goroutine urlStr := u.String() go func() { log.Print("Listening for peers on ", urlStr) log.Fatal(http.Serve(l, ph)) }() } lcurls, err := pkg.URLsFromFlags(flag.CommandLine, "listen-client-urls", "bind-addr", clientTLSInfo) if err != nil { log.Fatal(err.Error()) } // Start a client server goroutine for each listen address for _, u := range lcurls { l, err := transport.NewListener(u.Host, clientTLSInfo) if err != nil { log.Fatal(err) } urlStr := u.String() go func() { log.Print("Listening for client requests on ", urlStr) log.Fatal(http.Serve(l, ch)) }() } }