package register import ( "agent-go/g" logger2 "agent-go/logger" "agent-go/rabbitmq" "encoding/json" "fmt" "gopkg.in/yaml.v3" "io/ioutil" "time" ) var omType = g.InitOmType var log = logger2.Log var P = g.G.P var AgentServerInfoCache = &AgentServerInfo{} func INIT() *AgentServerInfo { // 获取系统的环境变量 agentServerInfo := parseAgentServerInfo() nacosConfig := g.G.NacosConfig initToServerProp := &rabbitmq.ConnectProperty{ ExchangeName: nacosConfig.GetString("octopus.message.init_exchange"), QueueName: nacosConfig.GetString("octopus.message.init_to_server"), ExchangeType: g.QueueDirect, TopicKey: nacosConfig.GetString("octopus.message.init_to_server_key"), } initFromServerProp := &rabbitmq.ConnectProperty{ ExchangeName: nacosConfig.GetString("octopus.message.init_exchange"), QueueName: nacosConfig.GetString("octopus.message.init_from_server"), ExchangeType: g.QueueDirect, TopicKey: nacosConfig.GetString("octopus.message.init_from_server_key"), } // 建立RabbitMQ的连接 initToServerQueue := &rabbitmq.RabbitQueue{ RabbitProp: initToServerProp, } defer initToServerQueue.Close() // 建立连接 initToServerQueue.Connect() // 组装OctopusMessage var octopusMsg *rabbitmq.OctopusMessage octopusMsg = octopusMsg.Build( omType, agentServerInfo, ) msgBytes, err := json.Marshal(octopusMsg) if err != nil { log.Error(fmt.Sprintf("octopus message convert to json is wrong! msg is => %v", octopusMsg)) } log.Debug(fmt.Sprintf("Prepare to send init message to server! ==> %s", string(msgBytes))) // 发送OM至MQ中 P.Submit( func() { for g.G.AgentHasRegister == false { //如果agent存活 而Server不存活 那么需要持续不断的向Server中发送消息 initToServerQueue.Send( msgBytes, ) // 休眠 time.Sleep(10 * time.Minute) } }) // 监听初始化连接中的信息 initFromServerQueue := &rabbitmq.RabbitQueue{ RabbitProp: initFromServerProp, } defer initFromServerQueue.Close() // 建立连接 initFromServerQueue.Connect() // 建立运行时RabbitMQ连接 handleInitMsgFromServer(initFromServerQueue, initToServerQueue, agentServerInfo) return agentServerInfo } // handleInitMsgFromServer 处理从Server接收的 注册信息 func handleInitMsgFromServer(initFromServerQueue *rabbitmq.RabbitQueue, initToServerQueue *rabbitmq.RabbitQueue, agentServerInfo *AgentServerInfo) { initOctopusMessageDeliveries := initFromServerQueue.Read(false) forever := make(chan bool) // use the ant goroutine pool P.Submit( func() { // 同步很多抢占注册的情况 for delivery := range initOctopusMessageDeliveries { log.Debug(fmt.Sprintf("message received from server is %s", string(delivery.Body))) var initOctopusMsg *rabbitmq.OctopusMessage err := json.Unmarshal(delivery.Body, &initOctopusMsg) if err != nil { log.Error(fmt.Sprintf("parse init message from server wroong, message is => %s ", string(delivery.Body))) } var serverInfo AgentServerInfo s, _ := initOctopusMsg.Content.(string) cc := json.Unmarshal([]byte(s), &serverInfo) if cc != nil { log.Error(fmt.Sprintf("parse init message from server wroong, message is => %v ", cc)) } serverName := serverInfo.ServerName // 处理OM信息 if initOctopusMsg != nil && initOctopusMsg.Type == g.InitOmType && serverName == agentServerInfo.ServerName { // 是本机的注册回复信息 // 建立 运行时 RabbitMQ连接 agentTopicName := initOctopusMsg.Result.(string) rabbitmq.BuildOMsgRuntimeConnectorQueue(agentTopicName) // 手动确认信息 delivery.Ack(false) // 手动关闭 注册队列的连接 shutdownRegisterQueueConnection(initFromServerQueue, initToServerQueue) return } // 不是自身的 注册回复信息 -- 拒绝 log.Warn(fmt.Sprintf("OctopusMessage INIT from server not this agent ! => %v, ==>%s", initOctopusMsg, delivery.Body)) delivery.Nack(false, true) } }, ) // wait forever <-forever } // shutdownRegisterQueueConnection 关闭初始化连接的两个队列 func shutdownRegisterQueueConnection(initFromServerQueue *rabbitmq.RabbitQueue, initToServerQueue *rabbitmq.RabbitQueue) { } func parseAgentServerInfo() *AgentServerInfo { // 约定文件地址为 /etc/environment.d/octopus-agent.conf // 目前使用 var agentServerInfo *AgentServerInfo //yamlFile, err := ioutil.ReadFile("C:\\Users\\wdd\\IdeaProjects\\ProjectOctopus\\agent-go\\server-env.yaml") yamlFile, err := ioutil.ReadFile("server-env.yaml") if err != nil { panic(fmt.Errorf("failed to read YAML file: %v", err)) } err = yaml.Unmarshal(yamlFile, &agentServerInfo) if err != nil { panic(fmt.Errorf("failed to unmarshal YAML: %v", err)) } jsonFormat, err := json.Marshal(agentServerInfo) if err != nil { log.Error(fmt.Sprintf("agent server info convert error ! agentserverinfo is %v", agentServerInfo)) panic(err) } log.Info(fmt.Sprintf("agent server info is %v", string(jsonFormat))) return agentServerInfo }