diff --git a/agent/src/main/java/io/wdd/agent/config/rabbitmq/MyRabbitMqConfig.java b/agent/src/main/java/io/wdd/agent/config/rabbitmq/RuntimeMessageConfig.java similarity index 76% rename from agent/src/main/java/io/wdd/agent/config/rabbitmq/MyRabbitMqConfig.java rename to agent/src/main/java/io/wdd/agent/config/rabbitmq/RuntimeMessageConfig.java index 5f435b7..335087c 100644 --- a/agent/src/main/java/io/wdd/agent/config/rabbitmq/MyRabbitMqConfig.java +++ b/agent/src/main/java/io/wdd/agent/config/rabbitmq/RuntimeMessageConfig.java @@ -4,5 +4,5 @@ import org.springframework.context.annotation.Configuration; @Configuration -public class MyRabbitMqConfig { +public class RuntimeMessageConfig { } diff --git a/agent/src/main/java/io/wdd/agent/initial/bootup/collectSystemInfo.java b/agent/src/main/java/io/wdd/agent/initial/bootup/CollectSystemInfo.java similarity index 78% rename from agent/src/main/java/io/wdd/agent/initial/bootup/collectSystemInfo.java rename to agent/src/main/java/io/wdd/agent/initial/bootup/CollectSystemInfo.java index 047846a..e1b545d 100644 --- a/agent/src/main/java/io/wdd/agent/initial/bootup/collectSystemInfo.java +++ b/agent/src/main/java/io/wdd/agent/initial/bootup/CollectSystemInfo.java @@ -2,30 +2,38 @@ package io.wdd.agent.initial.bootup; import io.wdd.agent.initial.beans.ServerInfo; +import io.wdd.common.handler.MyRuntimeException; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; import org.springframework.core.env.Environment; import javax.annotation.PostConstruct; import javax.annotation.Resource; +import javax.security.sasl.SaslServer; import java.net.InetAddress; import java.util.Map; import java.util.Properties; @Configuration @Slf4j -public class collectSystemInfo implements ApplicationContextAware { +public class CollectSystemInfo implements ApplicationContextAware { @Resource Environment environment; private ApplicationContext context; + @Resource + InitConfiguration initConfiguration; + @Bean + @Lazy public void initialReadingEnvironment(){ // https://zhuanlan.zhihu.com/p/449416472 @@ -79,12 +87,19 @@ public class collectSystemInfo implements ApplicationContextAware { @PostConstruct private void getInjectServerInfo(){ - log.info("getInjectServerInfo"); + log.info("Starting getInjectServerInfo"); ServerInfo serverInfo = (ServerInfo) context.getBean("serverInfo"); + if (ObjectUtils.isEmpty(serverInfo)) { + throw new MyRuntimeException(" Collect server info error !"); + } - System.out.println("serverInfo = " + serverInfo); + log.info("host server info has been collected == {}", serverInfo); + + // start to send message to Octopus Server + initConfiguration.SendInfoToServer(serverInfo); + log.info("init server info has been send to octopus server !"); } diff --git a/agent/src/main/java/io/wdd/agent/initial/bootup/InitConfiguration.java b/agent/src/main/java/io/wdd/agent/initial/bootup/InitConfiguration.java new file mode 100644 index 0000000..cbcb658 --- /dev/null +++ b/agent/src/main/java/io/wdd/agent/initial/bootup/InitConfiguration.java @@ -0,0 +1,95 @@ +package io.wdd.agent.initial.bootup; + +import io.wdd.agent.initial.beans.ServerInfo; +import io.wdd.agent.initial.rabbitmq.InitialRabbitMqConnector; +import org.springframework.amqp.AmqpException; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.core.MessagePostProcessor; +import org.springframework.amqp.core.MessageProperties; +import org.springframework.amqp.rabbit.annotation.*; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.nio.charset.StandardCharsets; + +@Service +@Lazy +public class InitConfiguration { + + + @Resource + RabbitTemplate rabbitTemplate; + + @Resource + InitialRabbitMqConnector initialRabbitMqConnector; + + @Value("${octopus.message.init_ttl}") + String defaultInitRegisterTimeOut; + + + private class InitMessagePostProcessor implements MessagePostProcessor { + + private String initMessageTTL; + + public InitMessagePostProcessor(Long initMessageTTL) { + this.initMessageTTL = String.valueOf(initMessageTTL); + } + + public InitMessagePostProcessor(String initMessageTTL) { + this.initMessageTTL = initMessageTTL; + } + + @Override + public Message postProcessMessage(Message message) throws AmqpException { + // set init register expiration time + MessageProperties messageProperties = message.getMessageProperties(); + messageProperties.setExpiration(initMessageTTL); + return message; + } + } + + public void SendInfoToServer(ServerInfo serverInfo){ + + // set init agent register ttl + InitMessagePostProcessor initMessagePostProcessor = new InitMessagePostProcessor(defaultInitRegisterTimeOut); + + rabbitTemplate.convertAndSend("hello wmm !"); + + // send the register server info to EXCHANGE:INIT_EXCHANGE QUEUE: init_to_server + rabbitTemplate.convertAndSend(initialRabbitMqConnector.INIT_EXCHANGE, initialRabbitMqConnector.INIT_TO_SERVER_KEY, String.valueOf(serverInfo).getBytes(StandardCharsets.UTF_8), initMessagePostProcessor); + + } + + + /** + * listen to the init queue from octopus server + * + * @RabbitListener : 用于标记当前方法是一个RabbitMQ的消息监听方法,可以持续性的自动接收消息 + * @param message + * 该方法不需要手动调用,Spring会自动运行这个监听方法 + * + * 注意:如果该监听方法正常结束,那么Spring会自动确认消息 + * 如果出现异常,则Spring不会确认消息,该消息一直存在于消息队列中 + */ + @RabbitHandler + @RabbitListener( + bindings = + @QueueBinding( + value = @Queue(name = "${octopus.message.init_from_server}" ), + exchange = @Exchange(name = "${octopus.message.init_exchange}", type = "direct"), + key = {"${octopus.message.init_from_server_key}"} + ) + , + ackMode = "MANUAL" + ) + public void ReceiveInitInfoFromServer(String message){ + + System.out.println("message = " + message); + + } + +} diff --git a/agent/src/main/java/io/wdd/agent/initial/rabbitmq/InitialRabbitMqConnector.java b/agent/src/main/java/io/wdd/agent/initial/rabbitmq/InitialRabbitMqConnector.java index 798f700..5d78480 100644 --- a/agent/src/main/java/io/wdd/agent/initial/rabbitmq/InitialRabbitMqConnector.java +++ b/agent/src/main/java/io/wdd/agent/initial/rabbitmq/InitialRabbitMqConnector.java @@ -1,8 +1,60 @@ package io.wdd.agent.initial.rabbitmq; -import org.springframework.stereotype.Component; +import org.springframework.amqp.core.Binding; +import org.springframework.amqp.core.BindingBuilder; +import org.springframework.amqp.core.DirectExchange; +import org.springframework.amqp.core.Queue; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; -@Component +/** + * agent send server init info to octopus server + *

+ * agent boot up should send message to server using this queue + */ +@Configuration public class InitialRabbitMqConnector { + @Value("${octopus.message.init_exchange}") + public String INIT_EXCHANGE; + + @Value("${octopus.message.init_from_server}") + public String INIT_FROM_SERVER; + + @Value("${octopus.message.init_to_server}") + public String INIT_TO_SERVER; + + @Value("${octopus.message.init_from_server_key}") + public String INIT_FROM_SERVER_KEY; + + @Value("${octopus.message.init_to_server_key}") + public String INIT_TO_SERVER_KEY; + + @Bean + public DirectExchange initDirectExchange() { + return new DirectExchange(INIT_EXCHANGE); + } + + @Bean + public Queue initDirectQueue() { + return new Queue(INIT_TO_SERVER); + } + + + /** + * 配置一个队列和交换机的绑定 + * + * @param initDirectQueue : 需要绑定的队列对象,参数名必须和某个@Bean的方法名完全相同,这样就会进行自动注入,对应 .bind() + * @param initDirectExchange : 需要绑定的交换机对象,参数名必须和某个@Bean的方法名完全相同,这样就会进行自动注入,对应 .to() + * .with() 方法对应的RoutingKey + * @return + */ + @Bean + public Binding initBinding(DirectExchange initDirectExchange, Queue initDirectQueue) { + return BindingBuilder.bind(initDirectQueue).to(initDirectExchange).with(INIT_TO_SERVER_KEY); + } + + } diff --git a/agent/src/main/resources/application.yml b/agent/src/main/resources/application.yml index 1ad94ef..3114d78 100644 --- a/agent/src/main/resources/application.yml +++ b/agent/src/main/resources/application.yml @@ -1,2 +1,25 @@ server: - port: 8000 \ No newline at end of file + port: 8000 + +spring: + rabbitmq: + host: 127.0.0.1 + port: 35672 + username: boge + password: boge14@Level5 + virtual-host: /wddserver + +octopus: + message: + # agent boot up default common exchange + init_exchange: InitExchange + # server will send message to agent using this common queue + init_to_server: InitToServer + # agent boot up default common exchange routing key + init_to_server_key: InitToServerKey + # server will receive message from agent using this common queue + init_from_server: InitFromServer + # agent boot up default common exchange routing key + init_from_server_key: InitFromServerKey + # initialization register time out (unit ms) default is 5 min + init_ttl: "300000" \ No newline at end of file diff --git a/agent/src/test/java/io/wdd/agent/InitRabbitMQTest.java b/agent/src/test/java/io/wdd/agent/InitRabbitMQTest.java new file mode 100644 index 0000000..b841e15 --- /dev/null +++ b/agent/src/test/java/io/wdd/agent/InitRabbitMQTest.java @@ -0,0 +1,20 @@ +package io.wdd.agent; + +import io.wdd.agent.initial.bootup.InitConfiguration; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import javax.annotation.Resource; + +@SpringBootTest +public class InitRabbitMQTest { + + @Resource + InitConfiguration initConfiguration; + + @Test + void testInitSendInfo(){ + + initConfiguration.SendInfoToServer(); + } +} diff --git a/common/src/main/java/io/wdd/wddcommon/CommonApplication.java b/common/src/main/java/io/wdd/common/CommonApplication.java similarity index 91% rename from common/src/main/java/io/wdd/wddcommon/CommonApplication.java rename to common/src/main/java/io/wdd/common/CommonApplication.java index 3867b48..532d05b 100644 --- a/common/src/main/java/io/wdd/wddcommon/CommonApplication.java +++ b/common/src/main/java/io/wdd/common/CommonApplication.java @@ -1,4 +1,4 @@ -package io.wdd.wddcommon; +package io.wdd.common; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/common/src/main/java/io/wdd/wddcommon/utils/R.java b/common/src/main/java/io/wdd/common/beans/R.java similarity index 96% rename from common/src/main/java/io/wdd/wddcommon/utils/R.java rename to common/src/main/java/io/wdd/common/beans/R.java index 42bed63..7f9598f 100644 --- a/common/src/main/java/io/wdd/wddcommon/utils/R.java +++ b/common/src/main/java/io/wdd/common/beans/R.java @@ -1,4 +1,4 @@ -package io.wdd.wddcommon.utils; +package io.wdd.common.beans; import lombok.Data; diff --git a/common/src/main/java/io/wdd/wddcommon/utils/ResultStat.java b/common/src/main/java/io/wdd/common/beans/ResultStat.java similarity index 94% rename from common/src/main/java/io/wdd/wddcommon/utils/ResultStat.java rename to common/src/main/java/io/wdd/common/beans/ResultStat.java index bfcd684..aeeaa6d 100644 --- a/common/src/main/java/io/wdd/wddcommon/utils/ResultStat.java +++ b/common/src/main/java/io/wdd/common/beans/ResultStat.java @@ -1,4 +1,4 @@ -package io.wdd.wddcommon.utils; +package io.wdd.common.beans; public enum ResultStat { diff --git a/common/src/main/java/io/wdd/common/beans/rabbitmq/OctopusMessage.java b/common/src/main/java/io/wdd/common/beans/rabbitmq/OctopusMessage.java new file mode 100644 index 0000000..33e1d00 --- /dev/null +++ b/common/src/main/java/io/wdd/common/beans/rabbitmq/OctopusMessage.java @@ -0,0 +1,34 @@ +package io.wdd.common.beans.rabbitmq; + + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.time.LocalDateTime; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder(toBuilder = true) +public class OctopusMessage { + + String uuid; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + LocalDateTime init_time; + + OctopusMessageType type; + + // server send message content + Object content; + + // agent reply message content + Object result; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + LocalDateTime ac_time; + +} diff --git a/common/src/main/java/io/wdd/common/beans/rabbitmq/OctopusMessageType.java b/common/src/main/java/io/wdd/common/beans/rabbitmq/OctopusMessageType.java new file mode 100644 index 0000000..d5be512 --- /dev/null +++ b/common/src/main/java/io/wdd/common/beans/rabbitmq/OctopusMessageType.java @@ -0,0 +1,17 @@ +package io.wdd.common.beans.rabbitmq; + +public enum OctopusMessageType { + + // agent initialization + INIT, + + // important things agent should do with itself + AGENT, + + // common shell or order execution + EXECUTOR, + + // update or report agent status + STATUS + +} diff --git a/server/src/main/java/io/wdd/server/handler/GlobalExceptionHandler.java b/common/src/main/java/io/wdd/common/handler/GlobalExceptionHandler.java similarity index 98% rename from server/src/main/java/io/wdd/server/handler/GlobalExceptionHandler.java rename to common/src/main/java/io/wdd/common/handler/GlobalExceptionHandler.java index 8b1f73f..1f9ca82 100644 --- a/server/src/main/java/io/wdd/server/handler/GlobalExceptionHandler.java +++ b/common/src/main/java/io/wdd/common/handler/GlobalExceptionHandler.java @@ -1,8 +1,8 @@ -package io.wdd.server.handler; +package io.wdd.common.handler; import com.google.common.collect.Maps; -import io.wdd.wddcommon.utils.R; -import io.wdd.wddcommon.utils.ResultStat; +import io.wdd.common.beans.R; +import io.wdd.common.beans.ResultStat; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; diff --git a/server/src/main/java/io/wdd/server/handler/MyMessageSource.java b/common/src/main/java/io/wdd/common/handler/MyMessageSource.java similarity index 98% rename from server/src/main/java/io/wdd/server/handler/MyMessageSource.java rename to common/src/main/java/io/wdd/common/handler/MyMessageSource.java index 4da205b..c36eb6e 100644 --- a/server/src/main/java/io/wdd/server/handler/MyMessageSource.java +++ b/common/src/main/java/io/wdd/common/handler/MyMessageSource.java @@ -1,4 +1,4 @@ -package io.wdd.server.handler; +package io.wdd.common.handler; import org.springframework.context.MessageSource; import org.springframework.context.i18n.LocaleContextHolder; diff --git a/server/src/main/java/io/wdd/server/handler/MyRuntimeException.java b/common/src/main/java/io/wdd/common/handler/MyRuntimeException.java similarity index 92% rename from server/src/main/java/io/wdd/server/handler/MyRuntimeException.java rename to common/src/main/java/io/wdd/common/handler/MyRuntimeException.java index c5b0bb5..977122a 100644 --- a/server/src/main/java/io/wdd/server/handler/MyRuntimeException.java +++ b/common/src/main/java/io/wdd/common/handler/MyRuntimeException.java @@ -1,6 +1,6 @@ -package io.wdd.server.handler; +package io.wdd.common.handler; -import io.wdd.wddcommon.utils.ResultStat; +import io.wdd.common.beans.ResultStat; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; diff --git a/common/src/test/java/io/wdd/wddcommon/CommonApplicationTests.java b/common/src/test/java/io/wdd/common/CommonApplicationTests.java similarity index 88% rename from common/src/test/java/io/wdd/wddcommon/CommonApplicationTests.java rename to common/src/test/java/io/wdd/common/CommonApplicationTests.java index 5cdbcc6..708f33c 100644 --- a/common/src/test/java/io/wdd/wddcommon/CommonApplicationTests.java +++ b/common/src/test/java/io/wdd/common/CommonApplicationTests.java @@ -1,4 +1,4 @@ -package io.wdd.wddcommon; +package io.wdd.common; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; diff --git a/pom.xml b/pom.xml index 7d83c33..9ed2e97 100644 --- a/pom.xml +++ b/pom.xml @@ -67,6 +67,11 @@ 31.1-jre + + + org.springframework.boot + spring-boot-starter-amqp + org.springframework.boot diff --git a/server/pom.xml b/server/pom.xml index dd39464..5d04ca5 100644 --- a/server/pom.xml +++ b/server/pom.xml @@ -37,10 +37,6 @@ runtime --> - - org.springframework.boot - spring-boot-starter-amqp - diff --git a/server/src/main/java/io/wdd/server/controller/AppController.java b/server/src/main/java/io/wdd/server/controller/AppController.java index 53869fd..b445017 100644 --- a/server/src/main/java/io/wdd/server/controller/AppController.java +++ b/server/src/main/java/io/wdd/server/controller/AppController.java @@ -3,7 +3,7 @@ package io.wdd.server.controller; import io.wdd.server.beans.vo.AppInfoVO; import io.wdd.server.coreService.CoreAppService; -import io.wdd.wddcommon.utils.R; +import io.wdd.common.beans.R; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; diff --git a/server/src/main/java/io/wdd/server/controller/DomainController.java b/server/src/main/java/io/wdd/server/controller/DomainController.java index a4c07c7..88c7682 100644 --- a/server/src/main/java/io/wdd/server/controller/DomainController.java +++ b/server/src/main/java/io/wdd/server/controller/DomainController.java @@ -3,7 +3,7 @@ package io.wdd.server.controller; import io.wdd.server.beans.po.DomainInfoPO; import io.wdd.server.beans.vo.DomainInfoVO; import io.wdd.server.coreService.CoreDomainService; -import io.wdd.wddcommon.utils.R; +import io.wdd.common.beans.R; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; diff --git a/server/src/main/java/io/wdd/server/controller/ServerController.java b/server/src/main/java/io/wdd/server/controller/ServerController.java index 0aa5638..c3abe81 100644 --- a/server/src/main/java/io/wdd/server/controller/ServerController.java +++ b/server/src/main/java/io/wdd/server/controller/ServerController.java @@ -7,7 +7,7 @@ import io.wdd.server.beans.vo.AppInfoVO; import io.wdd.server.beans.vo.DomainInfoVO; import io.wdd.server.beans.vo.ServerInfoVO; import io.wdd.server.coreService.CoreServerService; -import io.wdd.wddcommon.utils.R; +import io.wdd.common.beans.R; import org.apache.commons.lang3.ObjectUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.lang.Nullable; diff --git a/server/src/main/java/io/wdd/server/coreService/impl/CoreDomainServiceImpl.java b/server/src/main/java/io/wdd/server/coreService/impl/CoreDomainServiceImpl.java index 9139adb..c2b5b1c 100644 --- a/server/src/main/java/io/wdd/server/coreService/impl/CoreDomainServiceImpl.java +++ b/server/src/main/java/io/wdd/server/coreService/impl/CoreDomainServiceImpl.java @@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapp import io.wdd.server.beans.po.DomainInfoPO; import io.wdd.server.beans.vo.DomainInfoVO; import io.wdd.server.coreService.CoreDomainService; -import io.wdd.server.handler.MyRuntimeException; +import io.wdd.common.handler.MyRuntimeException; import io.wdd.server.service.DomainInfoService; import io.wdd.server.utils.EntityUtils; import org.apache.commons.lang3.StringUtils; diff --git a/server/src/main/resources/application.yml b/server/src/main/resources/application.yml index 637818d..ebfea12 100644 --- a/server/src/main/resources/application.yml +++ b/server/src/main/resources/application.yml @@ -7,6 +7,7 @@ spring: port: 35672 username: boge password: boge14@Level5 + virtual-host: /wddserver redis: