You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							73 lines
						
					
					
						
							2.1 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							73 lines
						
					
					
						
							2.1 KiB
						
					
					
				
								package registry
							 | 
						|
								
							 | 
						|
								import (
							 | 
						|
									"context"
							 | 
						|
									"encoding/json"
							 | 
						|
									"log"
							 | 
						|
									"memobus_relay_server/config" // 替换为你的模块名
							 | 
						|
									"memobus_relay_server/storage"
							 | 
						|
									"time"
							 | 
						|
								)
							 | 
						|
								
							 | 
						|
								// InstanceInfo 定义了要注册到 Redis 的实例信息
							 | 
						|
								type InstanceInfo struct {
							 | 
						|
									InstanceID       string `json:"instanceId"`
							 | 
						|
									PublicAppAddr    string `json:"publicAppAddr"`
							 | 
						|
									PublicDeviceAddr string `json:"publicDeviceAddr"`
							 | 
						|
									// 还可以增加负载信息
							 | 
						|
									ConnectedDevices int       `json:"connectedDevices"`
							 | 
						|
									LastHeartbeat    time.Time `json:"lastHeartbeat"`
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func StartHeartbeat(getDeviceCount func() int) {
							 | 
						|
									if storage.RedisClient == nil {
							 | 
						|
										log.Println("Registry heartbeat is disabled because Redis is not enabled.")
							 | 
						|
										return
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									interval := time.Duration(config.Cfg.Redis.HeartbeatIntervalSeconds) * time.Second
							 | 
						|
									ticker := time.NewTicker(interval)
							 | 
						|
								
							 | 
						|
									updateHeartbeat := func() {
							 | 
						|
										info := InstanceInfo{
							 | 
						|
											InstanceID:       config.Cfg.Server.InstanceID,
							 | 
						|
											PublicAppAddr:    config.Cfg.Server.PublicAppAddr,
							 | 
						|
											PublicDeviceAddr: config.Cfg.Server.PublicDeviceAddr,
							 | 
						|
											ConnectedDevices: getDeviceCount(),
							 | 
						|
											LastHeartbeat:    time.Now(),
							 | 
						|
										}
							 | 
						|
										jsonData, _ := json.Marshal(info)
							 | 
						|
								
							 | 
						|
										key := config.Cfg.Redis.InstanceRegistryKey
							 | 
						|
										instanceID := config.Cfg.Server.InstanceID
							 | 
						|
								
							 | 
						|
										if err := storage.RedisClient.HSet(context.Background(), key, instanceID, jsonData).Err(); err != nil {
							 | 
						|
											log.Printf("ERROR: Failed to send heartbeat to Redis: %v", err)
							 | 
						|
										} else {
							 | 
						|
											log.Printf("Heartbeat sent. Connected devices: %d", info.ConnectedDevices)
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									go func() {
							 | 
						|
										updateHeartbeat() // 立即执行一次
							 | 
						|
										for range ticker.C {
							 | 
						|
											updateHeartbeat()
							 | 
						|
										}
							 | 
						|
									}()
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func Unregister() {
							 | 
						|
									if storage.RedisClient == nil {
							 | 
						|
										return
							 | 
						|
									}
							 | 
						|
									log.Println("Unregistering instance from Redis...")
							 | 
						|
									key := config.Cfg.Redis.InstanceRegistryKey
							 | 
						|
									instanceID := config.Cfg.Server.InstanceID
							 | 
						|
									if err := storage.RedisClient.HDel(context.Background(), key, instanceID).Err(); err != nil {
							 | 
						|
										// 如果注销失败,打印一个错误日志
							 | 
						|
										log.Printf("ERROR: Failed to unregister instance '%s' from Redis: %v", instanceID, err)
							 | 
						|
									} else {
							 | 
						|
										// 只有在确认没有错误后,才打印成功日志
							 | 
						|
										log.Println("Successfully unregistered.")
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 |