etcd组件学习2: 服务注册发现的简单实现

80 阅读1分钟

以下是一个简单的服务注册与发现的实现,后续会进行慢慢完善一点

服务注册

package main

import (
   "context"
   "fmt"
   "github.com/coreos/etcd/clientv3"
   "go_assembly/etcd_assembly/conn"
   "net/http"
)

func register(servicename, servicehost string) {
   cli := conn.ConnEtcd()

   ctx := context.Background()
   lease, err := cli.Lease.Grant(ctx, 10)
   if err != nil {
      fmt.Println("租约创建失败")

   }

   _, err = cli.Put(ctx, servicename, servicehost, clientv3.WithLease(lease.ID))
   if err != nil {
      fmt.Println("创建key的租约失败")
      return
   }
   fmt.Println(fmt.Sprintf("服务注册:%s", servicename))
   for {
      // 查看租约信息
      res, err := cli.Lease.TimeToLive(ctx, lease.ID)
      if err != nil {
         fmt.Println("租约信息查看失败")
         return
      }

      // 如果租约时间只有1秒的时候开始续约
      if res.TTL == 1 {
         fmt.Println("续约一次")
         _, err := cli.Lease.KeepAlive(ctx, lease.ID)
         if err != nil {
            return
         }

      }

   }

}

func main() {
   http.HandleFunc("/index", func(w http.ResponseWriter, r *http.Request) {
      w.Write([]byte("这是首页"))
   })

   go register("httpserver", "http://localhost:8080")

   err := http.ListenAndServe(":8080", nil)
   if err != nil {
      fmt.Println(err)
      return
   }

}

服务发现

package main

import (
   "context"
   "fmt"
   "go_assembly/etcd_assembly/conn"
   "io"
   "net/http"
   "net/url"
)

func main() {
   cli := conn.ConnEtcd()

   ctx := context.Background()

   serverAddr := ""
   getResp, _ := cli.Get(ctx, "httpserver")
   if len(getResp.Kvs) != 0 {
      for _, v := range getResp.Kvs {
         serverAddr = string(v.Value)

      }
   }
   // http://localhost:8080/index
   httpRouter, _ := url.JoinPath(serverAddr, "/index")
   res, err := http.Get(httpRouter)
   if err != nil {
      fmt.Println(err)
      return
   }
   defer res.Body.Close()

   resByte, _ := io.ReadAll(res.Body)
   fmt.Println(string(resByte))
}