當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
InfluxData【付诸实践 01】SpringBoot 集成时序数据库 InfluxDB 应用分享(InfluxDB实例+Feign接口调用InfluxDB API)源码分享
生活随笔
收集整理的這篇文章主要介紹了
InfluxData【付诸实践 01】SpringBoot 集成时序数据库 InfluxDB 应用分享(InfluxDB实例+Feign接口调用InfluxDB API)源码分享
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.InfluxDB實例
1.1 依賴及配置
<dependency><groupId>org.influxdb</groupId><artifactId>influxdb-java</artifactId><version>2.15</version> </dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional> </dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope> </dependency> spring:influx:url: http://tcloud:18088user: adminpassword: admindatabase: mydbretentionPolicy: defaultretentionPolicyTime: 30d1.2 代碼實現
配置類:
@Configuration public class InfluxDatabaseConfig {@Value("${spring.influx.url}")public String url;@Value("${spring.influx.user}")public String userName;@Value("${spring.influx.password}")public String password;@Value("${spring.influx.database}")public String database;@Value("${spring.influx.retentionPolicy}")public String retentionPolicy;@Value("${spring.influx.retentionPolicyTime}")public String retentionPolicyTime; }工具類:
@Slf4j @Component public class InfluxDatabaseUtil {private String database;private String retentionPolicy;private String retentionPolicyTime;private InfluxDB influxdb;@Autowiredprivate InfluxDatabaseConfig influxDatabaseConfig;@PostConstructprivate void init() {// 保存策略if (StringUtils.isEmpty(influxDatabaseConfig.retentionPolicy)) {this.retentionPolicy = "autogen";} else {this.retentionPolicy = influxDatabaseConfig.retentionPolicy;}// 數據保存策略中數據保存時間if (StringUtils.isEmpty(influxDatabaseConfig.retentionPolicyTime)) {this.retentionPolicyTime = "30d";} else {this.retentionPolicyTime = influxDatabaseConfig.retentionPolicyTime;}if (StringUtils.isEmpty(influxDatabaseConfig.database)) {// 創建數據庫并賦值System.out.println("創建數據庫!");}this.database = influxDatabaseConfig.database;// 初始化 InfluxDB 實例initInfluxDatabase();// 數據庫設置保存策略createRetentionPolicy();}/*** 初始化數據庫連接*/private void initInfluxDatabase() {influxdb = InfluxDBFactory.connect(influxDatabaseConfig.url, influxDatabaseConfig.userName, influxDatabaseConfig.password);influxdb.setDatabase(database);}/*** 設置數據保存策略* default 策略名* database 數據庫名* 30d 數據保存時限30天* 1 副本個數為1* 結尾 DEFAULT 表示 設為默認的策略*/private void createRetentionPolicy() {String command = String.format("CREATE RETENTION POLICY \"%s\" ON \"%s\" DURATION %s REPLICATION %s DEFAULT",retentionPolicy, database, retentionPolicyTime, 1);this.query(command);}/*** 查詢** @param command 查詢語句* @return 查詢結果*/public QueryResult query(String command) {return influxdb.query(new Query(command, database));}/*** 插入** @param measurement 表* @param tags 標簽* @param fields 字段*/public void insert(String measurement, Map<String, String> tags, Map<String, Object> fields) {Point.Builder builder = Point.measurement(measurement);builder.time(System.currentTimeMillis(), TimeUnit.MILLISECONDS);builder.tag(tags);builder.fields(fields);log.info("influxDB insert data:[{}]", builder.build().toString());influxdb.write(database, "", builder.build());} }對象封裝:
@Data @NoArgsConstructor @AllArgsConstructor public class Usage {private String time;private String serviceMethod;private String userId;private Integer count;private String url; }測試類:
@SpringBootTest class InfluxDatabaseApplicationTests {@Autowiredprivate InfluxDatabaseUtil influxDatabaseUtil;@Testvoid testInsert() throws InterruptedException {Map<String, String> tagsMap = new HashMap<>();Map<String, Object> fieldsMap = new HashMap<>();System.out.println("influxDB start time :" + System.currentTimeMillis());int i = 0;do {Thread.sleep(100);tagsMap.put("user_id", String.valueOf(i % 10));tagsMap.put("url", "http://www.baidu.com");tagsMap.put("service_method", "testInsert" + (i % 5));fieldsMap.put("count", i % 5);influxDatabaseUtil.insert("usage", tagsMap, fieldsMap);i++;} while (i < 50);}@Testvoid testQuery() {QueryResult query = influxDatabaseUtil.query("select * from usage limit 10");ArrayList<Object> lists = new ArrayList<>();query.getResults().forEach(result -> {result.getSeries().forEach(serie -> {List<List<Object>> values = serie.getValues();List<String> columns = serie.getColumns();lists.addAll(getQueryData(columns, values));});});System.out.println(lists.toString());}private List<Usage> getQueryData(List<String> columns, List<List<Object>> values) {List<Usage> lists = new ArrayList<>();for (List<Object> list : values) {Usage info = new Usage();BeanWrapperImpl bean = new BeanWrapperImpl(info);for (int i = 0; i < list.size(); i++) {String propertyName = setColumns(columns.get(i));// 字段名Object value = list.get(i);// 相應字段值bean.setPropertyValue(propertyName, value);}lists.add(info);}return lists;}/*** 轉義字段 ***/private String setColumns(String column) {String[] cols = column.split("_");StringBuffer sb = new StringBuffer();for (int i = 0; i < cols.length; i++) {String col = cols[i].toLowerCase();if (i != 0) {String start = col.substring(0, 1).toUpperCase();String end = col.substring(1).toLowerCase();col = start + end;}sb.append(col);}return sb.toString();} }2.Feign接口調用InfluxDB API
2.1 依賴及配置
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>2.2.6.RELEASE</version> </dependency> ribbon:ReadTimeout: 5000ConnectTimeout: 50002.2 代碼實現
Use the InfluxDB API 文檔有詳細說明,以下是feign接口:
@FeignClient(name = "influxDbApi", url = "${spring.influx.url}") public interface InfluxDbApi {/*** 查詢數據庫** @param q 查詢語句* @param db 數據庫* @param u 用戶名* @param p 密碼* @return 查詢結果* @throws Exception 可能出現的異常*/@PostMapping("/query")String queryInfo(@RequestParam String db, @RequestParam String u, @RequestParam String p, @RequestParam String q) throws Exception; }調用測試類:
@Component public class ApiTesting {@Autowiredprivate InfluxDbApi influxDbApi;String test() throws Exception {/* Map<String, Object> param = new HashMap<>(8);param.put("q","CREATE DATABASE testDB");*/return influxDbApi.queryInfo("mydb", "admin", "admin", "select * from usage");} }測試接口:
@RestController @Slf4j public class ApiController {@Resource(name = "apiTesting")private ApiTesting apiTesting;@PostMapping("/test")public String get() throws Exception {log.info("------test------");return apiTesting.test();} }總結
以上是生活随笔為你收集整理的InfluxData【付诸实践 01】SpringBoot 集成时序数据库 InfluxDB 应用分享(InfluxDB实例+Feign接口调用InfluxDB API)源码分享的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: InfluxData【环境搭建 03】时
- 下一篇: Greenplum【集群搭建 01】局域