- service.go文件
package util
import (
"context"
"fmt"
"github.com/coreos/etcd/clientv3"
"time"
)
type Service struct {
client *clientv3.Client
}
func NewService() *Service {
config:=clientv3.Config{
Endpoints:[]string{
"192.168.56.30:23791","192.168.56.30:23792"},
DialTimeout:10*time.Second,
}
client,_:=clientv3.New(config)
return &Service{
client:client}
}
func(this *Service) RegService(id string,name string,address string) error {
kv:=clientv3.NewKV(this.client)
key_prefix:="/services/"
ctx:=context.Background()
lease:=clientv3.NewLease(this.client)
leaseRes,err:=lease.Grant(ctx,60)
if err!=nil{
return err
}
_,err=kv.Put(ctx,key_prefix+id+"/"+name,address,clientv3.WithLease(leaseRes.ID))
if err!=nil{
return err
}
keepaliveRes,err := lease.KeepAlive(context.TODO(),leaseRes.ID)
if err!=nil{
return err
}
go lisKeepAlive(keepaliveRes)
return nil
}
func lisKeepAlive(keepaliveRes <-chan *clientv3.LeaseKeepAliveResponse) {
for{
select {
case ret:=<-keepaliveRes:
if ret!=nil{
fmt.Println("续租成功",time.Now())
}
}
}
}
func(this *Service) UnregService(id string) error {
kv:=clientv3.NewKV(this.client)
key_prefix:="/services/"+id
_,err:=kv.Delete(context.Background(),key_prefix,clientv3.WithPrefix())
return err
}
- p1.go
package main
import (
"context"
"fmt"
"github.com/gorilla/mux"
"goetcd/util"
"log"
"net/http"
"os"
"os/signal"
"strconv"
"syscall"
)
func main() {
router:=mux.NewRouter()
router.HandleFunc("/product/{id:\\d+}", func(writer http.ResponseWriter, request *http.Request) {
vars:=mux.Vars(request)
str:="get product ByID:"+vars["id"]
writer.Write([]byte(str))
})
service:=util.NewService()
serviceID:="p1"
serviceName:="productservice"
serviceAddr:="192.168.16.30"
servicePort:=8081
errChan:=make(chan error)
httpServer:=&http.Server{
Addr:":"+strconv.Itoa(servicePort),
Handler:router,
}
go(func() {
err:=service.RegService(serviceID,serviceName,serviceAddr+":"+strconv.Itoa(servicePort))
if err!=nil{
errChan<-err
return
}
err=httpServer.ListenAndServe()
if err!=nil{
errChan<-err
return
}
})()
go(func(){
sig:=make(chan os.Signal)
signal.Notify(sig,syscall.SIGINT,syscall.SIGTERM)
errChan<-fmt.Errorf("%s",<-sig)
})()
getErr:=<-errChan
err:=service.UnregService(serviceID)
if err!=nil{
fmt.Println(err)
}
err=httpServer.Shutdown(context.Background())
if err!=nil{
log.Fatal(err)
}
log.Fatal(getErr)
}
- 启用p1.go, 进入etcd容器,获取键值成功
/usr/bin
/services/p1/productservice
192.168.16.30:8081