基于golang开发pulsar的升级工具

参考# Pulsar升级自动化:一键搞定集群升级与测试 本代码目前支持pulsar升级和测试发送是否正常。工具是copy了helm的一些代码,再加入了一些使用逻辑,来完成类似的功能。 执行的流程如下:

  1. 执行pulsar的程序安装
  2. 等待所有的pod完成功能
  3. 获取token和ip,触发测试。
  4. 打印测试报告的记录。 这里我使用的命令行是:go-example-cli
1
2
3
4
5
6
./go-cli-example install \          
--values ./charts/values.yaml \
--set namespace=pulsar \
pulsar-mini ./charts/pulsar -n pulsar --test-case-schema=http \
--test-case-host=10.7.7.26 \
--test-case-port=38799

输出结果如下: {C3C60206-2854-408B-B3FE-0AE25ED798E4}.png 这里注意一下,我的test-case是一个测试puslar的springboot服务 {D22E55C6-0135-4280-93F8-CFEC2E2C0215}.png 测试代码如下: {EB549C8A-9F45-412C-A80B-E1FF041F4C83}.png

这里解释一下Install命令是如何实现的

首先再root.go中有如下代码: {5BF4B6FF-34BE-4574-8FC2-F4E626A2C4F7}.png newInstallCmd就是实现的install命令,接下来查看一下install.go中的实现 {BECA43B0-A9F6-46EA-9144-70910B7551AE}.png 注意这里实例化了event,我来讲解一下event这个包,我再event中有三个文件 {8F46383F-9FB1-4824-A198-9C43444F8777}.png event.go 顶级定义事件类

{52CBC4DC-1BA8-4F7C-BF01-A9B33F0B4B84}.png 接下来进行实现event的installevent.go {A03EED16-37D1-48D3-8D9F-BB3B05B2495C}.png {940CF150-07AA-455B-B238-5D1F6D53B46E}.png {4E74BE43-05C7-4968-8B40-33DC3F383314}.png 注意是triggerTest触发测试的定义再test_client.go {1BCD7346-92BE-4D89-805C-757AD2D5446B}.png 注意再FinishInstall中,需要调用这个client来进行测试,这个client其实就是上面的test_client.go中实现的。 {9BBD096D-7A3B-4D3F-B042-19448FF042F6}.png

测试框架

可以看一下参考文档,最核心的是定义Event和JobDefine,来对任务进行管理 {26E3580E-2EAF-4BC1-82CD-F26D950095AC}.png {0A0C70EE-C543-4E01-B04A-B18B4C460103}.png 查看一下实现的类图 {D0DC9DE2-7622-4BFF-A4C6-573AC858EAC8}.png gradle文件如下所示: {CD124A95-08F7-4AEB-8204-D7C5786809F4}.png

其实最好的进步就是,自己操作!!! 这里涉及到了一个知识点模板方法 在这个项目中,主要通过 AbstractJobDefine 抽象类实现了模板方法设计模式。让我来分析一下实现原理:

  1. 抽象基类设计:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public abstract class AbstractJobDefine {
    protected Event event;
    protected String jobName;
    protected PulsarClient pulsarClient;
    protected int timeout;
    protected PulsarAdmin admin;

    // 模板方法,定义了算法骨架
    public void start() {
        try {
            // 前置处理
            beforeRun();
            // 核心测试逻辑
            run();
            // 后置处理
            afterRun();
        } catch (Exception e) {
            // 异常处理
            handleException(e);
        }
    }

    // 抽象方法,由具体子类实现
    protected abstract void run() throws Exception;

    // 钩子方法,子类可选择性重写
    protected void beforeRun() {}
    protected void afterRun() {}
}
  1. 具体实现类示例:
1
2
3
4
5
6
public class NormalTest extends AbstractJobDefine {
    @Override
    protected void run() throws Exception {
        // 实现具体的普通消费测试逻辑
    }
}

模板方法模式的核心原理:

  1. 算法骨架

    • AbstractJobDefine 定义了测试任务的基本流程
    • start() 方法作为模板方法,规定了整体执行顺序
  2. 可变部分

    • run() 作为抽象方法,强制子类实现具体测试逻辑
    • beforeRun()afterRun() 作为钩子方法,子类可选择性重写
  3. 不变部分

    • 异常处理机制
    • 测试流程的整体框架
    • 基础属性的管理
  4. 扩展机制

    • 新增测试类型只需继承 AbstractJobDefine
    • 实现必要的抽象方法
    • 可选择性重写钩子方法

这种设计的优势:

  1. 代码复用:共同的逻辑在抽象类中实现
  2. 扩展性强:易于添加新的测试类型
  3. 维护性好:核心流程集中管理
  4. 结构清晰:测试逻辑统一规范

使用示例:

1
2
3
4
5
6
7
// 创建具体的测试实例
AbstractJobDefine normalTest = new NormalTest(event, "普通消费测试", pulsarClient, 600, admin);
AbstractJobDefine schemaTest = new SchemaTest(event, "schema测试", pulsarClient, 600, admin);

// 统一的调用方式
normalTest.start();
schemaTest.start();

这种设计让整个测试框架更加灵活和可维护,同时保证了测试执行的一致性。这里感谢一下crossoverjie大佬的分享。

Licensed under CC BY-NC-SA 4.0
最后更新于 Apr 11, 2025 07:19 UTC
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
Caret Up