服务注册封装:
package lib
import (
"context"
"fmt"
"time"
"go.etcd.io/etcd/clientv3"
)
type ServiceRegister struct {
etcdClient *clientv3.Client
leaseID clientv3.LeaseID
}
func NewServiceRegister(endpoints []string) (*ServiceRegister, error) {
cli, err := clientv3.New(clientv3.Config{
Endpoints: endpoints,
DialTimeout: 5 * time.Second,
})
if err != nil {
return nil, err
}
serviceRegister := &ServiceRegister{
etcdClient: cli,
}
return serviceRegister, nil
}
func (sr *ServiceRegister) Register(serviceName, serviceHost string, servicePort uint, refreshSeconds int64) error {
//创建租约
lease, err := sr.etcdClient.Grant(context.Background(), refreshSeconds*3)
if err != nil {
return err
}
sr.leaseID = lease.ID
key := fmt.Sprintf("%s/%s:%d", serviceName, serviceHost, servicePort)
value := fmt.Sprintf("%s:%d", serviceHost, servicePort)
//设置key,value
_, err = sr.etcdClient.Put(context.Background(), key, value, clientv3.WithLease(lease.ID))
if err != nil {
return err
}
//自动续约
keepaliveChan, err := sr.etcdClient.KeepAlive(context.Background(), lease.ID)
if err != nil {
return err
}
str := fmt.Sprintf("注册服务完成,服务名称:%s,服务地址:%s,服务端口:%d", serviceName, serviceHost, servicePort)
fmt.Println(str)
go func() {
for ka := range keepaliveChan {
fmt.Println("续约:", ka.TTL, time.Now())
}
}()
return nil
}
func (sr *ServiceRegister) UnRegister() error {
if _, err := sr.etcdClient.Revoke(context.Background(), sr.leaseID); err != nil {
return err
}
fmt.Println("服务注销")
return sr.etcdClient.Close()
}
测试:
package main
import (
"demo/lib"
"flag"
"log"
"time"
)
func main() {
var host string
var port uint
flag.StringVar(&host, "host", "", "服务ip")
flag.UintVar(&port, "port", 0, "服务端口")
flag.Parse()
cli, err := lib.NewServiceRegister([]string{"127.0.0.1:2379"})
if err != nil {
log.Fatal(err)
}
err = cli.Register("srv/goods", host, port, 5)
if err != nil {
log.Fatal(err)
}
<-time.After(20 * time.Second)
cli.UnRegister()
}
编译,执行:
go build -o register.exe
.\register.exe -host="225.12.6.44" -port="6699"
注册服务完成,服务名称:srv/goods,服务地址:225.12.6.44,服务端口:6699
续约: 15 2022-05-08 13:59:11.1538771 +0800 CST m=+0.025507601
续约: 15 2022-05-08 13:59:16.2294614 +0800 CST m=+5.101091901
续约: 15 2022-05-08 13:59:21.3413826 +0800 CST m=+10.213013101
续约: 15 2022-05-08 13:59:26.4369359 +0800 CST m=+15.308566401
服务注销
关于etcd包引用报错问题,在go.mod中加下面代码:
replace github.com/coreos/bbolt => go.etcd.io/bbolt v1.3.4
replace google.golang.org/grpc => google.golang.org/grpc v1.26.0