Files
goLearn/main.go

186 lines
4.6 KiB
Go
Raw Permalink Normal View History

2025-08-15 03:54:09 +08:00
package main
import (
"goLearn/model"
2025-08-31 13:10:56 +08:00
"goLearn/test"
2025-08-15 03:54:09 +08:00
"sync"
2025-08-31 13:10:56 +08:00
"time"
2025-08-15 03:54:09 +08:00
)
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("任务完成")
//---------------------
2025-08-30 05:53:10 +08:00
//donetitle := make(chan struct{})
//
//connectPool.ConnectPool(donetitle)
//
//time.Sleep(5 * time.Second)
//close(donetitle)
//defer connectPool.DisconnectPool()
2025-08-15 03:54:09 +08:00
//------------------
//ctx := context.WithValue(context.Background(), "value", model.Task{Id: "1", Content: "1"})
//goroutine.Runtask(ctx)
2025-08-30 05:53:10 +08:00
2025-08-31 13:10:56 +08:00
//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)
2025-08-30 05:53:10 +08:00
2025-08-15 03:54:09 +08:00
}
//
//
//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)
//}