以下是一个简单的服务注册与发现的实现,后续会进行慢慢完善一点
服务注册
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))
}