zipkin 引申一:如何遍历jar目录下的exec.jar并选择对应序号的jar启动

发布于:2024-12-06 ⋅ 阅读:(132) ⋅ 点赞:(0)

一、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-


网站公告

今日签到

点亮在社区的每一天
去签到