中间件学习--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查看查询

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

学海无涯苦作舟!!!

相关推荐
追风林2 小时前
mac 本地docker-mysql主从复制部署
mysql·macos·docker
城南vision3 小时前
Docker学习—Docker核心概念总结
java·学习·docker
wclass-zhengge4 小时前
Docker篇(Docker Compose)
运维·docker·容器
梦魇梦狸º7 小时前
腾讯轻量云服务器docker拉取不到镜像的问题:拉取超时
docker·容器·github
鬼才血脉7 小时前
docker+mysql配置
mysql·adb·docker
詹姆斯爱研究Java8 小时前
Docker 的基本概念和优势
docker
千年死缓9 小时前
gin中间件
中间件·gin
南猿北者10 小时前
docker镜像仓库常用命令
运维·docker·容器
杨浦老苏10 小时前
Docker可视化管理面板DPanel的安装
运维·docker·群晖
航月11 小时前
FTP、ISCSI、CHRONY、DNS、NFS、DOCKER、MARIADB、NGINX、PHP、CA各服务开启方法
nginx·docker·mariadb