1. 程式人生 > 程式設計 >golang對etcd存取和數值監測的實現

golang對etcd存取和數值監測的實現

測試程式碼如下

package main

import (
  "fmt"
  "log"
  "time"

  "go.etcd.io/etcd/clientv3"
  "golang.org/x/net/context"
)

var (
  dialTimeout  = 5 * time.Second
  requestTimeout = 2 * time.Second
  endpoints   = []string{"192.168.99.106:2379","192.168.99.107:2379","192.168.99.108:2379"}
)

func main() {
  cli,err := clientv3.New(clientv3.Config{
    Endpoints:  endpoints,DialTimeout: dialTimeout,})

  if err != nil {
    log.Fatal(err)
  }

  defer cli.Close()

  key1,value1 := "testkey1","value"

  ctx,cancel := context.WithTimeout(context.Background(),requestTimeout)
  _,err = cli.Put(ctx,key1,value1)
  cancel()
  if err != nil {
    log.Println("Put failed. ",err)
  } else {
    log.Printf("Put {%s:%s} succeed\n",value1)
  }

  ctx,cancel = context.WithTimeout(context.Background(),requestTimeout)
  resp,err := cli.Get(ctx,key1)
  cancel()
  if err != nil {
    log.Println("Get failed. ",err)
    return
  }

  for _,kv := range resp.Kvs {
    log.Printf("Get {%s:%s} \n",kv.Key,kv.Value)
  }

  done := make(chan bool)

  go func() {
    wch := cli.Watch(context.Background(),key1)

    for item := range wch {
      for _,ev := range item.Events {
        log.Printf("Type:%s,key:%s,value:%s\n",ev.Type,ev.Kv.Key,ev.Kv.Value)
      }
    }
  }()

  go func() {
    for cnt := 0; cnt < 11; cnt++ {
      value := fmt.Sprintf("%s%d","value",cnt)
      _,err = cli.Put(context.Background(),value)
      if err != nil {
        log.Println("Put failed. ",err)
      } else {
        log.Printf("Put {%s:%s} succeed\n",value)
      }
    }
  }()

  <-done

  log.Println("Done!")
}

測試結果如下

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。