日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

sentinel 官方文档_Sentinel控制台监控数据持久化到MySQL数据库

發布時間:2025/3/20 数据库 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sentinel 官方文档_Sentinel控制台监控数据持久化到MySQL数据库 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

閱讀文本大概需要3分鐘。

? ? ? ?根據官方wiki文檔,Sentinel控制臺的實時監控數據,默認僅存儲 5 分鐘以內的數據。如需持久化,需要定制實現相關接口。

https://github.com/alibaba/Sentinel/wiki/在生產環境中使用-Sentinel

給出了指導步驟:

  • 自行擴展實現 MetricsRepository 接口;

  • 注冊成 Spring Bean 并在相應位置通過 @Qualifier 注解指定對應的 bean name 即可;

0x01:MetricsRepository接口定義

package?com.alibaba.csp.sentinel.dashboard.repository.metric;import?java.util.List;public?interface?MetricsRepository<T>?{void?save(T?metric);void?saveAll(Iterable?metrics);List?queryByAppAndResourceBetween(String?app,?String?resource,?long?startTime,?long?endTime);List?listResourcesOfApp(String?app);
}

該接口就只定義4個方法,分別用于保存和查詢Sentinel的metric數據。注釋其實很清楚了,解析如下:

  • save:保存單個metric

  • saveAll:保存多個metric

  • queryByAppAndResourceBetween:通過應用名稱、資源名稱、開始時間、結束時間查詢metric列表

  • listResourcesOfApp:通過應用名稱查詢資源列表

目前該接口只有一個基于內存級別的實現類:com.alibaba.csp.sentinel.dashboard.repository.metric.InMemoryMetricsRepository。

另外還有一個實體類com.alibaba.csp.sentinel.dashboard.datasource.entity.MetricEntity,如下圖

梳理了相關的類關系就可以實現了。

0x02:根據MetricEntity新建數據庫和新建實體類

建表語句如下

--?創建監控數據表CREATE?TABLE?`t_sentinel_metric`?(`id`?INT?NOT?NULL?AUTO_INCREMENT?COMMENT?'id,主鍵',`gmt_create`?DATETIME?COMMENT?'創建時間',`gmt_modified`?DATETIME?COMMENT?'修改時間',`app`?VARCHAR(100)?COMMENT?'應用名稱',`timestamp`?DATETIME?COMMENT?'統計時間',`resource`?VARCHAR(500)?COMMENT?'資源名稱',`pass_qps`?INT?COMMENT?'通過qps',`success_qps`?INT?COMMENT?'成功qps',`block_qps`?INT?COMMENT?'限流qps',`exception_qps`?INT?COMMENT?'發送異常的次數',`rt`?DOUBLE?COMMENT?'所有successQps的rt的和',`_count`?INT?COMMENT?'本次聚合的總條數',`resource_code`?INT?COMMENT?'資源的hashCode',INDEX?app_idx(`app`)?USING?BTREE,INDEX?resource_idx(`resource`)?USING?BTREE,INDEX?timestamp_idx(`timestamp`)?USING?BTREE,
??PRIMARY?KEY?(`id`)
)?ENGINE=INNODB?DEFAULT?CHARSET=utf8;

實體類如下

package?com.alibaba.csp.sentinel.dashboard.datasource.entity;import?javax.persistence.*;import?java.io.Serializable;import?java.util.Date;/**
?*?@author?2230
?*
?*/@Entity@Table(name?=?"t_sentinel_metric")public?class?MetricDto?implements?Serializable?{private?static?final?long?serialVersionUID?=?7200023615444172715L;/**id,主鍵*/@Id@GeneratedValue@Column(name?=?"id")private?Long?id;/**創建時間*/@Column(name?=?"gmt_create")private?Date?gmtCreate;/**修改時間*/@Column(name?=?"gmt_modified")private?Date?gmtModified;/**應用名稱*/@Column(name?=?"app")private?String?app;/**統計時間*/@Column(name?=?"timestamp")private?Date?timestamp;/**資源名稱*/@Column(name?=?"resource")private?String?resource;/**通過qps*/@Column(name?=?"pass_qps")private?Long?passQps;/**成功qps*/@Column(name?=?"success_qps")private?Long?successQps;/**限流qps*/@Column(name?=?"block_qps")private?Long?blockQps;/**發送異常的次數*/@Column(name?=?"exception_qps")private?Long?exceptionQps;/**所有successQps的rt的和*/@Column(name?=?"rt")private?Double?rt;/**本次聚合的總條數*/@Column(name?=?"_count")private?Integer?count;/**資源的hashCode*/@Column(name?=?"resource_code")private?Integer?resourceCode;//?get??set?方法省略
}

0x03:pom.xml添加依賴

因為是基于JPA和MySQL數據庫實現,所以需要添加JPA依賴和MySQL數據庫驅動依賴

???<dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-data-jpaartifactId><version>${spring.boot.version}version>dependency><dependency><groupId>mysqlgroupId><artifactId>mysql-connector-javaartifactId><version>5.1.47version>dependency>

0x04:實現MetricsRepository?接口,把數據持久化到MySQL數據庫

注意實現添加@Repository("jpaMetricsRepository")配置

package?com.alibaba.csp.sentinel.dashboard.repository.metric;import?java.time.Instant;import?java.util.ArrayList;import?java.util.Date;import?java.util.HashMap;import?java.util.List;import?java.util.Map;import?java.util.stream.Collectors;import?javax.persistence.EntityManager;import?javax.persistence.PersistenceContext;import?javax.persistence.Query;import?org.springframework.beans.BeanUtils;import?org.springframework.stereotype.Repository;import?org.springframework.transaction.annotation.Transactional;import?org.springframework.util.CollectionUtils;import?com.alibaba.csp.sentinel.dashboard.datasource.entity.MetricDto;import?com.alibaba.csp.sentinel.dashboard.datasource.entity.MetricEntity;import?com.alibaba.csp.sentinel.util.StringUtil;/**
?*?https://www.cnblogs.com/yinjihuan/p/10574998.html
?*?https://www.cnblogs.com/cdfive2018/p/9838577.html
?*?https://blog.csdn.net/wk52525/article/details/104587239/
?*?https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel
?*?
?*?@author?2230
?*
?*/@Transactional@Repository("jpaMetricsRepository")
public?class?JpaMetricsRepository?implements?MetricsRepository<MetricEntity>?{@PersistenceContext
????private?EntityManager?em;@Override
????public?void?save(MetricEntity?metric)?{if?(metric?==?null?||?StringUtil.isBlank(metric.getApp()))?{return;
????????}
????????MetricDto?metricDto?=?new?MetricDto();
????????BeanUtils.copyProperties(metric,?metricDto);
????????em.persist(metricDto);
????}@Override
????public?void?saveAll(Iterable?metrics)?{if?(metrics?==?null)?{return;
????????}
????????metrics.forEach(this::save);
????}@Override
????public?List?queryByAppAndResourceBetween(String?app,?String?resource,?long?startTime,?long?endTime)?{List?results?=?new?ArrayList();if?(StringUtil.isBlank(app))?{return?results;
????????}if?(StringUtil.isBlank(resource))?{return?results;
????????}
????????StringBuilder?hql?=?new?StringBuilder();
????????hql.append("FROM?MetricDto");
????????hql.append("?WHERE?app=:app");
????????hql.append("?AND?resource=:resource");
????????hql.append("?AND?timestamp>=:startTime");
????????hql.append("?AND?timestamp<=:endTime");
????????Query?query?=?em.createQuery(hql.toString());
????????query.setParameter("app",?app);
????????query.setParameter("resource",?resource);
????????query.setParameter("startTime",?Date.from(Instant.ofEpochMilli(startTime)));
????????query.setParameter("endTime",?Date.from(Instant.ofEpochMilli(endTime)));List?metricDtos?=?query.getResultList();if?(CollectionUtils.isEmpty(metricDtos))?{return?results;
????????}for?(MetricDto?metricDto?:?metricDtos)?{
????????????MetricEntity?metricEntity?=?new?MetricEntity();
????????????BeanUtils.copyProperties(metricDto,?metricEntity);
????????????results.add(metricEntity);
????????}return?results;
????}@Override
????public?List<String>?listResourcesOfApp(String?app)?{List<String>?results?=?new?ArrayList<>();if?(StringUtil.isBlank(app))?{return?results;
????????}
????????StringBuilder?hql?=?new?StringBuilder();
????????hql.append("FROM?MetricDto");
????????hql.append("?WHERE?app=:app");
????????hql.append("?AND?timestamp>=:startTime");
????????long?startTime?=?System.currentTimeMillis()?-?1000?*?60;
????????Query?query?=?em.createQuery(hql.toString());
????????query.setParameter("app",?app);
????????query.setParameter("startTime",?Date.from(Instant.ofEpochMilli(startTime)));List?metricDtos?=?query.getResultList();if?(CollectionUtils.isEmpty(metricDtos))?{return?results;
????????}List?metricEntities?=?new?ArrayList();for?(MetricDto?metricDto?:?metricDtos)?{
????????????MetricEntity?metricEntity?=?new?MetricEntity();
????????????BeanUtils.copyProperties(metricDto,?metricEntity);
????????????metricEntities.add(metricEntity);
????????}Map<String,?MetricEntity>?resourceCount?=?new?HashMap<>(32);for?(MetricEntity?metricEntity?:?metricEntities)?{String?resource?=?metricEntity.getResource();if?(resourceCount.containsKey(resource))?{
????????????????MetricEntity?oldEntity?=?resourceCount.get(resource);
????????????????oldEntity.addPassQps(metricEntity.getPassQps());
????????????????oldEntity.addRtAndSuccessQps(metricEntity.getRt(),?metricEntity.getSuccessQps());
????????????????oldEntity.addBlockQps(metricEntity.getBlockQps());
????????????????oldEntity.addExceptionQps(metricEntity.getExceptionQps());
????????????????oldEntity.addCount(1);
????????????}?else?{
????????????????resourceCount.put(resource,?MetricEntity.copyOf(metricEntity));
????????????}
????????}//?Order?by?last?minute?b_qps?DESC.return?resourceCount.entrySet()
????????????????.stream()
????????????????.sorted((o1,?o2)?->?{
????????????????????MetricEntity?e1?=?o1.getValue();
????????????????????MetricEntity?e2?=?o2.getValue();int?t?=?e2.getBlockQps().compareTo(e1.getBlockQps());if?(t?!=?0)?{return?t;
????????????????????}return?e2.getPassQps().compareTo(e1.getPassQps());
????????????????})
????????????????.map(Map.Entry::getKey)
????????????????.collect(Collectors.toList());
????}
}

0x05:application.properties配置文件添加數據庫配置

#?datasource
spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://127.0.0.1:3306/gateway_v2?characterEncoding=utf8&useSSL=true
spring.datasource.username=root
spring.datasource.password=root
#?spring?data?jpa
spring.jpa.hibernate.ddl-auto=none
spring.jpa.hibernate.use-new-id-generator-mappings=false
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
spring.jpa.show-sql=false

主要配置數據庫連接信息和JPA的配置項,JPA使用Hibernate實現。

0x06:數據庫持久化換成JpaMetricsRepository實現

找到如下兩個類

com.alibaba.csp.sentinel.dashboard.controller.MetricControllercom.alibaba.csp.sentinel.dashboard.metric.MetricFetcher

在metricStore屬性上添加多一個@Qualifier("jpaMetricsRepository")注解,如下圖

0x07:驗證

設置sentinel-dashboard工程的啟動參數

-Dserver.port=8080?-Dcsp.sentinel.dashboard.server=localhost:8080?-Dproject.name=sentinel-dashboard

具體可以參考【?Sentinel如何進行流量監控 】;可以發現數據已經保存到MySQL數據庫。

備注:以上代碼改造都是在sentinel-dashboard項目上。

參考:https://www.cnblogs.com/cdfive2018/p/9838577.html

往期精彩

01?Sentinel如何進行流量監控

02?Nacos源碼編譯

03?基于Apache Curator框架的ZooKeeper使用詳解

04?spring boot項目整合xxl-job

05?互聯網支付系統整體架構詳解

關注我

每天進步一點點

喜歡!在看?

總結

以上是生活随笔為你收集整理的sentinel 官方文档_Sentinel控制台监控数据持久化到MySQL数据库的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。