<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                簡單的分布式server 目前分布式系統已經很流行了,一些開源框架也被廣泛應用,如dubbo、Motan等。對于一個分布式服務,最基本的一項功能就是服務的注冊和發現,而利用zk的EPHEMERAL節點則可以很方便的實現該功能。EPHEMERAL節點正如其名,是臨時性的,其生命周期是和客戶端會話綁定的,當會話連接斷開時,節點也會被刪除。下邊我們就來實現一個簡單的分布式server: server: 服務啟動時,創建zk連接,并在go_servers節點下創建一個新節點,節點名為"ip:port",完成服務注冊 服務結束時,由于連接斷開,創建的節點會被刪除,這樣client就不會連到該節點 client: 先從zk獲取go_servers節點下所有子節點,這樣就拿到了所有注冊的server 從server列表中選中一個節點(這里只是隨機選取,實際服務一般會提供多種策略),創建連接進行通信 這里為了演示,我們每次client連接server,獲取server發送的時間后就斷開。主要代碼如下: server.go ~~~ package main import ( "fmt" "net" "os" "time" "github.com/samuel/go-zookeeper/zk" ) func main() { go starServer("127.0.0.1:8897") go starServer("127.0.0.1:8898") go starServer("127.0.0.1:8899") a := make(chan bool, 1) <-a } func checkError(err error) { if err != nil { fmt.Println(err) } } func starServer(port string) { tcpAddr, err := net.ResolveTCPAddr("tcp4", port) fmt.Println(tcpAddr) checkError(err) listener, err := net.ListenTCP("tcp", tcpAddr) checkError(err) //注冊zk節點q // 鏈接zk conn, err := GetConnect() if err != nil { fmt.Printf(" connect zk error: %s ", err) } defer conn.Close() // zk節點注冊 err = RegistServer(conn, port) if err != nil { fmt.Printf(" regist node error: %s ", err) } for { conn, err := listener.Accept() if err != nil { fmt.Fprintf(os.Stderr, "Error: %s", err) continue } go handleCient(conn, port) } fmt.Println("aaaaaa") } func handleCient(conn net.Conn, port string) { defer conn.Close() daytime := time.Now().String() conn.Write([]byte(port + ": " + daytime)) } func GetConnect() (conn *zk.Conn, err error) { zkList := []string{"localhost:2181"} conn, _, err = zk.Connect(zkList, 10*time.Second) if err != nil { fmt.Println(err) } return } func RegistServer(conn *zk.Conn, host string) (err error) { _, err = conn.Create("/go_servers/"+host, nil, zk.FlagEphemeral, zk.WorldACL(zk.PermAll)) return } func GetServerList(conn *zk.Conn) (list []string, err error) { list, _, err = conn.Children("/go_servers") return } ~~~ client.go ~~~ package main import ( "errors" "fmt" "io/ioutil" "math/rand" "net" "time" "github.com/samuel/go-zookeeper/zk" ) func checkError(err error) { if err != nil { fmt.Println(err) } } func main() { for i := 0; i < 100; i++ { startClient() time.Sleep(1 * time.Second) } } func startClient() { // service := "127.0.0.1:8899" //獲取地址 serverHost, err := getServerHost() if err != nil { fmt.Printf("get server host fail: %s \n", err) return } fmt.Println("connect host: " + serverHost) tcpAddr, err := net.ResolveTCPAddr("tcp4", serverHost) checkError(err) conn, err := net.DialTCP("tcp", nil, tcpAddr) checkError(err) defer conn.Close() _, err = conn.Write([]byte("timestamp")) checkError(err) result, err := ioutil.ReadAll(conn) checkError(err) fmt.Println(string(result)) return } func getServerHost() (host string, err error) { conn, err := GetConnect() if err != nil { fmt.Printf(" connect zk error: %s \n ", err) return } defer conn.Close() serverList, err := GetServerList(conn) if err != nil { fmt.Printf(" get server list error: %s \n", err) return } count := len(serverList) if count == 0 { err = errors.New("server list is empty \n") return } //隨機選中一個返回 r := rand.New(rand.NewSource(time.Now().UnixNano())) host = serverList[r.Intn(3)] return } func GetConnect() (conn *zk.Conn, err error) { zkList := []string{"localhost:2181"} conn, _, err = zk.Connect(zkList, 10*time.Second) if err != nil { fmt.Println(err) } return } func GetServerList(conn *zk.Conn) (list []string, err error) { list, _, err = conn.Children("/go_servers") return } ~~~ 先啟動server,可以看到有三個節點注冊到zk: ~~~ 127.0.0.1:8897 127.0.0.1:8899 127.0.0.1:8898 2018/08/27 14:04:58 Connected to 127.0.0.1:2181 2018/08/27 14:04:58 Connected to 127.0.0.1:2181 2018/08/27 14:04:58 Connected to 127.0.0.1:2181 2018/08/27 14:04:58 Authenticated: id=100619932030205976, timeout=10000 2018/08/27 14:04:58 Re-submitting `0` credentials after reconnect 2018/08/27 14:04:58 Authenticated: id=100619932030205977, timeout=10000 2018/08/27 14:04:58 Re-submitting `0` credentials after reconnect 2018/08/27 14:04:58 Authenticated: id=100619932030205978, timeout=10000 2018/08/27 14:04:58 Re-submitting `0` credentials after reconnect ~~~ 啟動client,可以看到每次client都會隨機連接到一個節點進行通信: ~~~ 2018/08/27 14:05:21 Connected to 127.0.0.1:2181 2018/08/27 14:05:21 Authenticated: id=100619932030205979, timeout=10000 2018/08/27 14:05:21 Re-submitting `0` credentials after reconnect 2018/08/27 14:05:21 Recv loop terminated: err=EOF connect host: 127.0.0.1:8899 2018/08/27 14:05:21 Send loop terminated: err=<nil> read tcp 127.0.0.1:54062->127.0.0.1:8899: read: connection reset by peer 127.0.0.1:8899: 2018-08-27 14:05:21.291641 +0800 CST m=+22.480149656 2018/08/27 14:05:22 Connected to [::1]:2181 2018/08/27 14:05:22 Authenticated: id=100619932030205980, timeout=10000 2018/08/27 14:05:22 Re-submitting `0` credentials after reconnect 2018/08/27 14:05:22 Recv loop terminated: err=EOF 2018/08/27 14:05:22 Send loop terminated: err=<nil> connect host: 127.0.0.1:8897 read tcp 127.0.0.1:54064->127.0.0.1:8897: read: connection reset by peer 127.0.0.1:8897: 2018-08-27 14:05:22.302322 +0800 CST m=+23.490801385 2018/08/27 14:05:23 Connected to 127.0.0.1:2181 2018/08/27 14:05:23 Authenticated: id=100619932030205981, timeout=10000 2018/08/27 14:05:23 Re-submitting `0` credentials after reconnect 2018/08/27 14:05:23 Recv loop terminated: err=EOF 2018/08/27 14:05:23 Send loop terminated: err=<nil> connect host: 127.0.0.1:8897 read tcp 127.0.0.1:54070->127.0.0.1:8897: read: connection reset by peer 127.0.0.1:8897: 2018-08-27 14:05:23.312873 +0800 CST m=+24.501324228 2018/08/27 14:05:24 Connected to 127.0.0.1:2181 2018/08/27 14:05:24 Authenticated: id=100619932030205982, timeout=10000 2018/08/27 14:05:24 Re-submitting `0` credentials after reconnect 2018/08/27 14:05:24 Recv loop terminated: err=EOF connect host: 127.0.0.1:8899 2018/08/27 14:05:24 Send loop terminated: err=<nil> read tcp 127.0.0.1:54072->127.0.0.1:8899: read: connection reset by peer 127.0.0.1:8899: 2018-08-27 14:05:24.323668 +0800 CST m=+25.512090155 2018/08/27 14:05:25 Connected to 127.0.0.1:2181 2018/08/27 14:05:25 Authenticated: id=100619932030205983, timeout=10000 2018/08/27 14:05:25 Re-submitting `0` credentials after reconnect 2018/08/27 14:05:25 Recv loop terminated: err=EOF 2018/08/27 14:05:25 Send loop terminated: err=<nil> connect host: 127.0.0.1:8897 read tcp 127.0.0.1:54074->127.0.0.1:8897: read: connection reset by peer 127.0.0.1:8897: 2018-08-27 14:05:25.330257 +0800 CST m=+26.518650566 2018/08/27 14:05:26 Connected to [::1]:2181 2018/08/27 14:05:26 Authenticated: id=100619932030205984, timeout=10000 2018/08/27 14:05:26 Re-submitting `0` credentials after reconnect 2018/08/27 14:05:26 Recv loop terminated: err=EOF 2018/08/27 14:05:26 Send loop terminated: err=<nil> connect host: 127.0.0.1:8897 read tcp 127.0.0.1:54080->127.0.0.1:8897: read: connection reset by peer 127.0.0.1:8897: 2018-08-27 14:05:26.357251 +0800 CST m=+27.545614616 2018/08/27 14:05:27 Connected to 127.0.0.1:2181 2018/08/27 14:05:27 Authenticated: id=100619932030205985, timeout=10000 2018/08/27 14:05:27 Re-submitting `0` credentials after reconnect connect host: 127.0.0.1:8899 2018/08/27 14:05:27 Recv loop terminated: err=EOF 2018/08/27 14:05:27 Send loop terminated: err=<nil> read tcp 127.0.0.1:54082->127.0.0.1:8899: read: connection reset by peer 127.0.0.1:8899: 2018-08-27 14:05:27.369096 +0800 CST m=+28.557430764 2018/08/27 14:05:28 Connected to [::1]:2181 2018/08/27 14:05:28 Authenticated: id=100619932030205986, timeout=10000 2018/08/27 14:05:28 Re-submitting `0` credentials after reconnect 2018/08/27 14:05:28 Recv loop terminated: err=EOF 2018/08/27 14:05:28 Send loop terminated: err=<nil> connect host: 127.0.0.1:8898 read tcp 127.0.0.1:54084->127.0.0.1:8898: read: connection reset by peer 127.0.0.1:8898: 2018-08-27 14:05:28.380455 +0800 CST m=+29.568760988 ...... ~~~ 至此,我們的分布式server就實現了
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看