热key探测中间件
构成:
1、etcd 用来做为配置中心,存储热key探测的规则
2、jar 客户端使用的jar包,更为便捷的用来判断一个key是否是热key,另外这个jar也完成了key的上报,监听配置中心的规则变更,热key变化,以及将热key缓存到本地内存缓存的功能
3、worker 用来连接配置中心,做为单独的服务,可以让客户端连接到自身,将客户端发来的key进行累加计算,触发热key规则后将热key推送给客户端
4、dashboard 可视化平台,用来编辑规则,添加key等工作,需要MySQL来存储数据
使用
1、安装etcd
github地址:Releases · etcd-io/etcd
下载解压,执行脚本启动
下载hotkey源码,启动worker,连接上etcd
仓库:hotkey: 京东App后台中间件,毫秒级探测热点数据,毫秒级推送至服务器集群内存,大幅降低热key对数据层查询压力
注意这里项目中的jdk版本要小于17才行
下载后用idea打开,看到worker是一个单独的服务,修改端口后,启动。
打开控制台
hotkey使用MySQL来存储热点规则,账号等信息
打开dashboard项目,找到初始化语句,建库建表
修改对应的配置
server:
port: 8121
spring:
datasource:
username: ${MYSQL_USER:root}
password: ${MYSQL_PASS:123456}
url: jdbc:mysql://${MYSQL_HOST:localhost}:3306/hotkey_db?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC&useTimezone=true&serverTimezone=GMT
driver-class-name: com.mysql.cj.jdbc.Driver
etcd:
server: ${etcdServer:http://127.0.0.1:2379}
之后启动控制台
新建用户、新建APP、新建规则
[
{
"duration": 600,
"key": "bank_detail_",
"prefix": true,
"interval": 5,
"threshold": 10,
"desc": "热门题库缓存"
}
]
在本地项目引入client。
首先在hotkey源码中打包对应的client包为jar包
然后在本地自己的项目中引入该包,初始化
添加配置
# 热 key 探测
#hotkey:
# app-name: mianshiya
# caffeine-size: 10000
# push-period: 1000
# etcd-server: http://localhost:2379初始化
/**
* 初始化 hotkey
*/
//@Bean
public void initHotkey() {
ClientStarter.Builder builder = new ClientStarter.Builder();
ClientStarter starter = builder.setAppName(appName)
.setCaffeineSize(caffeineSize)
.setPushPeriod(pushPeriod)
.setEtcdServer(etcdServer)
.build();
starter.startPipeline();
}业务使用
if (JdHotKeyStore.isHotKey(key)){
// 是,就从本地获取
Object cacheQuestion = JdHotKeyStore.get(key);
if (cacheQuestion != null){
return ResultUtils.success((QuestionVO) cacheQuestion);
}
}
// 查询数据库
// 放入本地缓存(这个方法内部会再次判断key是否是热key,当是热key才会放入内存中)
JdHotKeyStore.smartSet(key,questionVO);