暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ToplingDB:怎样展示任意 WebView

原创 Topling 2022-11-15
262
github 原文链接:AnyPlugin · topling/rockside Wiki
作者:topling

ToplingDB 是 topling 开发的 KV 存储引擎,fork 自 RocksDB,进行了很多改造,也修改了很多 RocksDB 的 bug,其中有几十个修改也给上游 RocksDB 发了 Pull Request,让即便不使用 ToplingDB 的用户也能受益

ToplingDB 实现了完善的插件化体系,以及内嵌的 WebView,用来对 DB 的运行状态进行可视化观测。

基于 AnyPlugin 实现对任意内容的 HTML 展示

为了基于 AnyPlugin 实现对任意内容的 HTML 展示,我们需要以下几个步骤

  1. 创建一个新的 .cc/.cpp/.cxx 文件(在你想要的位置);
  2. 定义 AnyPlugin 的派生类;
  3. 在派生类中实现两个 AnyPlugin 中的纯虚函数;
  4. 注册插件;
  5. 重新编译项目;
  6. 修改 json 文件;
  7. 运行项目,即可在浏览器中看到我们展示的内容。
  8. 进阶:以表格的形式展示 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]]。

现在,我们可以在浏览器中看到,我们以表格形式输出的内容了。

几个实际的例子

  1. 通用
    1. HtmlTextUserKeyCoder:以 Html 方式展示 C 语言字符串
      1. 例如换行符 \n 会展示为高亮文本 \n,\t 展示位高亮\t
    2. DbBenchUserKeyCoder:跑 db_bench 时,按照 db_bench key 格式显示
    3. SysInfoShower:显示系统信息(CPU 内存等),可实时刷新
  2. Todis(外存版 Redis,基于 ToplingDB)
    1. TodisConfShowPlugin:显示 todis 配置信息(在线 demo)
    2. BuildVersionsShowPlugin:显示 Todis 各模块(git)版本信息(在线 demo)
    3. Todis 中的 string 就可以直接使用 HtmlTextUserKeyCoder 来展示(定义引用效果
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论