亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

golang實現簡易的分布式系統方法

2020-04-01 18:52:17
字體:
來源:轉載
供稿:網友

本文介紹了golang實現簡易的分布式系統方法,分享給大家,具體如下:

功能

  • 能夠發送/接收請求和響應
  • 能夠連接到集群
  • 如果無法連接到群集(如果它是第一個節點),則可以作為主節點啟動節點
  • 每個節點有唯一的標識
  • 能夠在節點之間交換json數據包
  • 接受命令行參數中的所有信息(將來在我們系統升級時將會很有用)

源碼

package mainimport (  "fmt"  "strconv"  "time"  "math/rand"  "net"  "flag"  "strings"  "encoding/json")// 節點數據信息type NodeInfo struct {  // 節點ID,通過隨機數生成  NodeId int `json:"nodeId"`  // 節點IP地址  NodeIpAddr string `json:"nodeIpAddr"`  // 節點端口  Port string `json: "port"`}// 將節點數據信息格式化輸出//NodeInfo:{nodeId: 89423,nodeIpAddr: 127.0.0.1/8,port: 8001}func (node *NodeInfo) String() string {  return "NodeInfo:{ nodeId:" + strconv.Itoa(node.NodeId) + ",nodeIpAddr:" + node.NodeIpAddr + ",port:" + node.Port + "}"}/* 添加一個節點到集群的一個請求或者響應的標準格式 */type AddToClusterMessage struct {  // 源節點  Source NodeInfo `json:"source"`  // 目的節點  Dest NodeInfo `json:"dest"`  // 兩個節點連接時發送的消息  Message string `json:"message"`}/* Request/Response 信息格式化輸出 */func (req AddToClusterMessage) String() string {  return "AddToClusterMessage:{/n source:" + req.Source.String() + ",/n dest: " + req.Dest.String() + ",/n message:" + req.Message + " }"}// cat vi go// rmfunc main() {  // 解析命令行參數  makeMasterOnError := flag.Bool("makeMasterOnError", false, "如果IP地址沒有連接到集群中,我們將其作為Master節點.")  clusterip := flag.String("clusterip", "127.0.0.1:8001", "任何的節點連接都連接這個IP")  myport := flag.String("myport", "8001", "ip address to run this node on. default is 8001.")  flag.Parse() //解析  fmt.Println(*makeMasterOnError)  fmt.Println(*clusterip)  fmt.Println(*myport)  /* 為節點生成ID */  rand.Seed(time.Now().UTC().UnixNano()) //種子  myid := rand.Intn(99999999) // 隨機  //fmt.Println(myid)  // 獲取IP地址  myIp,_ := net.InterfaceAddrs()  fmt.Println(myIp[0])  // 創建NodeInfo結構體對象  me := NodeInfo{NodeId: myid, NodeIpAddr: myIp[0].String(), Port: *myport}  // 輸出結構體數據信息  fmt.Println(me.String())  dest := NodeInfo{ NodeId: -1, NodeIpAddr: strings.Split(*clusterip, ":")[0], Port: strings.Split(*clusterip, ":")[1]}  /* 嘗試連接到集群,在已連接的情況下并且向集群發送請求 */  ableToConnect := connectToCluster(me, dest)  /*   * 監聽其他節點將要加入到集群的請求   */  if ableToConnect || (!ableToConnect && *makeMasterOnError) {    if *makeMasterOnError {fmt.Println("Will start this node as master.")}    listenOnPort(me)  } else {    fmt.Println("Quitting system. Set makeMasterOnError flag to make the node master.", myid)  }}/* * 這是發送請求時格式化json包有用的工具 * 這是非常重要的,如果不經過數據格式化,你最終發送的將是空白消息 */func getAddToClusterMessage(source NodeInfo, dest NodeInfo, message string) (AddToClusterMessage){  return AddToClusterMessage{    Source: NodeInfo{      NodeId: source.NodeId,      NodeIpAddr: source.NodeIpAddr,      Port: source.Port,    },    Dest: NodeInfo{      NodeId: dest.NodeId,      NodeIpAddr: dest.NodeIpAddr,      Port: dest.Port,    },    Message: message,  }}func connectToCluster(me NodeInfo, dest NodeInfo) (bool){  /* 連接到socket的相關細節信息 */  connOut, err := net.DialTimeout("tcp", dest.NodeIpAddr + ":" + dest.Port, time.Duration(10) * time.Second)  if err != nil {    if _, ok := err.(net.Error); ok {      fmt.Println("未連接到集群.", me.NodeId)      return false    }  } else {    fmt.Println("連接到集群. 發送消息到節點.")    text := "Hi nody.. 請添加我到集群.."    requestMessage := getAddToClusterMessage(me, dest, text)    json.NewEncoder(connOut).Encode(&requestMessage)    decoder := json.NewDecoder(connOut)    var responseMessage AddToClusterMessage    decoder.Decode(&responseMessage)    fmt.Println("得到數據響應:/n" + responseMessage.String())    return true  }  return false}func listenOnPort(me NodeInfo){  /* 監聽即將到來的消息 */  ln, _ := net.Listen("tcp", fmt.Sprint(":" + me.Port))  /* 接受連接 */  for {    connIn, err := ln.Accept()    if err != nil {      if _, ok := err.(net.Error); ok {        fmt.Println("Error received while listening.", me.NodeId)      }    } else {      var requestMessage AddToClusterMessage      json.NewDecoder(connIn).Decode(&requestMessage)      fmt.Println("Got request:/n" + requestMessage.String())      text := "Sure buddy.. too easy.."      responseMessage := getAddToClusterMessage(me, requestMessage.Source, text)      json.NewEncoder(connIn).Encode(&responseMessage)      connIn.Close()    }  }}

運行程序

/Users/liyuechun/goliyuechun:go yuechunli$ go install mainliyuechun:go yuechunli$ mainMy details: NodeInfo:{ nodeId:53163002, nodeIpAddr:127.0.0.1/8, port:8001 }不能連接到集群. 53163002Quitting system. Set makeMasterOnError flag to make the node master. 53163002liyuechun:go yuechunli$

獲取相關幫助信息

$ ./bin/main -h
liyuechun:go yuechunli$ ./bin/main -hUsage of ./bin/main: -clusterip string    ip address of any node to connnect (default "127.0.0.1:8001") -makeMasterOnError    make this node master if unable to connect to the cluster ip provided. -myport string    ip address to run this node on. default is 8001. (default "8001")liyuechun:go yuechunli$

啟動Node1主節點

$ ./bin/main --makeMasterOnError
liyuechun:go yuechunli$ ./bin/main --makeMasterOnErrorMy details: NodeInfo:{ nodeId:82381143, nodeIpAddr:127.0.0.1/8, port:8001 }未連接到集群. 82381143Will start this node as master.

添加節點Node2到集群

$ ./bin/main --myport 8002 --clusterip 127.0.0.1:8001

添加節點Node3到集群

main --myport 8004 --clusterip 127.0.0.1:8001

添加節點Node4到集群

$ main --myport 8003 --clusterip 127.0.0.1:8002

golang,分布式系統

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美另类在线观看| 伊人伊成久久人综合网站| 国产脚交av在线一区二区| 欧美精品久久一区二区| 一本一本久久a久久精品牛牛影视| 国产精品一区二区久久精品| 国产91在线播放精品91| 久久久精品久久久久| 一色桃子一区二区| 日韩av123| 韩剧1988免费观看全集| 一区二区欧美日韩视频| 亚洲视频视频在线| 国产乱人伦真实精品视频| 亚洲美女精品久久| www国产亚洲精品久久网站| 91成人在线视频| 亚洲一区www| 久久久国产一区| 国产精品久久久久久久久久ktv| 成人福利视频网| 国产精品久久久久高潮| 国产91精品网站| 精品久久久久久久久中文字幕| 亚洲丝袜av一区| 日韩在线观看免费高清| 国产亚洲一区二区在线| 日韩在线精品视频| 97视频在线观看视频免费视频| 日韩网站免费观看| 国产一区二区三区精品久久久| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美最顶级丰满的aⅴ艳星| 日韩av三级在线观看| 欧美成人精品一区| 久久69精品久久久久久久电影好| 精品国产31久久久久久| 亚洲精品久久久久久久久久久| 欧美性猛交xxxx富婆弯腰| 久久久亚洲天堂| 欧美区二区三区| 国产亚洲精品日韩| 91成人天堂久久成人| 91啪国产在线| 在线播放日韩av| 亚洲第一男人天堂| 国产精品一区二区久久国产| 亚洲缚视频在线观看| 国产精品美女久久久久久免费| 欧美麻豆久久久久久中文| 精品国产91久久久久久老师| 日韩精品中文字| 久久综合国产精品台湾中文娱乐网| 亚洲欧美国产制服动漫| 亚洲欧美综合区自拍另类| 久久福利网址导航| 日韩欧美国产黄色| 久久国内精品一国内精品| 国产精品27p| 国产精自产拍久久久久久蜜| 欧美老女人xx| 精品视频中文字幕| 亚洲精品自在久久| 97国产成人精品视频| 久久99精品国产99久久6尤物| 欧美一级高清免费| 亚洲欧美国产制服动漫| 国产精品精品一区二区三区午夜版| 神马久久桃色视频| 久久精品成人欧美大片| 欧美激情国产日韩精品一区18| 影音先锋日韩有码| 91成人性视频| 97国产精品视频| 国产精品欧美激情在线播放| 欧美日韩综合视频| 久热爱精品视频线路一| 中文字幕精品视频| 国产成人精品网站| 国产一区二区在线播放| 一区二区三区视频免费| 亚洲黄色成人网| 日韩av在线一区| 97婷婷涩涩精品一区| 91精品国产高清自在线看超| 色在人av网站天堂精品| 欧美日韩亚洲国产一区| 成人久久18免费网站图片| 日韩有码视频在线| 亚洲精品suv精品一区二区| 久久99热这里只有精品国产| 2018日韩中文字幕| 成人深夜直播免费观看| 欧美精品免费播放| 91av在线免费观看视频| 国产成人精品一区二区三区| 日韩欧美精品中文字幕| 欲色天天网综合久久| 97久久精品人人澡人人爽缅北| 国产精品视频网站| 国产精品三级美女白浆呻吟| 亚洲欧洲在线免费| 91精品国产自产在线老师啪| 成人免费在线视频网址| 韩国三级日本三级少妇99| 国产精品高精视频免费| 欧美精品18videosex性欧美| 久久久久久久激情视频| 精品国产乱码久久久久久婷婷| 一区二区三区在线播放欧美| 日韩欧美福利视频| 成人有码在线视频| 国产精品视频精品| 九九热最新视频//这里只有精品| 国产精品白嫩初高中害羞小美女| 亚洲欧美日韩久久久久久| 久久亚洲精品视频| 欲色天天网综合久久| 国产精品女人久久久久久| 国产伦精品免费视频| 国产精品福利在线观看| 亚洲影院在线看| 亚洲第一av网| 欧美视频第一页| 最近的2019中文字幕免费一页| 欧美丰满老妇厨房牲生活| 国产欧洲精品视频| 欧美黑人视频一区| 国产69精品久久久久9| 91精品视频免费看| 精品女厕一区二区三区| 欧美精品精品精品精品免费| 国产一区二区av| 高清在线视频日韩欧美| 欧美美女操人视频| 欧美亚洲在线播放| 久久久久久久久久婷婷| 久久精品国产一区二区电影| 亚洲国产一区二区三区在线观看| 国产精品jizz在线观看麻豆| 欧美日韩综合视频| 国产福利视频一区二区| 亚洲国产欧美一区| 欧美一区亚洲一区| 欧美风情在线观看| 欧美黑人一区二区三区| 91精品一区二区| 国产精品流白浆视频| 亚洲天堂开心观看| 国产精品美女www爽爽爽视频| 欧美黑人性生活视频| 97视频在线观看播放| 欧美激情国产精品| 中文字幕日韩精品在线观看| 欧美做受高潮电影o| 伊人久久久久久久久久久久久| 亚洲一区美女视频在线观看免费| 欧美日韩亚洲视频| 日韩电影在线观看永久视频免费网站| 国产美女91呻吟求| 欧美一级免费视频| 97精品一区二区视频在线观看| 一本色道久久88综合亚洲精品ⅰ| 欧美日韩国产色视频|