• 服务关闭时注册和反注册


    实现部分

    package util
    
    import (
        "context"
        "fmt"
        "go.etcd.io/etcd/clientv3"
        "time"
    )
    
    type Service struct {
        client *clientv3.Client
    }
    
    func NewService() *Service {
        config := clientv3.Config{
            Endpoints:   []string{"106.12.72.181:23791", "106.12.72.181:23792"},
            DialTimeout: 10 * time.Second,
        }
        client, _ := clientv3.New(config)
        return &Service{client: client}
    }
    //注册服务
    func (this *Service) RegService(id string, name string, address string) error {
        fmt.Println(22)
        kv := clientv3.NewKV(this.client)
        key_prefix := "/services/"
        _, err := kv.Put(context.Background(), key_prefix+id+"/"+name, address)
        fmt.Println(err)
        return err
    }
    
    //反注册服务
    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())
        fmt.Println(err)
        return err
    }
    

    执行部分

    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))
        })
        serviceID := "p1"
        serviceName := "productservice"
        serviceAddr := "localhost:"
        servicePort := 8081
    
        s := util.NewService()
        errChan := make(chan error)
        httpServer := &http.Server{
            Addr:    serviceAddr + strconv.Itoa(servicePort),
            Handler: router, //router实现了ServeHttp方法,所以是Handler接口类型
        }
        go func() {
            err := s.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 := s.UnregService(serviceID) //执行反注册,unset该服务的key
        err = httpServer.Shutdown(context.Background())
        //可以执行一些回收工作,比如关闭数据库
        if err != nil {
            log.Fatal(err)
        }
        log.Fatal(getErr)
    }
    




  • 相关阅读:
    JavaWeb工程中url地址的写法
    java.lang.NoClassDefFoundError
    {"aa":null} 如何能转化为 {"aa":{}}
    IDEA遇到项目包后面出现% classes,% lines covered该怎么解决
    union all 关键字的应用(合并两个查询结果集到同一个结果集)
    IDEA中的,让光标回到上一次停留的地方
    克隆指定的分支:git clone -b 分支名仓库地址
    转载:再难也要向前爬-唐雅薇
    MacBook Pro 新手入门
    转载:不是书评 :《我是一只IT小小鸟》
  • 原文地址:https://www.cnblogs.com/hualou/p/12071077.html
Copyright © 2020-2023  润新知