InfluxDB 2.x 跟 1.x 在接入方式和API上有明显变化,官方推荐用 InfluxDB Java Client 6.x 这个库(而不是老的1.x客户端),而且要用 Token 鉴权。
下面给详细梳理一下 Spring Boot 3.5 集成 InfluxDB 2.x 的典型用法,包括依赖、配置、常用的读写操作,并附有详细注释和最佳实践。
1. 添加依赖
在你的 build.gradle
里加上(如果是 Maven,也有类似依赖):
// Gradle (Kotlin DSL)
implementation("com.influxdb:influxdb-client-java:6.11.0")
或者
<!-- Maven -->
<dependency>
<groupId>com.influxdb</groupId>
<artifactId>influxdb-client-java</artifactId>
<version>6.11.0</version>
</dependency>
2. application.yml 配置示例
influx:
url: http://localhost:8086
token: your_influxdb_token
org: your_org
bucket: your_bucket
3. 创建配置类
import com.influxdb.client.InfluxDBClient;
import com.influxdb.client.InfluxDBClientFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class InfluxDBConfig {
@Value("${influx.url}")
private String url;
@Value("${influx.token}")
private String token;
@Value("${influx.org}")
private String org;
@Value("${influx.bucket}")
private String bucket;
@Bean
public InfluxDBClient influxDBClient() {
// 初始化InfluxDB2客户端
return InfluxDBClientFactory.create(url, token.toCharArray(), org, bucket);
}
}
这样你就可以用
@Autowired InfluxDBClient influxDBClient
在Spring中注入并用它了。
4. 写数据示例
定义一个POJO(可选,但推荐)
import com.influxdb.annotations.Column;
import com.influxdb.annotations.Measurement;
import lombok.Data;
@Measurement(name = "temperature")
@Data
public class Temperature {
@Column(tag = true)
private String location;
@Column
private Double value;
@Column(timestamp = true)
private Instant time;
}
写入数据
import com.influxdb.client.InfluxDBClient;
import com.influxdb.client.write.Point;
import com.influxdb.client.WriteApi;
import org.springframework.stereotype.Service;
import java.time.Instant;
@Service
public class InfluxService {
private final InfluxDBClient influxDBClient;
public InfluxService(InfluxDBClient influxDBClient) {
this.influxDBClient = influxDBClient;
}
public void writeData() {
// 推荐用Point方式
Point point = Point.measurement("temperature")
.addTag("location", "office")
.addField("value", 23.5)
.time(Instant.now(), WritePrecision.NS);
try (WriteApi writeApi = influxDBClient.getWriteApi()) {
writeApi.writePoint(point);
}
}
}
你也可以直接写POJO,使用
influxDBClient.getWriteApiBlocking().writeMeasurement(...)
。
5. 查询数据
使用 Flux 语法(InfluxDB 2.x 推荐)
import com.influxdb.client.QueryApi;
import com.influxdb.query.FluxTable;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class InfluxService {
private final InfluxDBClient influxDBClient;
private final String bucket;
private final String org;
public InfluxService(InfluxDBClient influxDBClient,
@Value("${influx.bucket}") String bucket,
@Value("${influx.org}") String org) {
this.influxDBClient = influxDBClient;
this.bucket = bucket;
this.org = org;
}
public void queryData() {
String flux = String.format(
"from(bucket:\"%s\") |> range(start: -1h) |> filter(fn: (r) => r._measurement == \"temperature\")",
bucket
);
QueryApi queryApi = influxDBClient.getQueryApi();
List<FluxTable> tables = queryApi.query(flux, org);
for (FluxTable table : tables) {
table.getRecords().forEach(record -> {
System.out.println(record.getTime() + ": " + record.getValue());
});
}
}
}
6. Token 获取方法
InfluxDB 2.x 默认用 Token 认证。
Token 需要在 InfluxDB Web 控制台里创建(管理员 -> API Tokens)。
每个 Token 可指定 bucket 的访问权限,生产环境要限制好写/读权限。
7. 常见问题 & 实践建议
-
连接池:InfluxDBClient 本身是线程安全的,可以单例使用。
-
异常处理:务必try/catch写操作,否则连接断开时容易丢数据。
-
性能优化:大批量写入建议用批量API,减少网络请求。
-
POJO注解:建议用注解的方式建Model类,方便直接读写。