170 lines
4.3 KiB
Go
170 lines
4.3 KiB
Go
|
|
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)
|
|||
|
|
//}
|