文章目录
一、Zipin概述
Zipkin是Twitter开源的分布式跟踪系统,基于Dapper的论文设计而来。它的主要功能是收集系统的时序数据,从而追踪微服务架构的系统延时等问题。Zipkin还提供了一个非常友好的界面,帮助我们分析追踪数据。
Zipkin官网:http://zipkin.io/
二、如何下载
SpringBoot 2.0以上版本已经不需要自行搭建zipkin-server,我们可以从以下地址下载exec.jar
【版本 0.4.3-2.12.9】https://repo1.maven.org/maven2/io/zipkin/java/zipkin-server/
【版本 2.14.1-3.4.2】https://repo1.maven.org/maven2/io/zipkin/zipkin-server/
为了方便演示起见,我们只随机挑选几个exec.jar
三、需求描述
现在我们希望,将当前目录的可执行包,按版本号由小到大的顺序排列,并给出序号供选择,并且可以指定启动端口参数
四、代码实现
下面以java代码为例来说明实现过程,当然如果对shell脚本比较熟悉,也可用脚本实现以上功能。
为了保证可执行包尽可能的小,仅使用纯jdk来实现。
1. pom设置
pom.xml
<?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>quick-start</artifactId>
<version>0.0.1</version>
<name>quick-start</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>
<java.version>1.8</java.version>
<skipTests>true</skipTests>
</properties>
<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>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<mainClass>com.fly.simple.Quickstart</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
2. 相关工具类
执行java命令工具
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Executor
{
/**
* execute命令
*
* @param command 执行的命令
* @param printLog 是否打印日志
* @throws IOException
*/
public static void execute(String command, boolean printLog)
throws IOException
{
System.out.println(String.format("即将执行:%s\n", command));
Process ps = Runtime.getRuntime().exec(command);
if (!printLog)
{
return;
}
try (BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream(), "GBK")))
{
String line;
while ((line = br.readLine()) != null)
{
System.out.println(line);
}
}
}
}
文件排序功能使用
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class RegExUtils
{
private static String EMPTY = "";
/**
* 移除正则内容
*
* @param text
* @param regex
* @return
*/
public static String removePattern(String text, String regex)
{
return replacePattern(text, regex, EMPTY);
}
public static String replacePattern(String text, String regex, String replacement)
{
if (text == null || regex == null || replacement == null)
{
return text;
}
return Pattern.compile(regex, Pattern.DOTALL).matcher(text).replaceAll(replacement);
}
/**
* 返回版本号<br>
*
* e.g: zipkin-server-2.10.4-exec.jar 返回 02.10.04
*
* @param text
* @return
*/
public static String getVersion(String text)
{
text = removePattern(text, "[a-z]|-|\\.jar");
return Stream.of(text.split("\\.")).map(v -> leftPad(v, 2, "0")).collect(Collectors.joining("."));
}
/**
* 左补位padStr
*
* @param input
* @param size
* @param padStr
* @return
*/
public static String leftPad(String input, int size, String padStr)
{
StringBuffer sb = new StringBuffer();
while (sb.length() < size - input.length())
{
sb.append(padStr);
}
return sb.append(input).toString();
}
}
3. 核心代码
import java.io.File;
import java.io.IOException;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import com.fly.simple.utils.Executor;
import com.fly.simple.utils.RegExUtils;
/**
* 快速启动
*/
public class Quickstart
{
/**
* 遍历jar目录下的zipkin-server-xxx-exec.jar,选择对应序号的jar启动<br>
* java -jar quick-start-0.0.1.jar --port=8081
*
* @param args
* @throws IOException
*/
public static void main(String[] args)
throws IOException
{
String port = "9411";
if (args.length > 0)
{
port = Stream.of(args).filter(arg -> arg.contains("--port")).map(arg -> arg.substring(arg.indexOf("=") + 1)).collect(Collectors.joining());
}
String path = new File("").getCanonicalPath();
String[] files = new File(path).list();
if (files != null && files.length > 0)
{
List<String> jarList = Stream.of(files)
.filter(f -> f.endsWith("-exec.jar"))
.sorted(Comparator.comparing(RegExUtils::getVersion)) // 自然数排序
.collect(Collectors.toList());
// 选项选择
String input;
Scanner sc = new Scanner(System.in);
do
{
AtomicInteger count = new AtomicInteger(1);
jarList.forEach(jar -> System.out.println(String.format("%2d ===> %s", count.getAndIncrement(), jar)));
System.out.println("请输入序号选择文件,x退出:");
input = sc.nextLine();
if ("x".equalsIgnoreCase(input))
{
System.out.println("退出系统!");
sc.close();
return;
}
} while (input == null || input.trim().length() == 0 || Integer.parseInt(input) < 1 || Integer.parseInt(input) > jarList.size());
String jar = jarList.get(Integer.parseInt(input) - 1);
System.out.println("你选择了:" + jar);
// 执行脚本
String command = String.format("java -jar %s --server.port=%s", jar, port);
Executor.execute(command, false);
sc.close();
try
{
Runtime.getRuntime().exec("cmd /c start /min http://127.0.0.1:" + port);
}
catch (IOException e)
{
}
}
}
}
五、打包部署
1. 打包,在项目目录执行mvn clean package
2. 部署
执行完成后会在target目录生成8kb大小的可执行包,将quick-start-0.0.1.jar
拷贝到服务器zipkin-server
目录下
3. 运行以及停止
支持指定端口号,默认9411
java -jar quick-start-0.0.1.jar --port=8082
查看运行状态,如果没有别的java程序,停止程序可以使用kaillall java
或者kill -9 ${pid}
·
ui界面如图
六、源码放送
https://gitcode.com/00fly/quick-start/overview
有任何问题和建议,都可以向我提问讨论,大家一起进步,谢谢!
-over-