github 原文链接:AnyPlugin · topling/rockside Wiki
作者:topling
ToplingDB 是 topling 开发的 KV 存储引擎,fork 自 RocksDB,进行了很多改造,也修改了很多 RocksDB 的 bug,其中有几十个修改也给上游 RocksDB 发了 Pull Request,让即便不使用 ToplingDB 的用户也能受益
ToplingDB 实现了完善的插件化体系,以及内嵌的 WebView,用来对 DB 的运行状态进行可视化观测。
基于 AnyPlugin 实现对任意内容的 HTML 展示
为了基于 AnyPlugin 实现对任意内容的 HTML 展示,我们需要以下几个步骤
- 创建一个新的 .cc/.cpp/.cxx 文件(在你想要的位置);
- 定义 AnyPlugin 的派生类;
- 在派生类中实现两个 AnyPlugin 中的纯虚函数;
- 注册插件;
- 重新编译项目;
- 修改 json 文件;
- 运行项目,即可在浏览器中看到我们展示的内容。
- 进阶:以表格的形式展示 json 文件。
1. 创建一个新的 .cc/.cpp/.cxx 文件
在我们想的一个位置,新建一个 .cc/.cpp/.cxx 文件,用于编写我们的 HTML 展示插件。
在这个示例中,我们新建一个 HtmlShowExample.cc 文件。
加载我们会用到的头文件 #include "topling/side_plugin_factory.h"。
2. 定义 AnyPlugin 的派生类
AnyPlugin 是一个纯抽象类,其中包括 Update 和 ToSring 两个函数需要派生类实现。
首先我们定义一个 AnyPlugin 的派生类 HtmlShowExample,并且实现其的两个纯虚函数如下:
#include "topling/side_plugin_factory.h"
namespace rocksdb {
class HtmlShowExample : public AnyPlugin {
public:
void Update(const json&, const SidePluginRepo&) {}
std::string ToString(const json& dump_options, const SidePluginRepo&) const {}
};
} // namespace rocksdb
注意
- 在我们实现 HTML 展示时,不会用到 Update 函数,但是依然需要将其定义出,且为空。
- 在 ToString 函数中,我们仅需要传入其第一个参数 dump_options,但我们可以不对这个参数做任何操作。
3. 在派生类中实现两个 AnyPlugin 中的纯虚函数
Update 函数在此处不会用到,定义为空,我们不再理会,下面说 ToString 函数。
ToString 函数的返回值是 std::string 类型,其返回的 string 字符串,会被无差别地打印在浏览器中。
我们修改上面的 ToString 函数如下:
std::string ToString(const json& dump_options, const SidePluginRepo&) const {
return "This is an example of HTML show.";
}
这样,我们就实现了一个简单的 HTML 展示插件。
4. 注册插件
在 HtmlShowExample.cc 文件的末尾,topling 的 namespace 内,输入下面的代码:
ROCKSDB_REG_DEFAULT_CONS(HtmlShowExample, AnyPlugin);
ROCKSDB_REG_AnyPluginManip("HtmlShowExample");
ROCKSDB_REG_DEFAULT_CONS(param1, param2, param3): 此宏适用于没有用到(const json&, const SidePluginRepo&)构造参数的派生类。param1: 即将在 json 中写入的插件注册名字,string 类型,需要加双引号。param2: 即将在 json 中写入的插件注册类名。param3: 填入父类,这里是 AnyPlugin。- 注:如果
param1和param2的值是相同的,则可以省略param1,如上代码所示。 ROCKSDB_REG_AnyPluginManip(param1): 用于注册派生于 AnyPlugin 类的插件。- 参数为即将在 json 中写入的插件注册名字,即与
ROCKSDB_REG_DEFAULT_CONS的param1相同。
5. 重新编译项目
首先,我们需要把我们自定义的 HtmlShowExample.cc 添加到编译文件中,可能是 CmakeLists.txt,可能是 Makefile,也可能是一个编译脚本,这取决于你的项目的编译方法。然后,重新编译项目。
6. 修改 json 文件
找到我们的 [[Home]],添加字段
"AnyPlugin": {
"html-show-example": "HtmlShowExample"
},AnyPlugin: 我们插件继承的抽象类名。html-show-example: 我们插件对象的变量名。HtmlShowExample: 在 json 中写入的插件注册名字,与上述ROCKSDB_REG_DEFAULT_CONS的param1相同。
7. 运行项目
运行编译后的项目,在浏览器中输入
192.168.31.2:8088/AnyPlugin/html-show-example
即可看到浏览器打印出了我们代码中 ToString 函数返回的值 "This is an example of HTML show."。
192.168.31.2:8088: 我们数据库的地址与监听端口,监听端口号在 json 配置文件的http字段中的listening_ports字段中设定。AnyPlugin: 我们使用的抽象类。html-show-example: 我们插件对象的变量名。

8. 进阶:以表格的形式展示 json 文件
直接展示 string 文件的可读性是很差的,我们可以把需要展示的配置项,存到一个 json 对象中,并通过 JsonToString 函数,将 json 对象中的内容,以表格的形式打印到浏览器中。
修改我们之前的 ToString 函数代码,其他部分保持不变。
std::string ToString(const json& dump_options, const SidePluginRepo&) const {
json js;
js["key1"] = "This is an example of HTML show 1.";
js["key2"] = 2;
return JsonToString(js, dump_options);
}
运行编译后的项目,在浏览器中输入
192.168.31.2:8088/AnyPlugin/html-show-example?html=1
html=1:url 参数,表示将展示内容以表格的形式打印。
关于更多 url 参数信息、HTML 展示信息,查看文档 [[WebView]]。
现在,我们可以在浏览器中看到,我们以表格形式输出的内容了。

几个实际的例子
- 通用
- HtmlTextUserKeyCoder:以 Html 方式展示 C 语言字符串
- 例如换行符 \n 会展示为高亮文本
\n,\t 展示位高亮\t - DbBenchUserKeyCoder:跑 db_bench 时,按照 db_bench key 格式显示
- SysInfoShower:显示系统信息(CPU 内存等),可实时刷新
- Todis(外存版 Redis,基于 ToplingDB)
- TodisConfShowPlugin:显示 todis 配置信息(在线 demo)
- BuildVersionsShowPlugin:显示 Todis 各模块(git)版本信息(在线 demo)
- Todis 中的 string 就可以直接使用 HtmlTextUserKeyCoder 来展示(定义,引用,效果)




