Files
goLearn/main.go
2025-08-31 13:10:56 +08:00

186 lines
4.6 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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)
//}