From a2fc80381946b071cc0ffdb667d1be9d3c2e537e Mon Sep 17 00:00:00 2001 From: mayiming <1627832236@qq.com> Date: Fri, 15 Aug 2025 03:54:09 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A1=B9=E7=9B=AEmain?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.go | 169 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 main.go diff --git a/main.go b/main.go new file mode 100644 index 0000000..f8628af --- /dev/null +++ b/main.go @@ -0,0 +1,169 @@ +package main + +import ( + "goLearn/connectPool" + "goLearn/model" + "sync" + "time" +) + +var Ch = make(chan model.Task, 3) + +var mutex sync.Mutex +var rwmutex sync.RWMutex + +func main() { + //var wg sync.WaitGroup + //data := &model.Data{ + // Count: 0, + // Record: make(map[int]int), + //} + //donetitle := make(chan struct{}) + //for i := 0; i < 10; i++ { + // wg.Add(1) + // go goroutine.NewProducer(Ch, &wg, donetitle, i, &mutex, data, &rwmutex) + //} + //for i := 0; i < 3; i++ { + // wg.Add(1) + // go goroutine.NewConsumer(Ch, &wg, donetitle, i, data, &rwmutex) + //} + //time.Sleep(10 * time.Second) + //close(donetitle) + //wg.Wait() + //fmt.Println("任务完成") + + //--------------------- + + donetitle := make(chan struct{}) + + connectPool.ConnectPool(donetitle) + + time.Sleep(5 * time.Second) + close(donetitle) + defer connectPool.DisconnectPool() + + //------------------ + //ctx := context.WithValue(context.Background(), "value", model.Task{Id: "1", Content: "1"}) + //goroutine.Runtask(ctx) +} + +// +// +//package main +// +//import ( +//"context" +//"encoding/json" +//"fmt" +//clientv3 "go.etcd.io/etcd/client/v3" +//"log" +//"os" +//"os/signal" +//"syscall" +//"time" +//) +// +//// 服务元信息结构体 +//type ServiceInfo struct { +// Name string `json:"name"` // 服务名称 +// Address string `json:"address"` // 服务地址(IP:端口) +// Version string `json:"version"` // 服务版本 +// ID string `json:"id"` // 服务实例唯一ID +//} +// +//// 注册服务到etcd +//func registerService(client *clientv3.Client, info ServiceInfo, ttl int64) (chan struct{}, error) { +// // 1. 生成注册键名(格式:/services/服务名/实例ID) +// key := fmt.Sprintf("/services/%s/%s", info.Name, info.ID) +// +// // 2. 序列化服务信息为JSON +// value, err := json.Marshal(info) +// if err != nil { +// return nil, fmt.Errorf("序列化服务信息失败: %v", err) +// } +// +// // 3. 创建带TTL的租约 +// leaseResp, err := client.Grant(context.Background(), ttl) +// if err != nil { +// return nil, fmt.Errorf("创建租约失败: %v", err) +// } +// +// // 4. 注册服务(绑定租约) +// _, err = client.Put(context.Background(), key, string(value), clientv3.WithLease(leaseResp.ID)) +// if err != nil { +// return nil, fmt.Errorf("注册服务失败: %v", err) +// } +// +// // 5. 启动心跳续约(保持租约有效) +// keepAliveChan, err := client.KeepAlive(context.Background(), leaseResp.ID) +// if err != nil { +// return nil, fmt.Errorf("启动心跳失败: %v", err) +// } +// +// // 6. 监听心跳通道(处理异常) +// done := make(chan struct{}) +// go func() { +// for { +// select { +// case _, ok := <-keepAliveChan: +// if !ok { +// log.Println("心跳已停止,服务可能已下线") +// close(done) +// return +// } +// // log.Println("心跳续约成功") +// case <-done: +// return +// } +// } +// }() +// +// return done, nil +//} +// +//// 从etcd注销服务 +//func unregisterService(client *clientv3.Client, serviceName, serviceID string) error { +// key := fmt.Sprintf("/services/%s/%s", serviceName, serviceID) +// _, err := client.Delete(context.Background(), key) +// return err +//} +// +//func main() { +// // 1. 连接etcd +// client, err := clientv3.New(clientv3.Config{ +// Endpoints: []string{"127.0.0.1:2379"}, +// DialTimeout: 5 * time.Second, +// }) +// if err != nil { +// log.Fatalf("连接etcd失败: %v", err) +// } +// defer client.Close() +// +// // 2. 定义服务信息(实际应用中应从配置或环境变量获取) +// serviceInfo := ServiceInfo{ +// Name: "user-service", // 服务名称 +// Address: "192.168.1.100:8080", // 服务地址 +// Version: "v1.0.0", // 服务版本 +// ID: "user-service-01", // 实例唯一ID(可使用UUID) +// } +// +// // 3. 注册服务(租约10秒,每几秒自动续约) +// done, err := registerService(client, serviceInfo, 10) +// if err != nil { +// log.Fatalf("服务注册失败: %v", err) +// } +// log.Printf("服务 %s 已注册到etcd", serviceInfo.ID) +// +// // 4. 监听退出信号,优雅注销服务 +// sigChan := make(chan os.Signal, 1) +// signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) +// <-sigChan +// +// // 5. 注销服务 +// if err := unregisterService(client, serviceInfo.Name, serviceInfo.ID); err != nil { +// log.Printf("服务注销失败: %v", err) +// } else { +// log.Printf("服务 %s 已从etcd注销", serviceInfo.ID) +// } +// close(done) +//}