Browse Source

[dev] add new module: OhMyAgent

tjq 4 years ago
parent
commit
4087c876e3

+ 3 - 4
others/Dockerfile

@@ -1,5 +1,5 @@
-# 基础镜像(由于OhMyScheduler-Server的运行需要Maven和Git环境,就自己打包了一个镜像)
-FROM tjqq/jdk-maven-git:8
+# 基础镜像
+FROM openjdk:8
 # 维护者
 MAINTAINER tengjiqi@gmail.com
 # 设置环境变量
@@ -15,5 +15,4 @@ RUN mkdir -p /root/oms-server
 # 挂载数据卷,将文件直接输出到宿主机(注意,此处挂载的是匿名卷,即在宿主机位置随机)
 VOLUME /root/oms-server
 # 启动应用
-ENTRYPOINT ["sh","-c","java $PARAMS -jar /oms-server.jar"]
-
+ENTRYPOINT ["sh","-c","java -jar /oms-server.jar $PARAMS"]

+ 74 - 0
oh-my-scheduler-worker-agent/pom.xml

@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>oh-my-scheduler</artifactId>
+        <groupId>com.github.kfcfans</groupId>
+        <version>1.0.0</version>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>oh-my-scheduler-worker-agent</artifactId>
+    <version>1.2.0</version>
+    <packaging>jar</packaging>
+
+
+    <properties>
+        <oms.worker.version>1.2.0</oms.worker.version>
+        <logback.version>1.2.3</logback.version>
+        <picocli.version>4.3.2</picocli.version>
+
+        <spring.boot.version>2.2.6.RELEASE</spring.boot.version>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>com.github.kfcfans</groupId>
+            <artifactId>oh-my-scheduler-worker</artifactId>
+            <version>${oms.worker.version}</version>
+        </dependency>
+
+        <!-- java cli 工具 -->
+        <dependency>
+            <groupId>info.picocli</groupId>
+            <artifactId>picocli</artifactId>
+            <version>${picocli.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-core</artifactId>
+            <version>${logback.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <version>${logback.version}</version>
+        </dependency>
+    </dependencies>
+
+
+    <!-- 谁说SpringBoot的打包插件只能给SpringBoot用的?省的我写一堆配置还有BUG... -->
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>${spring.boot.version}</version>
+                <configuration>
+                    <mainClass>com.github.kfcfans.oms.worker.MainApplication</mainClass>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal><!--可以把依赖的包都打包到生成的Jar包中-->
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 59 - 0
oh-my-scheduler-worker-agent/src/main/java/com/github/kfcfans/oms/worker/MainApplication.java

@@ -0,0 +1,59 @@
+package com.github.kfcfans.oms.worker;
+
+import com.github.kfcfans.oms.worker.common.OhMyConfig;
+import com.github.kfcfans.oms.worker.common.constants.StoreStrategy;
+import com.google.common.base.Splitter;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.exception.ExceptionUtils;
+import picocli.CommandLine;
+import picocli.CommandLine.Command;
+import picocli.CommandLine.Option;
+
+/**
+ * 启动类
+ *
+ * @author tjq
+ * @since 2020/5/20
+ */
+@Slf4j
+@Command(name = "OhMyAgent", mixinStandardHelpOptions = true, version = "1.2.0", description = "OhMyScheduler-Worker代理")
+public class MainApplication implements Runnable {
+
+    @Option(names = {"-a", "--app"}, description = "worker-agent名称,可通过调度中心控制台创建", required = true)
+    private String appName;
+
+    @Option(names = {"-p", "--persistence"}, description = "存储策略,枚举值,DISK 或 MEMORY")
+    private String storeStrategy = "DISK";
+
+    @Option(names = {"-s", "--server"}, description = "调度中心地址,多值英文逗号分隔,格式 IP:Port OR domain")
+    private String server = "127.0.0.1:7700";
+
+    @Option(names = {"-l", "--length"}, description = "返回值最大长度")
+    private int length = 1024;
+
+    public static void main(String[] args) {
+        CommandLine commandLine = new CommandLine(new MainApplication());
+        commandLine.execute(args);
+    }
+
+    @Override
+    public void run() {
+
+        OhMyConfig cfg = new OhMyConfig();
+        try {
+
+            cfg.setAppName(appName);
+            cfg.setServerAddress(Splitter.on(",").splitToList(server));
+            cfg.setStoreStrategy(StoreStrategy.MEMORY.name().equals(storeStrategy) ? StoreStrategy.MEMORY : StoreStrategy.DISK);
+            cfg.setMaxResultLength(length);
+
+            OhMyWorker ohMyWorker = new OhMyWorker();
+            ohMyWorker.setConfig(cfg);
+
+            ohMyWorker.init();
+        }catch (Exception e) {
+            log.error("[OhMyAgent] startup failed by config: {}.", cfg, e);
+            ExceptionUtils.rethrow(e);
+        }
+    }
+}

+ 68 - 0
oh-my-scheduler-worker-agent/src/main/resources/logback.xml

@@ -0,0 +1,68 @@
+<?xml version="1.0"?>
+<!-- 生产环境日志 -->
+<configuration>
+
+    <!--
+        日志路径,注意权限问题,否则无法打印日志。
+        大坑记录:`~/logs`不会在用户目录下创建文件夹,而是在项目目录下创建名为~的文件夹
+     -->
+    <property name="LOG_PATH" value="${user.home}/oms/logs"/>
+
+    <property name="CONSOLE_LOG_PATTERN"
+              value="%yellow(%date{yyyy-MM-dd HH:mm:ss}) |%highlight(%-5level) |%blue(%thread) |%blue(%file:%line) |%green(%logger) |%cyan(%msg%n)"/>
+
+    <!-- Console 输出设置 -->
+    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
+            <charset>utf8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>debug</level>
+            <onMatch>DENY</onMatch>
+            <onMismatch>NEUTRAL</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- 系统所有异常日志(ERROR)双写 start -->
+    <appender name="ERROR_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${LOG_PATH}/oms-server-error.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <FileNamePattern>${LOG_PATH}/oms-agent-error.%d{yyyy-MM-dd}.log</FileNamePattern>
+            <MaxHistory>7</MaxHistory>
+        </rollingPolicy>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>ERROR</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+    <!-- 系统所有异常日志(ERROR)双写 end -->
+
+
+    <!-- 系统主日志 start -->
+    <appender name="DEFAULT_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${LOG_PATH}/oms-server-application.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <FileNamePattern>${LOG_PATH}/oms-agent-application.%d{yyyy-MM-dd}.log</FileNamePattern>
+            <MaxHistory>7</MaxHistory>
+        </rollingPolicy>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <append>true</append>
+    </appender>
+    <!-- 系统主日志 日志 end -->
+
+    <root level="INFO">
+        <appender-ref ref="DEFAULT_APPENDER"/>
+        <appender-ref ref="ERROR_APPENDER"/>
+        <appender-ref ref="CONSOLE"/>
+    </root>
+
+</configuration>

+ 0 - 19
others/script/build_docker.sh

@@ -1,19 +0,0 @@
-#!/bin/bash
-# -p:允许后面跟一个字符串作为提示 -r:保证读入的是原始内容,不会发生任何转义
-read -r -p "请输入Dockedr镜像版本:" version
-echo "即将构建的Docker镜像:oms-server:$version"
-read -r -p "任意键继续:"
-
-# 一键部署脚本,请勿挪动脚本
-cd `dirname $0`/../.. || exit
-echo "================== 构建 jar =================="
-mvn clean package -DskipTests -Pdev -U -e
-echo "================== 拷贝 jar =================="
-/bin/cp -rf oh-my-scheduler-server/target/*.jar others/oms-server.jar
-ls -l others/oms-server.jar
-echo "================== 构建应用镜像 =================="
-docker build -t tjqq/oms-server:$version others/. || exit
-echo "================== (关闭老应用)括号代表非必须,只是顺便运行下新版本进行测试 =================="
-docker stop oms-server
-echo "================== (删除老容器) =================="
-docker container rm oms-server

+ 31 - 0
others/script/build_server_docker.sh

@@ -0,0 +1,31 @@
+#!/bin/bash
+# -p:允许后面跟一个字符串作为提示 -r:保证读入的是原始内容,不会发生任何转义
+read -r -p "请输入Dockedr镜像版本:" version
+echo "即将构建的Docker镜像:oms-server:$version"
+read -r -p "任意键继续:"
+
+# 一键部署脚本,请勿挪动脚本
+cd `dirname $0`/../.. || exit
+echo "================== 构建 jar =================="
+mvn clean package -DskipTests -Pdev -U -e
+echo "================== 拷贝 jar =================="
+/bin/cp -rf oh-my-scheduler-server/target/*.jar oh-my-scheduler-server/oms-server.jar
+ls -l oh-my-scheduler-server/oms-server.jar
+echo "================== 关闭老应用 =================="
+docker stop oms-server
+echo "================== 删除老容器 =================="
+docker container rm oms-server
+echo "================== 删除旧镜像 =================="
+docker rmi -f tjqq/oms-server:$version
+echo "================== 构建应用镜像 =================="
+docker build -t tjqq/oms-server:$version oh-my-scheduler-server/. || exit
+echo "================== 准备启动应用 =================="
+# 启动应用(端口映射、数据路径挂载)
+## -d:后台运行
+## -p:指定端口映射,容器端口:宿主机端口
+## --name:指定容器名称
+## -v(--volume):挂载目录,宿主机目录:docker内目录,写入docker内路径的数据会被直接写到宿主机上,常用于日志文件
+## -net=host:容器和宿主机共享网络(容器直接使用宿主机IP,性能最好,但网络隔离较差)
+docker run -d -e PARAMS="--spring.profiles.active=product" -p 7700:7700 -p 10086:10086 -p 27777:27777 --name oms-server -v ~/docker/oms-server:/root/oms-server tjqq/oms-server:$version
+sleep 1
+tail --pid=$$ -f -n 1000 ~/docker/oms-server/application.log

+ 1 - 0
pom.xml

@@ -40,6 +40,7 @@
         <module>oh-my-scheduler-common</module>
         <module>oh-my-scheduler-client</module>
         <module>oh-my-scheduler-worker-samples</module>
+        <module>oh-my-scheduler-worker-agent</module>
     </modules>
 
     <properties>