描述
基于etcd实现go程序的服务注册,所看的学习资料均比较简单, 实际中要经过反复测试,自己写了一个先用着,有坑再填.
需求
1. 注册一个服务: 程序启动时
2. 注销服务: a. 程序异常退出时, 自动注销, 有5秒TTL延迟; b. 调用Stop()接口主动注销
3. 健壮性: a.ectd单节点重启, ectd本身支持; b. etcd全部重启后, 能够恢复正常
4. key的格式: 前缀/ip/pid
5. value: 字符串.(可以先转为json, 再转string)
创建etcd客户端
cli, err := clientv3.New(clientv3.Config{
Endpoints: ec.Endpoints,
DialTimeout: 5 * time.Second,
})
if err != nil {
log.Fatal(err)
}
创建Service对象, 包含服务注册
package main
import (
"context"
"errors"
"fmt"
clientv3 "go.etcd.io/etcd/client/v3"
"go.etcd.io/etcd/client/v3/clientv3util"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"net"
"os"
"strings"
"sync"
"test/etcd"
"time"
)
var IP string
var PID int
func init(){
encoderConfig := zap.NewProductionEncoderConfig()
encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
encoder := zapcore.NewConsoleEncoder(encoderConfig)
var clevel zapcore.Level
clevel.Set("debug")
log := zap.New(zapcore.NewCore(encoder, zapcore.AddSync(os.Stdout), clevel))
zap.ReplaceGlobals(log)
IP, _ = GetLocalIP()
PID = os.Getpid()
}
func GetLocalIP() (string,error){
addrs, err := net.</