需求:
服務(wù)器需要定時(shí)批量檢測(cè) vmess 聯(lián)通性(這里的服務(wù)器不是部署 vmess 協(xié)議的服務(wù)器锋叨,而是單獨(dú)的堂鲤。)
解決方案:
- 使用 v2fly/vmessping 測(cè)試工具杜漠。
這個(gè)應(yīng)該算是官方出的了吧蟹瘾,之前是想使用類似 curl 命令來測(cè)試粉怕,但看了一下 v2 的協(xié)議并百度谷歌一波后發(fā)現(xiàn)沒有這類解決方案抵卫,但搜到了這個(gè)工具出來狮荔。
仔細(xì)看了一下發(fā)現(xiàn)是用 go 寫的,發(fā)布了不同平臺(tái)下的命令工具(Windows 和 Linux)介粘,剛好有 Linux 可以用殖氏。
我的后端使用 springboot + docker + k8s 實(shí)現(xiàn)的,所以需要在 docker 里面能使用這個(gè)工具姻采,經(jīng)過嘗試雅采,最后發(fā)現(xiàn)只需要將工具在 Dockerfile 中拷貝到 docker 即可,在代碼中執(zhí)行對(duì)應(yīng)的腳本命令即可。
- Dockerfile 部分代碼:
COPY vmessping_amd64_linux /etc/v2ray/vmessping
- 測(cè)試程序示例:
/**
* Vmess service test
*/
fun v2raySpeedTest(add: String, uuid: String, path: String, port: String, ps: String): String {
var vmessLink = VmessLink(
add = add,
host = add,
id = uuid,
path = path,
port = port,
ps = ps
)
var vmessLinkString = "vmess://${String(Base64.getEncoder().encode(JSON.toJSONString(vmessLink).toByteArray(Charsets.UTF_8).clone()))}"
val cmd = arrayOf("/etc/v2ray/./vmessping", "-v", "-c", "1", vmessLinkString)
return execCommand(cmd)
}
/**
* Exec the command
*/
private fun execCommand(cmd: Array<String>): String {
val process = ProcessBuilder(*cmd)
val p: Process
try {
p = process.start()
val reader = BufferedReader(InputStreamReader(p.inputStream))
val builder = StringBuilder()
var line: String? = null
while (reader.readLine().also { line = it } != null) {
builder.append(line)
builder.append(System.getProperty("line.separator"))
}
return builder.toString()
} catch (e: IOException) {
print("error")
e.printStackTrace()
}
return ""
}
注意: 工具在 docker 中的路徑需要和代碼中的保持一致婚瓜。