服務器流量收發測試-續篇

文章目錄

  • 一、概述
  • 二、普通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-

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/35198.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/35198.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/35198.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大模型應用研發基礎環境配置(Miniconda、Python、Jupyter Lab、Ollama等)

老牛同學之前使用的MacBook Pro電腦配置有點舊&#xff08;2015 年生產&#xff09;&#xff0c;跑大模型感覺有點吃力&#xff0c;操作起來有點卡頓&#xff0c;因此不得已撿起了塵封了快兩年的MateBook Pro電腦&#xff08;老牛同學其實不太喜歡用 Windows 電腦做研發工作&am…

04_記錄鎖

記錄鎖&#xff08;Record Lock&#xff09; 文章目錄 記錄鎖&#xff08;Record Lock&#xff09;簡介原理加鎖流程鎖類型使用場景示例與其他鎖的對比結論 簡介 MySQL 中的記錄鎖&#xff08;Record Lock&#xff09;是行級鎖的一種&#xff0c;用于鎖定數據庫表中的特定行。…

從零開始做題:老照片中的密碼

老照片中的密碼 1.題目 1.1 給出圖片如下 1.2 給出如下提示 這張老照片中的人使用的是莫爾斯電報機&#xff0c;莫爾斯電報機分為莫爾斯人工電報機和莫爾斯自動電報機&#xff08;簡稱莫爾斯快機&#xff09;。莫爾斯人工電報機是一種最簡單的電報機&#xff0c;由三個部分組…

SelfReg-UNet:解決UNet語義損失,增強特征一致性與減少冗余的優化模型

SelfReg-UNet&#xff1a;解決UNet語義損失&#xff0c;增強特征一致性與減少冗余的優化模型 提出背景拆解類比&#xff1a;整理書架語義一致性正則化內部特征蒸餾為什么 UNet 會有語義損失&#xff1f; 提出背景 論文&#xff1a;https://arxiv.org/pdf/2406.14896 代碼&…

c++內存管理_復習

new與placement new new&#xff1a; 先調用operator new(大小)&#xff0c;而operator new()會調用malloc嘗試分配內存&#xff0c;失敗則調用_callnewh()來釋放內存&#xff0c;直至分配成功 可以設置分配失敗的處理函數&#xff1a;將寫好的處理函數作為參數傳入set_new_han…

Vue3 使用 Vue Router 時,params 傳參失效

前言&#xff1a; 在寫項目的時候&#xff0c;使用了 vue-router 的 params 進行傳參&#xff0c;但是在詳情頁面中一直獲取不到參數。原因&#xff1a;Vue Router 在2022-8-22的那次更新后&#xff0c;使用這種方式在新頁面上無法獲取&#xff01; 正文&#xff1a; 在列表頁進…

deeplabcut

import pandas as pd import h5py import pickle import json import os # 讀取 CSV 文件 csv_file_path /mnt/data/CollectedData_dlc.csv csv_data pd.read_csv(csv_file_path) # 讀取 H5 文件 h5_file_path /mnt/data/CollectedData_dlc.h5 with h5py.File(h5_file_pat…

LeetCode題練習與總結:只出現一次的數字Ⅱ--137

一、題目描述 給你一個整數數組 nums &#xff0c;除某個元素僅出現 一次 外&#xff0c;其余每個元素都恰出現 三次 。請你找出并返回那個只出現了一次的元素。 你必須設計并實現線性時間復雜度的算法且使用常數級空間來解決此問題。 示例 1&#xff1a; 輸入&#xff1a;n…

K8S日常運維手冊

Kubernetes&#xff08;簡稱 K8S&#xff09;是一種廣泛使用的容器編排平臺&#xff0c;能夠自動化部署、擴展和管理容器化應用。對于運維人員來說&#xff0c;掌握 Kubernetes 的日常運維技能是確保系統穩定運行的關鍵。本文將介紹一些 Kubernetes 日常運維的基本操作與技巧&a…

虛擬機裝入kali linux

VMware 首先需要先安裝VMware Workstation Pro可以根據這篇文章來下載VMware 下載kali linux Installer Images VS Virtual Machines Installer Images&#xff08;安裝鏡像&#xff09;Virtual Machines&#xff08;虛擬機&#xff09; 直接訪問硬件&#xff0c;定制內核…

Matlab|【防騙帖】考慮時空相關性的風電功率預測誤差建模與分析

目錄 1 主要內容 2 部分程序 3 下載鏈接 1 主要內容 這個程序《考慮時空相關性的風電功率預測誤差建模與分析》畫的圖片非常漂亮&#xff0c;和原文獻基本一致&#xff0c;但是實際上內容并未實現出來&#xff0c;主要就是利用現有的風電預測的數據和結果做了相關的圖&#…

【數據結構】(C語言):鏈表

鏈表&#xff1a; 基本單位是節點。節點至少兩部分&#xff1a;數據&#xff0c;下一個數據的地址。頭指針head&#xff0c;始終指向鏈表的第一個節點。若沒有節點&#xff0c;則headNULL。鏈表在內存中是非連續的。不能使用索引&#xff08;下標&#xff09;查找元素。只能從…

解決:Xshell通過SSH協議連接Ubuntu服務器報“服務器發送了一個意外的數據包,received:3,expected:20”

下圖所示&#xff1a; 日志也基本看不出來問題在哪&#xff0c;只是說斷開了連接大概是驗證失敗。有幸在某論壇評論區找到了原因&#xff0c;是因為我的xshell版本太低了而服務器的ssh版本太高&#xff0c;高版本的ssh默認屏蔽了一部分不太安全的算法導致建立連接的時候驗證失敗…

C++ 14新特性個人總結

variable templates 變量模板。這個特性允許模板被用于定義變量&#xff0c;就像之前模板可以用于定義函數或類型一樣。變量模板為模板編程帶來了新的靈活性&#xff0c;特別是在定義泛化的常量和元編程時非常有用。 變量模板的基本語法 變量模板的聲明遵循以下基本語法&am…

解決Vue+Vite打包后Leaflet的marker圖標不顯示的問題

前言 用Leaflet寫關于WebGIS的開發&#xff0c;用Vite或者webpack打包&#xff0c;打包后會找不到圖標&#xff0c;如下所示。 直言的說&#xff0c;筆者去網上搜了搜&#xff0c;其實收到一個比較好是答案。網址如下。 &#xff08;完美解決~&#xff09;關于VueLeaflet添加…

eslint 與 prettier 的一些常見的配置項(很詳細)

目錄 1、eslint 常見配置項&#xff08;語法規范&#xff09; 2、 prettier 常見的配置項&#xff08;格式規范&#xff09; 代碼規范相關內容看小編的該文章&#xff0c;獲取對你有更好的幫助 vsCode代碼格式化&#xff08;理解eslint、vetur、prettier&#xff0c;實現格式…

IDEA啟動報錯:Abnormal build process termination...

一、問題描述 因為項目需要&#xff0c;同時打開了兩個idea&#xff0c;突然發現一個啟動的時候報錯&#xff0c;有點莫名其妙&#xff0c;剛還好好的&#xff0c;為啥就不能用了&#xff0c;一頓百度找方法&#xff0c;試了各種方法&#xff0c;像重新安裝jdk、重啟系統發現都…

TensorFlow開源項目

歡迎來到 Papicatch的博客 文章目錄 &#x1f349;TensorFlow介紹 &#x1f349;主要特點和功能 &#x1f348;多語言支持 &#x1f348;靈活的架構 &#x1f348;分布式訓練 &#x1f348;跨平臺部署 &#x1f348;強大的工具鏈 &#x1f348;豐富的社區和生態系統 &a…

c++基本數據類型和計算(一)習題講解

1.【單選題】以下說法正確的是? A. unsigned 類型的值 最大為0xFFFFFFFF B. float類型的值大約有15位精度 C.bool類型占用4個字節 解析&#xff1a; 選項A&#xff1a;unsigned 類型的值 最大為 4個字節&#xff0c;正確。選項B&#xff1a; 因為float類型的值是單精度的浮…

Vue3基礎使用

目錄 一、創建Vue3工程 (一)、cli (二)、vite 二、常用Composition API (一)、setup函數 (二)、ref函數 (三)、reactive函數 (四)、setup注意事項 (五)、計算屬性 (六)、watch (七)、watchEffect函數 (八)、生命周期 1、以配置項的形式使用生命周期鉤子 2、組合式…