京东hotkey
- 部署etcd 节点
- 部署dashboard 节点
- 部署work 节点
- 部署client 节点
新版一键部署部署
cat > ./docker-compose.yml<<-'EOF'
services:
etcd:
image: "bitnami/etcd:latest"
container_name: "etcdv3.3"
environment:
- ALLOW_NONE_AUTHENTICATION=yes
- ETCD_ADVERTISE_CLIENT_URLS=http://0.0.0.0:2379
- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379
- ETCDCTL_API=3
volumes:
- ./default.etcd:/default.etcd
ports:
- 2379:2379
- 2380:2380
- 4001:4001
extra_hosts:
- "cdh3:cdh3"
networks:
base-env-network:
aliases:
- etcd
networks:
base-env-network:
external:
name: "base-env-network"
EOF
cat > ./start_dashboard.sh<<-'EOF'
nohup java -jar ./dashboard-0.0.2-SNAPSHOT.jar --MYSQL_HOST=cdh3 --MYSQL_USER=root --MYSQL_PASS=sd@123456 --etcdServer=http://cdh3:2379 >> dashbord.log 2>&1 & tail -f dashbord.log
EOF
cat > ./start_worker.sh<<-'EOF'
nohup java -jar ./worker-0.0.4-SNAPSHOT.jar --workerPath=default --etcdServer=http://cdh3:2379 --local.address=cdh3 >> worker.log 2>&1 & tail -f worker.log
EOF
cat > ./start_sample.sh<<-'EOF'
nohup java -jar ./sample-0.0.4-SNAPSHOT.jar --name=sampleA -REDIS_HOST=cdh3 --REDIS_PORT=6379 --REDIS_PASSWORD=sd@123456 --etcdServer=http://cdh3:2379 --logging.level.com.jd.platform.hotkey.dashboard=trace --logging.level.io.grpc.netty=info --logging.level.org.apache.tomcat=ERROR --logging.level.root=info >> sample.log 2>&1 & tail -f sample.log
EOF
至于 jar 包 下载下来源码 打包一下就行了 或者私聊我发你
启动etcd docker-compose up
查看工作台 http://cdh3:8081/user/index
测试热key http://cdh3:9999/hotKey?key=t_1212
host 配置下 你的真实ip 映射到cdh3上
以下是初版
一键部署etcd
services:
etcd:
image: "bitnami/etcd:latest"
container_name: "etcdv3.3"
environment:
- ALLOW_NONE_AUTHENTICATION=yes
- ETCD_ADVERTISE_CLIENT_URLS=http://0.0.0.0:2379
- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379
- ETCDCTL_API=3
volumes:
- ./default.etcd:/default.etcd
ports:
- 2379:2379
- 2380:2380
- 4001:4001
extra_hosts:
- "cdh2:192.168.56.121"
networks:
base-env-network:
aliases:
- etcd
etcd-manage:
build: .
volumes:
- ./bin/config/cfg.toml:/app/config/cfg.toml
- ./bin/logs:/app/logs
ports:
- "10280:10280"
extra_hosts:
- "cdh2:192.168.56.121"
depends_on:
- etcd
networks:
base-env-network:
aliases:
- etcd-manage
# docker network create monitor-network
networks:
base-env-network:
external:
name: "base-env-network"
配置下
debug = false
# 日志文件路径
log_path = ""
# http 监听端口
[http]
# 监听地址
address = "0.0.0.0"
# 监听端口
port = 10280
# 使用 Let's Encrypt 证书 - tls_enable为true优先使用本地证书模式
tls_encrypt_enable = false
# 域名列表
tls_encrypt_domain_names = ["shiguanghuxian.com"]
# 是否启用tls
tls_enable = false
# tls证书文件
[http.tls_config]
cert_file = "cert_file"
key_file = "key_file"
## 一下每一个server为一个etcd服务 ##
[[server]]
# 显示名称
title = "make docker_cluster_run"
# 标识名
name = "docker_cluster_run"
# etcd连接地址 如果为集群请填写全部地址
address = ["etcd0:2379","etcd1:2379","etcd2:2379"]
# 查看的key前缀
key_prefix = "/root1"
# 简述信息
desc = "docker方式etcd集群方式"
# 可访问服务器角色列表 - 不写则为所有用户可访问
roles = ["admin"]
# 是否启用tls连接
tls_enable = true
# tls证书配置
[server.tls_config]
cert_file = "/etc/etcd/etcdSSL/etcd.pem"
key_file = "/etc/etcd/etcdSSL/etcd-key.pem"
ca_file = "/etc/etcd/etcdSSL/etcd-root-ca.pem"
[[server]]
title = "make docker_run"
name = "docker_run"
address = ["etcd:2379"]
key_prefix = "/"
desc = "docker方式etcd非集群方式"
roles = ["admin","dev"]
[[server]]
title = "本地etcd"
name = "cdh1"
address = ["cdh1:2379"]
key_prefix = "/"
desc = "本机环境"
roles = ["admin","dev"]
## 以下为用户列表 ##
[[user]]
username = "admin"
password = "123456"
role = "admin"
[[user]]
username = "dev_user"
password = "123456"
role = "dev"
账号密码 admin 123456
如果有报错 可以下列代码删除 不影响 只是不能查看 etcd-manage 管理页面
etcd-manage:
build: .
volumes:
- ./bin/config/cfg.toml:/app/config/cfg.toml
- ./bin/logs:/app/logs
ports:
- "10280:10280"
extra_hosts:
- "cdh2:192.168.56.121"
depends_on:
- etcd
networks:
base-env-network:
aliases:
- etcd-manage
sql 初始化
-- 查询你的sql_model参数:select @@global.sql_mode; 发现ONLY_FULL_GROUP_BY 则会导致报错
-- 解决方式:set @@global.sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
-- 详情查阅:https://www.cnblogs.com/hjhsblogs/p/11079356.html
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `hotkey_db` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
USE hotkey_db;
DROP TABLE IF EXISTS `hk_change_log`;
CREATE TABLE `hk_change_log` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`biz_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '业务key',
`biz_type` int(11) NOT NULL COMMENT '业务类型:1规则变更;2worker变更',
`from_str` varchar(1024) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '原始值',
`to_str` varchar(1024) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '目标值',
`app_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '数据所属APP',
`update_user` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '修改人',
`create_time` datetime(0) NOT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '创建时间',
`uuid` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '防重ID',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uniq_uuid`(`uuid`) USING BTREE COMMENT '防重索引'
) ENGINE = InnoDB AUTO_INCREMENT = 29 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Compact;
DROP TABLE IF EXISTS `hk_user`;
CREATE TABLE `hk_user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
`nick_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '昵称',
`user_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '用户名',
`pwd` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '密码',
`phone` varchar(16) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '手机号',
`role` varchar(16) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '角色:ADMIN-超管,APPADMIN-app管理员,APPUSER-app用户',
`app_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '所属appName',
`create_time` datetime(0) NOT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '创建时间',
`state` int(11) NOT NULL DEFAULT 1 COMMENT '状态:1可用;0冻结',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uniq_userName`(`user_name`) USING BTREE COMMENT '账号唯一索引'
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Compact;
-- pwd: 123456
INSERT INTO `hk_user` VALUES (2, 'admin', 'admin', 'e10adc3949ba59abbe56e057f20f883e', '1888888', 'ADMIN', '', '2020-07-28 14:01:03', 1);
DROP TABLE IF EXISTS `hk_key_record`;
CREATE TABLE `hk_key_record` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`key_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'key',
`app_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '所属appName',
`val` varchar(2048) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'value',
`duration` int(11) NOT NULL DEFAULT 60 COMMENT '缓存时间',
`source` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '来源',
`type` int(11) NOT NULL DEFAULT 1 COMMENT '记录类型:1put;2del; -1unkonw',
`create_time` datetime(0) NOT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '创建时间',
`uuid` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '防重ID',
`rule` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '''' COMMENT '规则',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uniq_key`(`uuid`) USING BTREE COMMENT '唯一索引'
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Compact;
DROP TABLE IF EXISTS `hk_key_timely`;
CREATE TABLE `hk_key_timely` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`key_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'key',
`val` varchar(2048) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'value',
`uuid` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '防重ID',
`app_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '所属appName',
`duration` int(11) NOT NULL DEFAULT 0 COMMENT '缓存时间',
`create_time` datetime(0) NOT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uniq_key`(`uuid`) USING BTREE COMMENT '唯一索引'
) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Compact;
DROP TABLE IF EXISTS `hk_statistics`;
CREATE TABLE `hk_statistics` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`key_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'keyName',
`count` int(11) NOT NULL COMMENT '计数',
`app` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT 'app',
`days` int(11) NOT NULL COMMENT '天数',
`hours` bigint(11) NOT NULL COMMENT '小时数',
`minutes` bigint(11) NOT NULL DEFAULT 0 COMMENT '分钟数',
`biz_type` int(2) NOT NULL COMMENT '业务类型',
`rule` varchar(180) NOT NULL COMMENT '所属规则',
`uuid` varchar(180) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '防重ID',
`create_time` datetime(0) NOT NULL COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uniq_uuid`(`uuid`) USING BTREE COMMENT '防重唯一索引'
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Compact;
DROP TABLE IF EXISTS `hk_rules`;
CREATE TABLE `hk_rules` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`rules` varchar(5000) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '规则JSON',
`app` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '所属APP',
`update_user` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '修改人',
`update_time` datetime(0) NOT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '修改时间',
`version` int(11) NOT NULL DEFAULT 0 COMMENT '版本号',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uniq_app`(`app`) USING BTREE COMMENT '防重索引'
) ENGINE = InnoDB AUTO_INCREMENT = 15 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Compact;
DROP TABLE IF EXISTS `hk_summary`;
CREATE TABLE `hk_summary` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`index_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '指标名称',
`rule` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '规则',
`app` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT 'app',
`index_val1` int(11) NOT NULL DEFAULT 0 COMMENT '指标值1',
`index_val2` int(11) NOT NULL DEFAULT 0 COMMENT '指标值2',
`index_val3` decimal(10, 2) NOT NULL DEFAULT 0.00 COMMENT '指标值3',
`days` int(11) NOT NULL DEFAULT 0 COMMENT '天数',
`hours` int(11) NOT NULL DEFAULT 0 COMMENT '小时数',
`minutes` bigint(11) NOT NULL DEFAULT 0 COMMENT '分钟数',
`seconds` bigint(11) NOT NULL DEFAULT 0 COMMENT '秒数',
`biz_type` tinyint(2) NOT NULL DEFAULT 0 COMMENT '类型',
`uuid` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '防重ID',
`create_time` datetime(0) NOT NULL COMMENT '创建时间',
`update_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uniq_uuid`(`uuid`) USING BTREE COMMENT '防重索引',
INDEX `idx_apprule`(`app`, `rule`) USING BTREE COMMENT '查询索引',
INDEX `ix_ct`(`create_time`) USING BTREE COMMENT '时间索引'
) ENGINE = InnoDB AUTO_INCREMENT = 18 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '汇总表' ROW_FORMAT = Compact;
DROP TABLE IF EXISTS `biz_access_token`;
/* 请确认以下SQL符合您的变更需求,务必确认无误后再提交执行 */
CREATE TABLE `biz_access_token` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`token` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT 'token',
`flag` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT 'flag',
`CREATED_BY` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL COMMENT '创建人',
`CREATED_TIME` datetime NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
`UPDATED_BY` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL COMMENT '修改人',
`UPDATED_TIME` datetime NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '咚咚token表' ROW_FORMAT = Compact;
dashboard部署
一般来说 dashboard 只需要指定下数据库和etcd 地址就行,可以直接使用jar 部署
将 dashboard-0.0.2-SNAPSHOT.jar 上传至 服务器
创建 start.sh 脚本。
nohup java -jar /hotkey/dashboard-0.0.2-SNAPSHOT.jar --
MYSQL_HOST=cdh3 --MYSQL_USER=root --MYSQL_PASS=123456 --
etcdServer=http://cdh3:2379 >> dashbord.log 2>&1 &
tail -f dashbord.log
访问 hotKey 工作台
登录后
至此, dashboard 部署完成。
worker 节点部署
同理 部署 创建 start.sh 脚本。
nohup java -jar /hotkey/worker-0.0.4-SNAPSHOT.jar --
workerPath=default --etcdServer=http://cdh3:2379 --
local.address=192.168.56.121 >> worker.log 2>&1 &
tail -f worker.log
执行 start.sh 脚本,启动 worker 应用
sh start_worker.sh
client 节点部署
项目依赖变动
引入 hotkey pom 依赖
<dependency>
<groupId>com.jd.platform.hotkey</groupId>
<artifactId>common</artifactId>
<version>${version}</version>
</dependency>
<dependency>
<groupId>com.jd.platform.hotkey</groupId>
<artifactId>hotkey-client</artifactId>
<version>${version}</version>
</dependency>
application.yml加入 etcd配置
#etcd的地址,如有多个用逗号分隔
etcd:
server: ${etcdServer:http://cdh3:2379}
执行api测试
JdHotKeyStore.isHotKey(key)
浏览器请求接口
http://cdh2:9999/hotKey?key=mac_1212
怎么知道自己部署是否正确
- 能看到 节点信息 ip 可以指定自己设置的
- 修改规则的时候 dashboard节点 work节点 client 节点 日志都会打印 规则变更
修改规则 内容模板
提前创建好用户,对应应用名字
[{ "desc": "", "duration": 60, "interval": 60, "key": "t_", "prefix": true, "threshold": 10 }, { "desc": "", "duration": 60, "interval": 60, "key": "sampleA_", "prefix": true, "threshold": 10 }]