中间件学习--InfluxDB部署(docker)及springboot代码集成实例

一、需要了解的概念

1、时序数据

时序数据是以时间为维度的一组数据。如温度随着时间变化趋势图,CPU随着时间的使用占比图等等。通常使用曲线图、柱状图等形式去展现时序数据,也就是我们常常听到的"数据可视化"。

2、时序数据库

非关系型数据库,以时间作为数据主键,专门用来存储时序数据。

3、时序数据库特点

(1)、时序数据库能存储海量数据。数据特点就是冷热差别明显,一般近期产生的数据为热数据,产生时间较远的数据为冷数据,冷数据被压缩放到磁盘里去来节省空间。

(2)、写入性能极优,时序数据库通常都是采用LSM Tree 的变种,顺序写磁盘来增强数据的写入能力。通常,关系型数据库采用 B+树数据结构,在数据写入时,有可能会触发叶裂变,从而产生了对磁盘的随机读写,降低写入速度。

(3)、低延时、高并发查询:通过索引降低查询延时,通过缓存等技术提高数据并发能力。

(4)、数据只写不改。

4、InfluxDB

是一种时序数据库,通常被用在监控场景,比如运维和 IOT(物联网)领域。这类数据库旨在存储时序数据处理数据用于数据展示分析,和通过监控预警策略达到响应的服务预警等。

5、InfluxDB的相关概念说明

(1)、Bucket--相当于mysql的database--数据库概念

(2)、Measurement---相当于mysql的table--数据表概念

(3)、Point--相当于数据表的一行。

Point包含:tag(数据标签,非必须)、field(不带索引)、timestemp(唯一主键)

(3.1)、tag--数据的标签-类似mysql的索引

(3.2)、field--数据的值保存

(3.3)、time-数据采集时间,数据唯一标识,一个表内不可重复,重复会覆盖

二、docker部署influxDB

1、拉取镜像

docker pull influxdb

2、启动容器

docker run -d -p 8086:8086 --name influxdb influxdb:latest

3、打开浏览器,可以正常打开

http://192.168.249.88:8086/

4、首次访问需要配置账号密码组织等信息

userName:admin // 登录账户

password:12345678 // 密码

org:zw // 组织

bucket:fruit // 数据桶

下图为配置界面,具体本人配置如上面的文字描述,下面的界面仅第一次会出现,之后就没有,所以无法截图了。

5、再次登录

三、springboot集成

官方提供了很多语言的集成方式,这里我们以java为例,其他语言,可以在下图位置查看

具体步骤:

1、引入pom

java 复制代码
<!-- influxdb -->
		<dependency>
			<groupId>com.influxdb</groupId>
			<artifactId>influxdb-client-java</artifactId>
			<version>3.1.0</version>
		</dependency>

2、添加配置(application.properties)

java 复制代码
influxdb.url=http://192.168.249.88:8086
influxdb.bucket=fruit
influxdb.org=zw
influxdb.token=0jgapBVZ6GWMWpE77XYuPi_GLhWksvqEfNraocXMchivz5XvcLM_50tWLpXskTKFWQbUCoD_bS-iYFOjWvHzrg==

3、配置类,读取配置注入容器,不用导出应用配置

根据前缀读取配置,注入容器,以后就不用导出用@value引了,可以直接引入配置类

java 复制代码
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

@Data
@ConfigurationProperties(prefix = "influxdb")
public class InfluxdbProperties {
    private String url;
    private String bucket;
    private String org;
    private String token;
}

4、influxDB数据库客户端InfluxDBClient实例化和注入spring容器

初始化client连接和注入容器

java 复制代码
import com.influxdb.client.InfluxDBClient;
import com.influxdb.client.InfluxDBClientFactory;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableConfigurationProperties(InfluxdbProperties.class)
public class InfluxdbConfig {

    @Bean
    public InfluxDBClient initInfluxDBClient(InfluxdbProperties properties){
        InfluxDBClient client = InfluxDBClientFactory.create(properties.getUrl(),properties.getToken().toCharArray(),properties.getOrg(),properties.getBucket());
        return client;
    }
}

5、封装InfluxDB工具类--封装新增和查询的方法

本例仅简单封装了一下,还有很多批量操作等其他接口,可以自己在点进去看下如何调用。

java 复制代码
import com.alibaba.fastjson.JSON;
import com.influxdb.client.InfluxDBClient;
import com.influxdb.client.QueryApi;
import com.influxdb.client.WriteApiBlocking;
import com.influxdb.client.domain.WritePrecision;
import com.influxdb.client.write.Point;
import com.influxdb.query.FluxRecord;
import com.influxdb.query.FluxTable;
import com.zw.study.influxdb.entity.Orange;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class InfluxdbService implements DisposableBean {

    @Autowired
    private InfluxDBClient client;

    @Autowired
    private InfluxdbProperties properties;

    // 新增1,字符串形式,格式:String data = "zw_pear,host=host1 value=1111.11";
    public void writeLine(String data){
        WriteApiBlocking writeApi = client.getWriteApiBlocking();
        writeApi.writeRecord(properties.getBucket(), properties.getOrg(), WritePrecision.NS, data);
    }

    // 新增2,Point形式
    public void writePoint(Point point){
        WriteApiBlocking writeApi = client.getWriteApiBlocking();
        writeApi.writePoint(properties.getBucket(), properties.getOrg(), point);
    }

    // 新增3,自定义pojo形式
    public void writePojo(Orange orange){
        WriteApiBlocking writeApi = client.getWriteApiBlocking();
        writeApi.writeMeasurement(WritePrecision.NS, orange);
    }

    @Override
    public void destroy() throws Exception {
        client.close();
    }

    public <M> List<M> queryList(){
        // 查询fruit库中过去1小时的数据
        String query = "from(bucket: \"fruit\") |> range(start: -1h)";
        QueryApi queryApi = client.getQueryApi();
        List<FluxTable> tables = queryApi.query(query, properties.getOrg());
        for (FluxTable table : tables) {
            for (FluxRecord record : table.getRecords()) {
                System.out.println(JSON.toJSONString(record));
            }
        }

        // 查询fruit库中zw_orange表中过去12小时数据,最多取10条,封装到pojo中
        String query1 = "from(bucket: \"fruit\")\n" +
                "  |> range(start: -12h, stop: now())\n" +
                "  |> filter(fn: (r) => r._measurement == \"zw_orange\" and r._field == \"value\")\n" +
                "  |> limit(n:10)";
        List<Orange> table2 = queryApi.query(query1, Orange.class);
        System.out.println("table2:"+ JSON.toJSONString(table2));
        return null;
    }
}

6、测试和验证新增

java 复制代码
    @RequestMapping("/influx/test")
    public void test(String type) {
        logger.info("进入influxdb方法");
        if ("1".equals(type)) {
            String line = "zw_pear,host=host1 value=1111.11";
            influxdbService.writeLine(line);
        } else if ("2".equals(type)) {
            Point point = Point
                    .measurement("zw_apple")
                    .addTag("host", "host1")
                    .addField("value", 222.22)
                    .time(Instant.now(), WritePrecision.NS);
            influxdbService.writePoint(point);
        } else if ("3".equals(type)) {
            Orange orange = new Orange();
            orange.setHost("host1");
            orange.setValue(3333.33);
            orange.setTime(Instant.now());
            influxdbService.writePojo(orange);
        } else  if ("4".equals(type)) {
            influxdbService.queryList();
        }
    }

分别用type1,2,3验证新增,

浏览器查看

用type为4查看查询

不同的业务场景,选择适合的中间件还是比较重要的。对于工业行业中需要采集声音,温度,湿度等的情况,实时观察数据变化趋势,根据趋势或者其他策略做出响应的预警提示,时序数据库是相对关系数据库而言更优的选择。

学海无涯苦作舟!!!

相关推荐
chen_note1 小时前
Dockerfile及其部署镜像步骤
docker·容器·镜像·dockerfile
杨浦老苏8 小时前
开源云文件存储服务器MyDrive
docker·群晖·网盘
PellyKoo8 小时前
Docker容器中中文文件名显示乱码问题完美解决方案
运维·docker·容器
无妄无望8 小时前
在没有网络的环境下安装包pymysql
学习·docker
奥尔特星云大使9 小时前
Docker 拉取 MySQL 5.7 镜像、启动容器并进入 MySQL
数据库·mysql·docker·容器
big男孩9 小时前
Docker使用环境变量的整理
docker
安卓开发者9 小时前
Docker与Nginx:现代Web部署的完美二重奏
前端·nginx·docker
七夜zippoe14 小时前
压缩与缓存调优实战指南:从0到1根治性能瓶颈(四)
运维·docker·容器
java_logo16 小时前
Docker 部署 MinerU 教程:打造你的本地 PDF 智能处理中心
linux·运维·人工智能·docker·ai·容器·aigc
LCG元16 小时前
Docker容器化实战:将你的SpringBoot应用一键打包部署(三)-配置告警和自动扩缩容
后端·docker