CAT研究之cat-maven-plugin源码

最近公司因为业务需要,在本人的极力推荐下,开始考虑引入CAT监控系统。而作为一家传统业务公司,技术力量薄弱;所以为了保证CAT能够被推行下去,就必须业余时间自己鼓捣了。毕竟网上的资料基本没有,对底层不了解的话,出点问题就是大问题。 而且,推行新技术时,任何问题都是新技术导致的

1. 概述

CAT的整体项目结构由五个子项目,加上一个Maven插件项目组成。
CAT整体项目结构

而本次我们的主题就是这个Maven插件项目。这个项目并不是CAT必须的,而只是为了简化初学者的学习曲线而准备的。

而之所以选择以这个项目入手,原因不言之名 —— 因为非常简单啦,简单到只有两个类。

2. 项目概览

首先让我们来看看项目结构。正如上面提到的,本项目只有两个类,再加上四个配置文件。
项目结构

接下来让我们看看一些细节。

3. 四个配置文件

对于部署过CAT的童鞋, src/main/resources目录下的四个文件应该是非常熟悉了,它们正是在配置CAT服务端时时所需要的。因此不出意外的话,CAT中配置信息的修改或者表结构的变化,这里的应该是最新的。

4. 两个类

这里应该就是本文的重点了。

4.1 类PropertyProviders.java

本类负责收集用户从控制台输入的信息,用作链接MySQL进行操作的链接配置信息。

我们在按照官方文档安装CAT时,会出现以下图示的操作,其实这里我们输入的信息就是被PropertyProviders所接收到的,
配置CAT

注意这里的jdbc.userjdbc.passwordjdbc.url 会首先尝试从系统变量中获取,然后才是读取用户输入的。相关代码可以参见下私有方法PropertyProviders.ConsoleProvider.getString

4.2 类InstallMojo.java

这个类可以说是这个项目的核心,借助Mojo实现的Maven插件。每一个 Mojo 就是 Maven 中的一个执行目标(executable goal),而插件则是对单个或多个相关的 Mojo 做统一分发。一个 Mojo 包含一个简单的 Java 类。插件中多个类似 Mojo 的通用之处可以使用抽象父类来封装。

本类主要承担了以下两项职责:
1. 负责构建CAT部署所必须的配置文件。
2. 创建指定数据库cat, 并向其中插入CAT服务端正常运行所必须的表结构。

4.2.1 插件机制

我们先来看看该类的声明

/**
 * // 该插件的目标(goal) 为 install
 * // 以下注释将被Mojo所利用。
 * // 可以参见这个链接 : https://blog.csdn.net/chinrui/article/details/66472815 
 * @goal install
 * @aggregator true
 */
public class InstallMojo extends AbstractMojo {
    ...
}

然后再看看该项目的 pom文件

<groupId>com.dianping.cat</groupId>
<artifactId>cat-maven-plugin</artifactId>
<name>cat-maven-plugin</name>
<packaging>maven-plugin</packaging>

按照约定,最终我们可以通过mvn cat:install的方式来调用到这个插件。而这条命令,正是我们在按照CAT官方文档进行安装操作时所需要执行的一行命令,这就不谋而合了。

4.2.2 关于InstallMojo.java的其他内容

通过观察其内部的字段,我们可以看到很熟悉的, client.xml,server.xml,datasources.xml 字符串。

使用Mojo来编写插件时,核心方法就是 execute 了,可以看到CAT的代码质量还是相当高的。方法名很清晰地说明了自己要做的事情,并且进行了相应的逻辑切割,用方法的组合来完成任务,而不是将所有的方法搅和在一起。 更多的细节读者可以自行查看源码,这里只做简单的介绍

@Override
public void execute() throws MojoExecutionException, MojoFailureException {
    getLog().info("Preparing Cat environment...");
    // 从系统变量里获取MySQL的链接信息,否则就从用户在控制台的输入中获取MySQL的链接信息
    validate();

    // setupDatabase 该方法会创建数据库和表结构, 
    // setupConfigurationFiles 
    //    1. 该方法会创建 /data/appdatas/cat, /data/applogs/cat目录结构; 
    //    2. 并对 client.xml, server.xml, datasources.xml进行占位符替换, 然后拷贝到上面的/data/appdatas/cat目录中
    if (setupDatabase() && setupConfigurationFiles()) {
        getLog().info("Preparing Cat environment ... DONE");
        getLog().info("Use following command line to start local Cat server:");
        getLog().info("   cd cat-home; mvn jetty:run");
        getLog().info("Please open http://localhost:2281/cat in your browser");
    }
}

5. 总结

  1. 我们在按照CAT官方文档进行安装操作时所需要执行的一行命令mvn cat:install,正是执行了项目cat-maven-plugin中的InstallMojo.execute方法。
  2. InstallMojo.execute方法的实现中,会借助PropertyProviders来读取用户在控制台输入的MySQL相关的链接配置信息,用于创建相应的数据库和表结构;以及相应的配置文件。
  1. 项目地址

猜你喜欢

转载自blog.csdn.net/lqzkcx3/article/details/80634219
cat