京东hotkey安装部署

331 阅读10分钟

京东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"

http://cdh2:10280/ui/#/keys

账号密码 admin 123456

image.png

如果有报错 可以下列代码删除 不影响 只是不能查看 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 工作台

image.png 登录后

image.png

至此, 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)

image.png

浏览器请求接口

http://cdh2:9999/hotKey?key=mac_1212

image.png

怎么知道自己部署是否正确
  • 能看到 节点信息 ip 可以指定自己设置的

image.png

  • 修改规则的时候 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 }]