feat app 模块化启动
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/spf13/viper"
|
||||
"strings"
|
||||
@@ -28,11 +29,14 @@ func LoadConfig[T any](configDir string, configPtr *T) (*T, error) {
|
||||
v.SetConfigType("yaml")
|
||||
|
||||
if err := v.ReadInConfig(); err != nil {
|
||||
return nil, fmt.Errorf("读取配置失败: %w", err)
|
||||
return nil, fmt.Errorf("failed to read config: %w", err)
|
||||
}
|
||||
|
||||
if err := v.Unmarshal(&configPtr); err != nil {
|
||||
return nil, fmt.Errorf("解析配置失败: %w", err)
|
||||
return nil, fmt.Errorf("failed to unmarshal config: %w", err)
|
||||
}
|
||||
|
||||
marshal, _ := json.Marshal(configPtr)
|
||||
fmt.Printf("Configuration loading completed: %v\n", string(marshal))
|
||||
return configPtr, nil
|
||||
}
|
||||
|
||||
@@ -1,28 +1,77 @@
|
||||
package etcd
|
||||
|
||||
import (
|
||||
"context"
|
||||
"go.etcd.io/etcd/client/v3"
|
||||
"go.uber.org/zap"
|
||||
"time"
|
||||
)
|
||||
|
||||
var cli *clientv3.Client
|
||||
var instance *Client
|
||||
|
||||
type Client struct {
|
||||
cli *clientv3.Client
|
||||
log *zap.Logger
|
||||
}
|
||||
|
||||
// Init 初始化
|
||||
func Init(endpoints []string) error {
|
||||
client, err := clientv3.New(clientv3.Config{
|
||||
Endpoints: endpoints,
|
||||
DialTimeout: 5 * time.Second,
|
||||
})
|
||||
cli = client
|
||||
instance = &Client{
|
||||
cli: client,
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func Client() *clientv3.Client {
|
||||
return cli
|
||||
}
|
||||
|
||||
// Close 关闭
|
||||
func Close() error {
|
||||
if cli != nil {
|
||||
return cli.Close()
|
||||
if instance != nil && instance.cli != nil {
|
||||
return instance.cli.Close()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetClient() *Client {
|
||||
return instance
|
||||
}
|
||||
|
||||
// Get 获取数据
|
||||
func (c *Client) Get(key string, opts ...clientv3.OpOption) (*clientv3.GetResponse, error) {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
|
||||
defer cancel()
|
||||
return c.cli.Get(ctx, key, opts...)
|
||||
}
|
||||
|
||||
// Put 创建数据
|
||||
func (c *Client) Put(key, val string, opts ...clientv3.OpOption) (*clientv3.PutResponse, error) {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
|
||||
defer cancel()
|
||||
return c.cli.Put(ctx, key, val, opts...)
|
||||
}
|
||||
|
||||
// Grant 创建租约
|
||||
func (c *Client) Grant(ttl int64) (*clientv3.LeaseGrantResponse, error) {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
|
||||
defer cancel()
|
||||
return c.cli.Grant(ctx, ttl)
|
||||
}
|
||||
|
||||
// KeepAlive 保活租约
|
||||
func (c *Client) KeepAlive(id clientv3.LeaseID) (<-chan *clientv3.LeaseKeepAliveResponse, error) {
|
||||
return c.cli.KeepAlive(context.Background(), id)
|
||||
}
|
||||
|
||||
// Revoke 撤销租约
|
||||
func (c *Client) Revoke(id clientv3.LeaseID) (*clientv3.LeaseRevokeResponse, error) {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
|
||||
defer cancel()
|
||||
return c.cli.Revoke(ctx, id)
|
||||
}
|
||||
|
||||
// Watch 监听数据
|
||||
func (c *Client) Watch(key string, opts ...clientv3.OpOption) clientv3.WatchChan {
|
||||
return c.cli.Watch(context.Background(), key, opts...)
|
||||
}
|
||||
|
||||
@@ -3,27 +3,23 @@ package common
|
||||
import (
|
||||
"common/db/etcd"
|
||||
"common/log"
|
||||
"context"
|
||||
clientv3 "go.etcd.io/etcd/client/v3"
|
||||
)
|
||||
|
||||
// NewLeaseAndKeepAlive 创建租约并保活
|
||||
func NewLeaseAndKeepAlive(ttl int64) (clientv3.LeaseID, error) {
|
||||
lease, err := etcd.Client().Grant(context.Background(), ttl)
|
||||
lease, err := etcd.GetClient().Grant(ttl)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
chKeepAlive, err := etcd.Client().KeepAlive(context.Background(), lease.ID)
|
||||
chKeepAlive, err := etcd.GetClient().KeepAlive(lease.ID)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
go func() {
|
||||
for r := range chKeepAlive {
|
||||
if r == nil {
|
||||
log.Errorf("lease timeout!")
|
||||
return
|
||||
}
|
||||
go func(leaseID clientv3.LeaseID) {
|
||||
for range chKeepAlive {
|
||||
}
|
||||
}()
|
||||
log.Warnf("Lease %x expired or revoked", leaseID)
|
||||
}(lease.ID)
|
||||
return lease.ID, nil
|
||||
}
|
||||
|
||||
@@ -4,7 +4,6 @@ import (
|
||||
"common/db/etcd"
|
||||
"common/discover/common"
|
||||
"common/log"
|
||||
"context"
|
||||
"fmt"
|
||||
clientv3 "go.etcd.io/etcd/client/v3"
|
||||
"strconv"
|
||||
@@ -42,7 +41,7 @@ func RegisterInstance(sid int64, instanceID int, uniqueNo, ttl int64) error {
|
||||
return err
|
||||
}
|
||||
key := fmt.Sprintf("%v/%v/%v", common.KeyDiscoverInstance, instanceID, uniqueNo)
|
||||
_, err = etcd.Client().Put(context.Background(), key, strconv.Itoa(int(sid)), clientv3.WithLease(leaseID))
|
||||
_, err = etcd.GetClient().Put(key, strconv.Itoa(int(sid)), clientv3.WithLease(leaseID))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -55,7 +54,7 @@ func UnRegisterInstance(uniqueNo int64) {
|
||||
serverMU.Lock()
|
||||
defer serverMU.Unlock()
|
||||
if leaseID, ok := instanceLeaseM[uniqueNo]; ok {
|
||||
_, err := etcd.Client().Revoke(context.Background(), leaseID)
|
||||
_, err := etcd.GetClient().Revoke(leaseID)
|
||||
if err != nil {
|
||||
log.Errorf("UnRegisterInstance err: %v", err)
|
||||
}
|
||||
|
||||
@@ -3,8 +3,10 @@ package discover
|
||||
import (
|
||||
"common/db/etcd"
|
||||
"common/discover/common"
|
||||
"common/log"
|
||||
"common/utils"
|
||||
"context"
|
||||
"fmt"
|
||||
"go.etcd.io/etcd/api/v3/mvccpb"
|
||||
clientv3 "go.etcd.io/etcd/client/v3"
|
||||
"strconv"
|
||||
@@ -46,18 +48,19 @@ func Listen() {
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
log.Infof(fmt.Sprintf("Discover start listen..."))
|
||||
// 服务
|
||||
serviceAll, _ := etcd.Client().Get(stopCtx, common.KeyDiscoverService, clientv3.WithPrefix())
|
||||
serviceAll, _ := etcd.GetClient().Get(common.KeyDiscoverService, clientv3.WithPrefix())
|
||||
for _, kv := range serviceAll.Kvs {
|
||||
onServerChange(clientv3.EventTypePut, string(kv.Key), string(kv.Value))
|
||||
}
|
||||
chService := etcd.Client().Watch(stopCtx, common.KeyDiscoverService, clientv3.WithPrefix(), clientv3.WithRev(serviceAll.Header.Revision+1))
|
||||
chService := etcd.GetClient().Watch(common.KeyDiscoverService, clientv3.WithPrefix(), clientv3.WithRev(serviceAll.Header.Revision+1))
|
||||
// 副本
|
||||
instanceAll, _ := etcd.Client().Get(stopCtx, common.KeyDiscoverInstance, clientv3.WithPrefix())
|
||||
instanceAll, _ := etcd.GetClient().Get(common.KeyDiscoverInstance, clientv3.WithPrefix())
|
||||
for _, kv := range instanceAll.Kvs {
|
||||
onInstanceChange(clientv3.EventTypePut, string(kv.Key), string(kv.Value), nil)
|
||||
}
|
||||
chInstance := etcd.Client().Watch(stopCtx, common.KeyDiscoverScene, clientv3.WithPrefix(), clientv3.WithRev(instanceAll.Header.Revision+1), clientv3.WithPrevKV())
|
||||
chInstance := etcd.GetClient().Watch(common.KeyDiscoverScene, clientv3.WithPrefix(), clientv3.WithRev(instanceAll.Header.Revision+1), clientv3.WithPrevKV())
|
||||
for {
|
||||
select {
|
||||
case msg := <-chService:
|
||||
|
||||
@@ -5,7 +5,6 @@ import (
|
||||
"common/discover/common"
|
||||
"common/log"
|
||||
"common/net/grpc/grpc_conn"
|
||||
"context"
|
||||
"fmt"
|
||||
clientv3 "go.etcd.io/etcd/client/v3"
|
||||
"google.golang.org/grpc"
|
||||
@@ -51,7 +50,7 @@ func RegisterGrpcServer(target string, sid int64, addr string, ttl int64) error
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = etcd.Client().Put(context.Background(), fmt.Sprintf("%v/%v", target, sid), addr, clientv3.WithLease(leaseID))
|
||||
_, err = etcd.GetClient().Put(fmt.Sprintf("%v/%v", target, sid), addr, clientv3.WithLease(leaseID))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -64,7 +63,7 @@ func UnRegisterGrpcServer(sid int64) {
|
||||
serverMU.Lock()
|
||||
defer serverMU.Unlock()
|
||||
if leaseID, ok := serverLeaseM[sid]; ok {
|
||||
_, err := etcd.Client().Revoke(context.Background(), leaseID)
|
||||
_, err := etcd.GetClient().Revoke(leaseID)
|
||||
if err != nil {
|
||||
log.Errorf("server.go UnRegisterGrpcServer err: %v", err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user