package main import ( "goLearn/model" "goLearn/test" "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) //reflect.FuncReflect(make([]int, 3)) var mx sync.Mutex ch := make(chan int, 10) for i := 0; i < 3; i++ { go test.GoProducer(&mx, ch) } for i := 0; i < 10; i++ { go test.GoConsumer(&mx, ch) } time.Sleep(10 * time.Second) defer close(ch) } // // //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) //}