文章目錄
- 一、概述
- 二、普通java工程
- 1,pom文件
- 2, 定時任務
- 3,打包
- 4,jar運行
- 三、打包docker鏡像
- 1,鏡像打包配置docker環境:
- 2,連接遠程鏡像倉庫
- 四、部署運行
- 1. 容器運行
- 2. 單容器多次運行jar
- 3. 容器多實例運行
- 五、完整代碼
一、概述
接上回書 服務器流量收發測試
我們借助以下2種方式簡單實現了構造http請求,實現流量收發測試:
- springboot定時任務
- crontab + curl
同時,我們也發現,springboot定時任務方式太過重量級,crontab + curl則需要比較高的權限,并需要安裝 crontab 系統服務。
那么有沒一種輕量級的方法,實現同樣的功能呢?
答案是肯定的,下面我們使用普通java工程來實現相同的功能。
二、普通java工程
1,pom文件
引入 unirest
<?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"><modelVersion>4.0.0</modelVersion><groupId>com.fly</groupId><artifactId>unirest-show</artifactId><version>0.0.1</version><name>unirest-show</name><url>http://maven.apache.org</url><packaging>jar</packaging><properties><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><docker.hub>registry.cn-shanghai.aliyuncs.com</docker.hub><java.version>1.8</java.version><skipTests>true</skipTests></properties><dependencies><!-- unirest --><dependency><groupId>com.mashape.unirest</groupId><artifactId>unirest-java</artifactId><version>1.4.9</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId><version>2.12.1</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.5</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.5</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.12</version><scope>provided</scope></dependency></dependencies><build><finalName>${project.artifactId}-${project.version}</finalName><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin><!-- 方式一:帶dependencies運行包 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>3.5.0</version><configuration><appendAssemblyId>false</appendAssemblyId><archive><manifest><mainClass>com.fly.simple.MainRun</mainClass></manifest></archive><descriptorRefs><!--將所有外部依賴JAR都加入生成的JAR包--><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration><executions><execution><!-- 配置執行器 --><id>make-assembly</id><phase>package</phase><!-- 綁定到package階段 --><goals><goal>single</goal><!-- 只運行一次 --></goals></execution></executions></plugin><!-- 添加docker-maven插件 --><plugin><groupId>io.fabric8</groupId><artifactId>docker-maven-plugin</artifactId><version>0.40.0</version><executions><execution><phase>package</phase><goals><goal>build</goal><goal>push</goal></goals></execution></executions><configuration><!-- 連接到帶docker環境的linux服務器編譯image --><!--<dockerHost>http://192.168.182.10:2375</dockerHost>--><!-- Docker 推送鏡像倉庫地址 --><pushRegistry>${docker.hub}</pushRegistry><images><image><name>${docker.hub}/00fly/${project.artifactId}:${project.version}</name><build><dockerFileDir>${project.basedir}</dockerFileDir></build></image></images></configuration></plugin></plugins></build>
</project>
2, 定時任務
使用ScheduledThreadPoolExecutor 實現
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.Stream;import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.JsonNode;
import com.mashape.unirest.http.Unirest;
import com.mashape.unirest.http.exceptions.UnirestException;import lombok.extern.slf4j.Slf4j;@Slf4j
public class MainRun
{private static String uploadUrl = "http://124.71.129.204:8083/post";private static File file;/*** 線程池保證程序一直運行* * @param args*/public static void main(String[] args){log.info("################################################################################################");log.info("to start please run: java -jar unirest-show-0.0.1.jar --server.url=http://124.71.129.204:8083/post");log.info("################################################################################################");if (args.length > 0){String url = Stream.of(args).filter(arg -> arg.contains("--server.url")).map(arg -> StringUtils.substringAfter(arg, "=")).collect(Collectors.joining());if (StringUtils.isNotBlank(url)){log.info("server.url={}", url);uploadUrl = url;}}init();ScheduledExecutorService service = new ScheduledThreadPoolExecutor(1);long delay = 60000L - System.currentTimeMillis() % 60000L - 1; // 計算延遲(微調1ms),保證準時啟動log.info("initialDelay {} Seconds", delay / 1000.0);service.scheduleAtFixedRate(() -> {post();}, delay, 60000L, TimeUnit.MILLISECONDS);}private static void init(){String protocol = MainRun.class.getResource("").getProtocol();log.info("protocol: {}", protocol);if ("jar".equals(protocol)){try (InputStream is = MainRun.class.getResourceAsStream("/data/nginx-1.25.3.tar.gz")){file = new File("nginx-1.25.3.tar.gz");FileUtils.copyInputStreamToFile(is, file);log.info("{}", file.getCanonicalPath());}catch (IOException e){log.error(e.getMessage(), e);}}else{String path = MainRun.class.getResource("/data/nginx-1.25.3.tar.gz").getPath();log.info("{}", path);file = new File(path);}}/*** Unirest發送post請求<br>* https://kong.github.io/unirest-java/#requests*/private static void post(){try{log.info("Unirest start");HttpResponse<JsonNode> jsonResponse = Unirest.post(uploadUrl).header("accept", "application/json").field("id", System.currentTimeMillis() % 1000).field("file", file) // 文件.asJson();log.info("###### Response status:{}", jsonResponse.getStatus());}catch (UnirestException e){log.error(e.getMessage(), e);}}
}
3,打包
輸入以下命令執行打包,生成unirest-show-0.0.1.jar 只有5M不到,并且此jar可獨立運行。此功能借助plugin maven-assembly-plugin
實現,具體請參考pom文件
mvn clean package
4,jar運行
nohup java -jar unirest-show-0.0.1.jar &
三、打包docker鏡像
在pom文件種,我們已經配置了 docker-maven-plugin
來實現docker鏡像打包。
1,鏡像打包配置docker環境:
- 本地windows可安裝
docker desktop
- 遠程docker需要
打開dockerHost標簽配置docker遠程地址
同時,我們在package階段綁定了 docker build、docker push
需要保證docker push時能連上遠程鏡像倉庫 registry.cn-shanghai.aliyuncs.com/00fly/
2,連接遠程鏡像倉庫
有3種方式:
- maven中配置
參考 容器鏡像生成記 - 項目pom.xml中配置
具體操作為,在插件io.fabric8.docker-maven-plugin
configuration節點新增
<authConfig><!--認證配置,用于私有鏡像倉庫registry認證 --><username>${docker.username}</username><password>${docker.password}</password></authConfig>
這邊${docker.username}、${docker.password}請替換為docker鏡像倉庫實際賬號/密碼.
- 手工登錄
不做任何實際配置,推送鏡像前,執行手工登錄操作,如:
docker login --username=${docker.username} registry.cn-shanghai.aliyuncs.com
這邊${docker.username}請替換為docker鏡像倉庫實際賬號
四、部署運行
1. 容器運行
cd docker
sh restart.sh
2. 單容器多次運行jar
cd docker
sh n-restart.sh
運行結果
2024-06-25 21:18:57.613 [main] INFO com.fly.simple.MainRun - protocol: jar
2024-06-25 21:18:57.616 [main] INFO com.fly.simple.MainRun - /nginx-1.25.3.tar.gz
2024-06-25 21:18:57.616 [main] INFO com.fly.simple.MainRun - initialDelay 2.383 Seconds
2024-06-25 21:18:57.622 [main] INFO com.fly.simple.MainRun - /nginx-1.25.3.tar.gz
2024-06-25 21:18:57.623 [main] INFO com.fly.simple.MainRun - initialDelay 2.376 Seconds
2024-06-25 21:19:00.000 [pool-2-thread-1] INFO com.fly.simple.MainRun - Unirest start
2024-06-25 21:19:00.001 [pool-2-thread-1] INFO com.fly.simple.MainRun - Unirest start
2024-06-25 21:19:00.002 [pool-2-thread-1] INFO com.fly.simple.MainRun - Unirest start
2024-06-25 21:19:01.700 [pool-2-thread-1] INFO com.fly.simple.MainRun - ###### Response status:200
2024-06-25 21:19:01.721 [pool-2-thread-1] INFO com.fly.simple.MainRun - ###### Response status:200
2024-06-25 21:19:02.988 [pool-2-thread-1] INFO com.fly.simple.MainRun - ###### Response status:200
3. 容器多實例運行
cd docker
sh scale.sh
運行結果
sh scale.sh
[+] Running 3/3? Container docker_unirest-show_3 Started 1.1s ? Container docker_unirest-show_1 Started 0.6s ? Container docker_unirest-show_2 Started
五、完整代碼
https://gitcode.com/00fly/vnstat-rx-tx/tree/main/unirest-show
有任何問題和建議,都可以向我提問討論,大家一起進步,謝謝!
-over-