InfluxDB-与IndluxDB进行交互、InfluxDB命令行工具、JAVA操作InfluxDB

如何与 InfluxDB 交互

InfluxDB 启动后,会向外提供一套HTTP API。外部程序可以也仅能通过 HTTP API 与InfluxDB 进行通信。我们后面要讲到的 influx 命令行、Web UI 和各编程语言的客户端库, 其内部都是封装的对HTTP API 的调用。

MMSIZE

所以各种客户端同 InfluxDB 交互时,都离不开 API TOKEN。因为 HTTP 是一种支持官方且简单的协议,这也方便了用户进行二次开发。

InfluxDB HTTP API

InfluxDB 提供了丰富的 API 和客户端库,可以随时和你的应用程序集成。你也可以随时使用 curl 和 ApiPost、Postman 这类程序来测试API 接口。

准备token

在你想尝试使用 HTTP API 与 InfluxDB 进行交互时,首先应该用账号和密码登到 Web UI 上选择或创建一个对应的 API TOKEN。我们使用 tony’s Token,这是一个具有全部权限的API Token,实际开发时应谨慎使用,防止 Token 被劫持出现安全问题。

MMSIZE

在后面的操作中,你每次发出HTTP 请求时都需要在请求头上携带 token。

准备接口测试工具

在 shell 中你可以使用 curl 测试接口,不过带图形界面的程序终归是更易用一些。

这里选用 ApiPost 这一专门的接口测试软件进行演示。ApiPost 是一款国产软件,对标的是 google 的 postman,

(1)安装 ApiPost

可以直接访问 ApiPost 的官网下载对应系统的安装包 https://www.apipost.cn/

(2)准备调试环境

在左侧的目录栏上有一个文件夹按钮,点一下,创建一个新的目录。

MMSIZE

给目录命名,同时为这个目录添加一个公用 header。这样这个目录下的所有接口都会自动带上这个 header,不需要我们再一个个地手动设置了。我们之前提到过,要想使用 InfluxDB 的API,请求头上必须要加上 token。所以,我们就把 token 设为公用 header。

MMSIZE

接口的授权

Token 授权方式

现在我们先来看一下授权是否是成功的。

  • 首先,点击左侧的目录名称,右键会弹出一个菜单栏。点击新建接口:

    MMSIZE

  • 首先你可以自定义一个接口的名称, 然后在接下来的 URL 栏里, 填写http://localhost:8086/api/v2/authorizations 点击发送。

    MMSIZE

  • 接下来我们可以看到页面的下方弹出了返回的数据。这个接口返回的数据我们InfluxDB 上目前所有的Token 信息,包括他们拥有什么权限。

    MMSIZE

    成功看到数据,说明我们的 Token 是有效的。

  • 最后记得点击保存,或者使用 Ctrl+S 快捷键。这样,我们目录下面才会真正留下一个接口。方便你日后访问。

登录授权方式

登录授权其实是留给 Web UI 用的,但是你也可以尝试用这种方式获取授权。InfluxDB 服务端会判断你的 cookie 是否合法、以及是否过期。符合要求的话就能调用接口实现一系列操作。

进行接下来的操作前,记得关闭目录下的公用请求头。

(1)创建登录会话

  • 在 InlfluxDB api v2 目录下创建一个新的接口

  • 给接口自定义一个名称

    MMSIZE

  • 请求的类型选择 POST

  • 填写目标的 URL

  • 配置登录信息

    在请求连接的下方点击一下“认证”按钮

    在认证方式上选择Basic auth 认证

    在下方的输入框上输入 InfluxDB 的用户名和密码,这里是 tony, 11111111。

  • 点击发送。

(2)登录原理

1)什么是 Basic auth 认证?

你常见的认证方式可能是将用户名和密码放到 post 请求的请求体中,再发送给服务端进行认证。不过我们刚才并没有在请求体里放用户名和密码,而是配置了一个叫Basic auth 认证的东西。这个功能叫做 http 基本认证,是http 协议的一部分。

基本认证的默认实现是:

  1. 把用户名和密码用英文冒号拼起来,也就成了 tony:11111111

  2. 再将拼起来的字符串用 Base64 算法编码。( tony:11111111 的 Base64 编码为dG9ueToxMTExMTExMQ==)

  3. 给编码结果 dG9ueToxMTExMTExMQ==,添加一个前缀 Basic 所以最后的结果就是。

     Basic dG9ueToxMTExMTExMQ==
    
  4. 把这个字符串放到一个 key 为 authorization 的请求头中,发送给服务端。 

2)查看请求头

所以,你可以在页面下方查看这次请求的请求头,如图所示,它就是我们基本认证的结晶。

MMSIZE

在众多的编程语言中,base64 算法都会作为标准库的一部分存在。你可以在 python 中验证 tony:11111111 的 base64 编码结果。

MMSIZE

3)查看响应头

我们还可以看一下这次请求的响应头,你可以看到响应头上有一个 key 为 set-cookie 的键值对。set-cookie 键其实会向浏览器,或者编程语言中的 Session 对象添加一个全局cookie。

MMSIZE

以后每次的请求就会自动携带这个 cookie,以后 InfluxDB 的接口服务就会依据这个cookie 来判断请求方是否有权限进行相关操作。ApiPost 也有记录 cookie 的功能,你可以在ApiPost 的Cookie 管理器中,查看已经设置的全局 cookie。

4)查看 Cookie 管理器

  1. ApiPost 的Cookie 管理器在页面的最上方。

    MMSIZE

  2. 弹出的窗口就是 Cookie 管理器。下面首先会列出你的域名或者 host,这里是 localhost,点一下,可以看到它下面的全部 cookie。

    MMSIZE

  3. 再点一下 influxdb-oss-seesion,就可以看到这个 cookie 的内容可,可以看到它跟刚才响应头的set-cookie 内容一模一样。

(3)验证授权效果

接下来,我们会到之前的列出所有 token 的接口里去,在目录共享请求头关闭的前提下,调用 api。

1)直接点击发送按钮

MMSIZE

2)响应码为 200,且成功出现了数据,说明我们现在是有权限的,可以点击下面的请求头按钮,看一下这次请的请求头。

MMSIZE

这里大家还要注意两点:

  • http 基本认证默认实现的安全问题。我们前面讲过,http 基本认证其实就是把 tony:11111111 的 Base64 编码放在的请求头上, 但是 Base64 只是一种数据的编码方式,它不是加密算法也不是信息摘要算法。这也就是说, 一旦我的请求被拦截,那对方就能看到我的用户名和密码,对我实施中间人攻击。所以,从安全角度考虑,不应当在开发时将 Web UI 暴露在公网上。而且集成应用时, 授权也千万不可以用登录方式,应该全部使用 token。

  • Cookie 有过期时间。当你和别的应用进行集成时,也不应该使用登录的方式,登录授予的 cookie 是有过期时间的, 大概半小时, cookie 就会过期。用户必须重新登录拿到新的 cookie 才能和InfluxDB 继续交互。

接口安全:配置 HTTPS

HTTP 是一种纯文本通信协议。早期很多互联网协议都是使用明文的方式来传输数据的。这样,最大的问题就是如果我们的网络请求被劫持,那么劫持的一方可以看到我们请 求中的所有数据(包括 Token),这样就算是使用 Token 进行授权比 user:password 安全一些, 但泄漏 Token 也会带来很多麻烦事。所以,InfluxDB 官方强烈建议我们开启HTTPS。

(1)使用 openssl 生成证书

下面是官方给出的命令模板:

sudo openssl req -x509 -nodes -newkey rsa:2048 \
 -keyout /etc/ssl/influxdb-selfsigned.key \
 -out /etc/ssl/influxdb-selfsigned.crt \
 -days <NUMBER_OF_DAYS>

自己跑的时候可以参考做一下调整命令解释:

  • req -x509,指定生成自签名证书的格式。

  • -newkey rsa:2048,生成证书请求或者自签名整数时自动生成密钥,然后生成的密钥名称由 keyout 指定。rsa:2048 意思是产生rsa 密钥,位数是 2048。

  • -keyout,指定生成的密钥名称。

  • -out,证书的保存路径

  • -days,证书的有效期限,单位是 day(天),默认是 365 天。

现在,我们执行下面的命令:

openssl req -x509 -nodes -newkey rsa:2048 \
 -keyout /opt/module/influxdb2_linux_amd64/selfsigned.key \
 -out /opt/module/influxdb2_linux_amd64/selfsigned.crt \
 -days 60

执行这个命令后,会让你输入更多信息。你可以直接全部敲回车,将这些字段留空。不影响生成我们有效的证书文件。

执行完这个命令后,/opt/module/influxdb2_linux_amd/ 目录下会产生两个文件,一个是selfsigned.crt(证书文件)另一个是 selfsigned.key(密钥文件)。而且他们的有效期是 60 天至此,你的密钥文件就成功生成了!

(2)确保启动 influxd 的用户对密钥整数文件有读取权限

(3)启动 influxd 服务时指定证书和密钥路径

使用 influxd 命令启动 InfluxDB 服务时,记得指定一下整数的密钥的路径。

./influxd \
	--tls-cert="/opt/module/influxdb2_linux_amd64/selfsigned.crt" \ 
	--tls-key="/opt/module/influxdb2_linux_amd64/selfsigned.key"

(4)验证 HTTPS 协议是否生效

回到我们的 ApiPost6,再次向 http:/localhost:8086/api/v2/authorizations 发送GET 请求。

可以看到,我们使用 http 的协议头再进行访问,响应的状态码为 400,并提示我们向HTTPS 服务器发送了一个HTTP 请求。现在我们将URL 前面的 http 改成 https 再试一下。

MMSIZE

如果你也能达到这个效果,说明 influxd 的 ssl/tls 认证已经开启,服务端和客户端传递的将会是加密数据而非明文数据。

(5)记得更改已存在的 telegraf 配置和 Scrapers

我们之前在 WebUI 中配置过 Telegraf 配置和指标的抓取任务,当时我们配的是 http 协议的URL ,现在也需要全部换成 https。

其他生产安全考虑

HTPS 是 InfluxDB 开发时,最基础也是最该考虑的安全措施,除此之外 InfluxDB 在设计时还为用户考虑了其他的安全措施,这里给大家简单地介绍一下,不再进行操作演示。

(1)IP 白名单

可以参考: https://docs.influxdata.com/influxdb/v2.4/security/enable-hardening/

这个 IP 白名单并不是限制谁可以访问我的。

而是限制,我 InfluxDB 的查询可以访问谁的。因为 FLUX 语言具有发送网络请求的能力,你可以使用InfluxDB 的相关配置限定,FLUX 脚本可以向哪些地址发送请求。

(2)机密管理

这一块的内容可以参考:https://docs.influxdata.com/influxdb/v2.4/security/secrets/

假如,我们的自己的应用程序和 InfluxDB 集成,而用到的一段 FLUX 脚本刚好需要使用某个第三方服务的用户名和密码(比如查询 mysql)。

比如:

import "influxdata/influxdb/secrets"
import "sql"
sql.from(
    driverName: "postgres",
    dataSourceName: "postgresql://tony:11111111@localhost",
    query:"SELECT * FROM example-table",
)

应用和 InfluxDB 服务之间走的也是 HTTP 通信,那么写在脚本中的用户名和密码是有可能泄漏的。这个时候,你可以把用户名和密码用键值的方式放到 InfluxDB 管理起来,

然后,你就可以在脚本里用 key 的方式在 InfluxDB 里获取 tony 的用户名和密码了。

import "influxdata/influxdb/secrets"
import "sql"
username = secrets.get(key: "POSTGRES_USERNAME")
password = secrets.get(key: "POSTGRES_PASSWORD")
sql.from(
    driverName: "postgres",
    dataSourceName: "mysql://${username}:${password}@localhost",
    query:"SELECT * FROM example-table",
)

这样,我们 Mysql 的用户名和密码,就没有在网络上泄漏的风险了。

(3)token 管理

可以参考:https://docs.influxdata.com/influxdb/v2.4/security/tokens/

我们之前讲过在Web 上去创建 token。这里再给大家补充一下Token 的类型。

  • 操作者 Token。操作者令牌有跨越组织的管理权限,它对 InfluxDB OSS 2.x 上的所有组织和资源有完全的读写访问权限。某些操作必须需要操作员权限(比如 查看服务器配置)。操作者 Token 是在 InfluxDB 初始化设置的过程中创建的。要想再创建一个操作者Token,就必须使用先有的操作者 Token。

    由于操作者 Token 对 InfluxDB 中所有的组织具有完全的读写访问权限。因此 InfluxDB 建议为每个组织创建一个全权限 Token,并用这些 Token 来管理 InfluxDB。这有助于防止组织间不小心误操作对方资源。

  • 全权限 Token。对单个组织中所有资源的完全读取和写入访问权限

  • 读**/**写 Token。对组织中特定的存储桶进行读取和写入。

(4)禁用部分开发功能

可以参考:https://docs.influxdata.com/influxdb/v2.4/security/disable-devel/

InfluxDB 的 API 中,有一部分是为了方便外部系统去监控和观测 InfluxDB 的状态和性能的。如果你觉得这部分可能影响安全,那么你可以随时把它们禁了。

比如:

  • /metrics,上文给大家演示过,这里面有各种监控 InfluxDB 运行的指标

  • Web UI,用户的图形界面交互。

  • /debug/pprof,这个接口里面是 Go 语言程序的运行时指标,比如堆内存用了多少, 有多少线程数等等。

如何使用API 文档

可以直接在浏览器上访问 http(s)😕/localhost:8086/docs ,这样可以直接看到对应当前InfluxDB 版本对应的 API 文档。

另外也可以在 InfluxDB 官网上查看在线文档。 https://docs.influxdata.com/influxdb/v2.4/api/

如果你访问的是本地部署的 InfluxDB,那么访问 http://localhost:8086 还能下载相应的OpenAPI 文档。

MMSIZE

访问http://localhost:8086/doc页面的顶部有一个 Download 按钮,点一下。浏览器里会说下载了一个json 文件。

可以打开看一下,这其实是一个符合 OpenApi3.0 格式的 API 文档定义文件。现在的ApiPost 和 Postman 对这一格式都能自动生成接口测试。此处我们拿 postman 作为演示。

示例:Postman 快速生成测试项目

(1)使用 postman 导入 openapi

MMSIZE

在 postman 的左侧目录上方,有一个 import 按钮,点一下,会弹出一个对话框。

MMSIZE

可以看到,这里他说支持上传 OpenApi 格式的文件。点击 Upload Files 按钮,选择刚才下载的 swagger(2).json。最后点击右下角的Import 按钮。

MMSIZE

(2)查看导入效果

MMSIZE

可以看到,InfluxDB 中的全部 API 已经导入到 postman 中了。但是这里没有文档中的说明性文字了。找回他们的方法是在 postman 的左边找到 draft,点击一下,再点击右方的Documentation。如下图所示:

MMSIZE

MMSIZE

现在,你就可以看到既能阅读,又能立刻进行测试的 API 文档了。

使用 influx 命令行工具

从 InfluxDB 2.1 版本之后,influx 命令行和 InfluxDB 数据库服务程序是分开打包的, 所以安装 InfluxDB 并不会附带 influx 命令行工具。用户必须单独安装 influx 命令行工具。

influx 命令行工具包含很多管理 influxDB 的命令。包括存储桶、组织、用户、任务等。从 2.1 版本之后,安装 InfluxDB 不会附带 influx 命令行工具,现在 influx 工具和InfluxDB 在源码上也已经分开维护了,下载时需要注意对上版本。

安装influx 命令行工具

这次,我们另辟蹊径,不看着官方文档安装了,改从 github 上下载安装。

如何去找开源项目的发行版

(1)什么是发行版

这一部分的内容可以详细参考 Gitee 官方文档 https://gitee.com/help/articles/4328#article-header0

所谓发行,就是这个开源项目进行到一定程度,各种特性和功能已经趋于完善和稳定, 到了可以出一个阶段性版本的时候了。

通常来说,github 或者 gitee 上放的是一个项目的源码,但是源码需要经过编译之后才能运行的,那么当作者觉得自己的项目,目前开发进度差不多,应该没什么坑的时候,他就可以自己创建一个发行版。这个时候,作者需要自己上传一些附件,比如 v1.0.0 的编译后程序,v1.0.0 的文档和源码等。

规范的发行信息里面应该还有比如 changelog(修改记录)这些信息,告诉用户,这个版本相比上个版本,增加了哪些新的功能,又修复了哪些 bug。

(2)如何去找一个项目的发行版

首先,你可以去访问官网,通常来说一个开源项目通常应该有它自己的官网,在它的官网上,应该可以找到它的历史版本。但是,有些官网就是新版发布了之后就下架旧版的下载资源,比如InfluxDB 就是这么干的。

另外,通常开源项目都会在 github 或者 gitee 上去维护一个版本的时间线。打开你关注的开源项目首页,如图所示是 InfluxDB 的项目首页。

点击右下角的Release。

MMSIZE

可以看到这个框架从盘古开天辟地至今的所有发行版。通常,在一个版本记录的最下方,会有这个版本对应的已编译好的可执行程序和源码。你可以把它下载下来使用。

MMSIZE

去找 influx 命令行工具的开源项目

大多数时候,你会在 github 上通过搜索项目名称的方式来从查找你关注的项目。但是如果项目本身的热度不高,那它可能不会出现在搜索结果的第一页里。最后你要向后翻好久才能找到你的项目。

当前 InfluxDB 的热度还算行,但是它周围对应的工具热度就不一定高了。这个时候, 你可以将目光聚焦于单个公司下的所有项目。

MMSIZE

找到 influx-cli 项目,打开之。https://github.com/influxdata/influx-cli

下载安装发行版

点击Releases 链接,下载v2.4.0:

MMSIZE

往下看页面,找到linux-amd64.tar.gz:

MMSIZE

下载到/opt/software/。

解压到/opt/module/:

tar -zxvf influxdb2-client-2.4.0-linux-amd64.tar.gz -C /opt/module/

配置influx-cli

(1)创建配置

influx 命令行工具是你每执行一次操作时,调用一次命令。并不是开启一个持续性的会话。而 influx 其实底层还是封装的对 InfluxDB 的服务进程的 http 请求。也就是它还是需要配置 Token 什么的来获取授权。

所以,为了避免以后每次请求的时候都在命令行里面写一遍 token。我们应该先去搞个配置文件。

使用下面的命令可以创 influx 命令行的配置。

./influx config create --config-name influx.conf \
--host-url http://localhost:8086 \
--org atguigu \
--token ZA8uWTSRFflhKhFvNW4TcZwwvd2NHFW1YIVlcj9Am5iJ4ueHawWh49_jszoKybEymHqgR5mAWg4XMv4tb9TP3w== \
--active
  • 这个命令其实会在~/.influxdbv2/目录下创建一个 configs 文件,这个文件中,就是我们命令行中写的各项配置。如图所示:

    MMSIZE

(2)更改配置

如果你中途配置错误了,再使用上文的命令,它会说这个配置已经存在。

也就是说,在 /home/dengziqi/.influxdbv2/configs 文件中,[“name”]配置快不能重复必须全局唯一。

这个时候如果你想调整配置,应该把 create 换成update。也就是

./influx config update --config-name influx.conf xxxxxxxx

(3)在多份配置之间切换

我们现在用下面的命令再创建一个配置,直接复制 influx.conf 中的内容,把名字修改成 influx2.conf:

./influx config create --config-name influx2.conf \
--host-url http://localhost:8086 \
--org atguigu \
--token ZA8uWTSRFflhKhFvNW4TcZwwvd2NHFW1YIVlcj9Am5iJ4ueHawWh49_jszoKybEymHqgR5mAWg4XMv4tb9TP3w== \
--active

命令成功执行后,再次打开 ~/.influxdbv2/configs 文件。

MMSIZE

可以看到 configs 中的文件内容变了,多了一个名为[“influx2.conf”]的配置块,而且, 旧的[“influx.conf”] 从 active=“true” 变成了 previous=“true”,同时[“influx2.conf”] 中有一个active=“true” 的键值对。说明,如果现在使用 influx-cli 执行操作,那会直接使用influx2.conf 配置块中的内容。

你还可以使用下面的命令切换当前正在使用的配置。

influx config influx.conf

MMSIZE

再次查看~/.influxdbv2/configs 文件

MMSIZE

(4)删除一个配置

influx2.conf 现在对我们来说是多余的了,现在,我们将它删除掉。使用下面的命令删除 influx2.conf。

./influx config remove influx2.conf

在看~/.influxdbv2/config文件中[“influx2.conf”]消失了。而且,我们的 influx.conf 自动变成了 active=true。

influx-cli 命令罗列

我们已经知道 influx-cli 背后封装的是对 InfluxDB HTTP API 的请求。那么 influx-cli 有多少功能基本上就取决于它封装了多少命令。

详情可以参考:https://docs.influxdata.com/influxdb/v2.4/reference/cli/influx/

命令直译解释
apply应用应用一个 InfluxDB 模板
auth认证管理API Token 的相关
backup备份备份数据(只支持InfluxDB OSS)
bucket管理存储桶的命令
bucket-schema桶模式管理存储桶模式的命令()
completion完成生成完成的脚本
config配置管理配置文件
dashboards仪表盘列出所有的仪表盘
delete删除在 InfluxDB 中删除数据点。
export导出将 InfluxDB 中的资源导出为模板
help帮助查看任何命令的帮助手册
org组织组织管理的命令
ping访问 InfluxDB 的/health api 作为健康状态检查
query查询执行一个 FLUX 脚本的查询
restore恢复从备份出来的数据恢复(只有 InfluxOSS 支持)
scripts脚本管理 InfluxDB 上的交互本(只有 InfluxDB Cloud 支持)
secret机密管理机密
setup设置命令行版本的初始化操作,首次安装 InfluxDB 时的设置用户名、密码、组织、存储桶等等。
stacks堆栈你可以将堆栈理解为一个 InfluxDB 模板的实例。你可以使用stacks 管理这些实例。
task任务任务管理命令
telegrafstelegrafs管理 telegraf 配置的命令
template模板总结和验证 InfluxDB 模板
user用户管理用户相关的命令
v1版本 1使用 InfluxDB V1 兼容的 API
version版本打印 influx-cli 的版本
write向 InfluxDB 写数据

JAVA操作 InfluxDB

InfluxDB 客户端可以参考:https://github.com/influxdata/influxdb-client-java

(1)创建一个 maven 项目

这里我创建了一个名为 java4influx 的 maven 项目

(2)导入 maven 依赖

在 pom.xml 里加入如下依赖。

<dependencies>
    <dependency>
        <groupId>com.influxdb</groupId>
        <artifactId>influxdb-client-java</artifactId>
        <version>6.5.0</version>
    </dependency>
</dependencies>

刷新一下 maven,下载依赖。

(3)创建一个 package

在 src/main/java 下创建一个 package。这里名为com.atguigu.influxdb.client。

示例:查看InfluxDB 健康状态

  • 创建 ExampleHealthy 类。

  • 创建客户端对象

    influxdb-client-java 内部其实封装的是各种 HTTP 请求,所以 token,org 什么 HTTP API 上需要的东西,在创建客户端的时候都需要考虑。

    MMSIZE

    从上图可以看到 InfluxDBClientFactory.create 方法其实有多种重载。这是因为不同的接口它需要的权限和操作的范围不同。比如一个读写权限的 token,它只能对某个存储桶进行操作,那么建立连接时就应该指定 bucket,也就是使用下图的重载。

    但如果你用的是操作员 token,希望完成一些创建组织,删除用户的操作,那么就不应该在创建连接时指定存储桶。此时,应该使用框出来的重载。

    不过、检查 InfluxDB 的健康状态不需要任何权限和 token。此时,我们只需指定一个URL,那就可以使用下图所示的重载了。

    MMSIZE

    这里是在 Ubuntu 上演示,目标 URL 是 http://localhost:8086。所以最终代码如下。

    public class ExampleHealthy{
        public static void main(String[] args){
            InfluxDBClient influxDBClient = InfluxDBClientFactory.create("http://localhost:8086");
        }
    }
    

    InfluxDBClient 对象就是我们的客户端对象。InfluxDBClient 可以返回各种 Api 对象。如下图所示。这体现了 java 对 InfluxDB HTTP API 的封装。

    MMSIZE

  • 调用 API

一些简单的 api,也可以通过 InfluxDBClient 对象直接调用。比如我们的检查 InfluxDB健康状态,就可以直接调用 InfluxDBClient 对象的ping 方法。如下所示。

System.out.println(influxDBClient.ping());
  • 运行

    ping 方法会返回一个布尔值。如果 InfluxDB 可以 ping 通,那么就会得到 true,否则返回 flase,并记录一条失败日志。

  • 补充

    在之前的版本,有一个测试 InfluxDB 是否健康的 API 叫做 health,不过现在这个接口已经被标记为废弃。health 方法返回一个 HealthCheck 对象,相对而言,对这个对象的处理比直接处理布尔值要麻烦很多。在以后的版本,提倡用 ping 方法检查健康状态。

示例:查询InfluxDB 中的数据

  • 创建一个 JAVA 类

    在 com.atguigu.influxdb.client 下创建一个新的java 类,ExampleQuery。

  • 创建 InfluxDB 客户端对象

    这次我们要操作 InfluxDB 中具体存储桶的数据,建立连接时,推荐选择图中的重载方法。

    MMSIZE

    这个方法需要 4 个参数:

    • url,InfluxDB 服务的URL,在老师这里就是 http://localhost:8086。

    • token,授权的 token,而且类型还必须得是char[ ]。

    • org,指定要访问的组织。

    • bucket,要访问的存储桶。

    现在,我们在ExampleQuery 下声明 4 个静态变量。如下图所示:

    MMSIZE

  • 获取查询 API 对象

    使用 InfluxDBClient 对象点一下,可以看到 InfluxDBClient 其实提供了两种 API。这也是为了兼容性来考虑的。InfluxQLQueryAPI 是 InfluxDB2.x 做的向前兼容。这里我们选择第一个方法,也就是getQueryApi,这意味着我们使用 v2 api 进行查询。

    MMSIZE

  • 了解查询 API

    概括性地说,QueryApi 对象下有两个方法query 和queryRaw。

    MMSIZE

    两个方法都需要传入一个 FLUX 脚本作为查询语句。但主要的不同点在于返回的结果上。

    • queryRaw 方法返回API 中的 CSV 格式数据(String 类型)。
    • query 方法视图将查询后的结果封装为各种对象(可以自己指定也可以使用 influxdb- client-java 提供的 FluxTable)。

    两个方法各有很多不同的实现,其中一大部分是用来制定连接参数的,比如你创建连接对象的时候没有制定org 和bucket,那么可以延迟到调用具体 api 的时候再指定。

  • query

    现在,我们先用 query 方法去查询一下 InfluxDB 中的数据,现在我们要查询 test_init存储桶最近 2 分钟的数据。代码如下:

    List<FluxTable> query = queryApi.query("from(bucket:\"test_init\") 
                                           |> range(start:-2m)");
    

    我们的查询结果List<FluxTable>其实对应了 FLUX 查询语言中的表流概念。我们可以打印一下query 变量。

    MMSIZE

    现在,我们只取第一个 FluxTable,看看里面有什么。

    之前我们讲 FLUX 的时候,有讲过表流和 groupKey 之间的关系。

    MMSIZE

    现在可以打印一下groupKey,看看里面有什么东西:

    MMSIZE

    这其实可以说明我们的整个表流是以_start, _stop, _field, _measurement 4 列为groupKey 分组的结果。

    现在,我们可以尝试打印一下数据。

    代码如下:

    MMSIZE

    结果如下:

    LSIZE

  • queryRaw

    创建了一个新类,叫 ExampleQueryRaw。代码复制的都是ExampleQuery 的。

    唯一不同的地方就是把 queryApi.query 改为了 queryApi.queryRaw。同时,query 变量的类型也从 List<FluxTable>变成了String。

    MMSIZE

    现在,我们将查询的结果打印一下。

    MSIZE

    可以看到,我们打印出了CSV 格式的数据,这是因为 InfluxDB HTTP API 本来在请求体中放的就是CSV 格式的数据。所以 QueryRaw 方法其实就是返回原始的CSV。

同步写和异步写的区别

同步写,就是当我调用写入方法时,立刻向 InfluxDB 发起一个请求,将数据传送过去, 而且当前线程会一直阻塞等待写入操作完成。

异步写,其实是我调用写入方法的时候,先不执行写入这个操作,而是将数据放入一个缓冲区。当缓冲区满了,我再真正地将数据发送给 InfluxDB,这样相当于实现了一个攒批的效果。

示例:同步写入 InfluxDB

(1)创建一个类

这次我们创建一个名为 ExampleWriteSync 的类,org,bucket,url,token 什么的还是复制之前例子中的,但是此处我们把 bucket 改为example_java。

总体代码如下:

public class ExampleWriteSync {
    private static String org = "atguigu";
    private static String bucket = "example_java";
    private static String url = "http://localhost:8086";
    private static char[] token ="ZA8uWTSRFflhKhFvNW4TcZwwvd2NHFW1YIVlcj9Am5iJ4ueHawWh49_jszoKybEymHqgR5mAWg4XMv4tb9TP3w==".toCharArray();
    public static void main(String[] args) {
        InfluxDBClient influxDBClient = 
            InfluxDBClientFactory.create(url, token, org, bucket);
    } 
}

(2) 获取 API 对象

InfluxDBClient 上有多种方法获取写操作 API 对象。 其 中WriteApiBlocking 是同步写入,WriteApi 是异步写入。

我们现在先使用getWriteApiBlocking 方法获取同步写入的API。

(3)有哪些写入方法

MMSIZE

简单归纳,写入API 给用户提供了 3 类方法写入数据。

  • writeMeasurement,用户可以写入自己的POJO 类

  • writePoint,influxdb-client-java 提供了一个 Point 类,用户可以将一条条数据封装为一个个 Point,写入 InfluxDB。

  • writeRecord,用户可以用符合 InfluxDB 行协议的字符串向 InfluxDB 写入数据。

另外,这三类方法都有与之对应的带 s 后缀的版本,表示可以一次写入多条。

(4)通过 Point 对象写入 InfluxDB

  • 构建 Point 对象

    使用下面的代码创建一个point 对象。

    Point point = Point.measurement("temperature")
     .addTag("location", "west")
     .addField("value", 55D)
     .time(Instant.now(), WritePrecision.MS);
    

    这是典型的构造器设计模式,measurement 是一个静态方法,它会帮我们 new 一个Point。addTag 和 addField 不再解释。最终的 time,我们通过第二个参数指定写入时间戳的精度。这里是将写入的时间精度确定为了毫秒,如果你传入了一个纳秒时间戳,但精度指明了毫秒,那超出毫秒的部分会被直接截断。

  • 将 point 写出

    使用下面的代码,直接将 point 写到 InfluxDB 中。记得在此之前创建 example_java 存储桶。

    writeApiBlocking.writePoint(point);
    
  • 验证写入结果

    执行程序后,在 InfluxDB DataExplorer 查看 example_java 里面有没有新的数据,并将它展示出来。

    MMSIZE

(5)通过行协议写入 InfluxDB

writeApiBlocking.writeRecord(WritePrecision.NS,"temperature,location=west value=60.0");

此处我们在行协议中省略时间戳,让 InfluxDB 自动帮我们把时间补上。

(6)通过 POJO 类写入 InfluxDB

  • 添加一个静态内部类

    private static class Temperature {
    }
    
  • @Measurement 注解

    给静态内部类加一个注解。

    @Measurement(name = "temperature")
    private static class Temperature {
    }
    

    @Measuremet 注解必须加到类上,表示这个类对应 InfluxDB 中的哪个测量名称。

  • 添加成员变量

    @Measurement(name = "temperature")
    private static class Temperature {
        String location;
        Double value;
        Instant time;
    }
    
  • @Column 注解

    @Column 注解只能用在成员变量上。

    @Column 有 4 种实现,如下图所示:

    MMSIZE

    你可以将一个成员变量指定为 tag、measurement、timestamp 还是 field。最终代码如下:

    @Measurement(name = "temperature")
    private static class Temperature{
        @Column(tag = true)
        String location;
        @Column
        Double value;
        @Column(timestamp = true)
        Instant time;
    }
    
  • 创建一个 Temperature 对象并给其属性赋值

    Temperature temperature = new Temperature();
    temperature.location = "west";
    temperature.value = 40D;
    temperature.time = Instant.now();
    
  • 写到 InfluxDB

    现在,我们将这个POJO 类的对象写到 InfluxDB:

    writeApiBlocking.writeMeasurement(WritePrecision.NS,temperature);
    

示例:异步写入 InfluxDB

(1)创建一个类

创建一个名为 ExampleWriteAsync 的类,一样还是复用我们之前的 org、bucket、url 和token。并创建 InfluxDBClient 对象,基础代码如下图所示。

MMSIZE

(2)获取 API 对象

getWriteApi 方法已经被标记为弃用了,现在鼓励使用的是 makeWriteApi 方法。实际上,在目前版本,getWriteApi 的内部实现已经是直接调用makeWriteApi 了。

influxDBClient.makeWriteApi();
  • writeApi 里有一个缓冲区,这个缓冲区的大小默认是 10000 条数据。

  • 虽然有缓冲区但是 writeApi 写出数据并不是一次把整个缓冲区都写出去,而是按照批次(默认是 1000 条)的单位来写。

  • 当产生被压或者写入失败时,守护线程会自动重试写入数据。

  • influxdb-client-java 为我们提供了一个 WriteOption 对象,调用 makeWriteApi 时可以传入这个对象,缓冲区的大小,批的大小,刷写的间隔我们都是可以进行明确指定的。

(3)编写写入代码

和之前的同步写入一样,writeApi 对象也有writeRecord、writePoint、wirteMeasurement 多种写入方法,这里不再赘述。这里,我们只用最简单的writeRecord 方法插入一条数据,把代码跑通。

writeApi.writeRecord(WritePrecision.NS,"temperature,location=north value=60.0");

(4)验证写入结果(写入失败)

此时,我们运行的代码如下图所示。

在 Web UI 上打开Data Explorer 查看写入结果。

MMSIZE

可以看到,这里没有出现我们刚才的数据,这表示我们刚才的写入失败了。但是,我们的 java 程序没有报错。

这是因为 WriteApi 会使用一个守护线程,帮我们管理缓冲区,它会在缓冲区满或者距离上次写出数据过 1 秒时将数据写出去。我们刚才就放了一条数据,缓冲区没满、write 方法调用完程序就立刻退出了,所以后台线程压根就没有做写的操作。

(5)修改代码

现在,有两种方式让守护线程执行写的操作。

  • 手动触发缓冲区刷写

     writeApi.flush();
    
  • 关闭 InfluxDBClient

     influxDBClient.close();
    

这里,我们先用第一种。修改后的代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t5750n0s-1688632540137)(https://s1.imagehub.cc/images/2023/07/03/image-20230505191752599.png#pic_center)]

运行,之后去Data Explorer 上查看结果。

兼容V1 Api

这里只做简单的介绍。

使用 InfluxDBClientFactory 创建 Client 对象时,调用 createV1 方法。

MMSIZE

这个时候你获取的就是兼容 V1 Api 的Client 对象。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值