微服务的编程测评系统21-项目部署-mysql-nacos
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 1. 项目部署
- 1.1 后端项⽬打包
- 1.2 前端项目打包
- 1.3 Dockerfile
- 1.4 docker-compose
- 1.5 mysql
- 1.6 mysql初始化
- 1.7 nacos
- 总结
前言
1. 项目部署
1.1 后端项⽬打包
引⼊依赖
在项⽬打包前,我们需要在 gateway 服务和 oj-modules 的 pom.xml ⽂件中加⼊以下依赖。否则,打包后启动 JAR 包时会报找不到主类的错误。
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
修改bootstrap.yml
以gateway服务为例:
spring:application:name: oj-gatewayprofiles:active: localcloud:nacos:discovery:namespace: 实际的namespaceserver-addr: http://部署nacos机器的ip:8848username: nacospassword: nacosbitoj_8ip: ${HOST_IP}config:namespace: 实际的namespaceserver-addr: http://部署nacos机器的ip:8848file-extension: yamlusername: nacospassword: nacosbitoj_8
因为地址都变成服务器上面了
username和password是为了对访问nacos进行鉴权
username、password:因为我们部署时需要开启了nacos的鉴权所有配置中需要增加nacos的密码
ip: ${HOST_IP}: 指定服务注册到 Nacos 的 IP 为宿主机的 IP。默认情况下,容器会使⽤桥接模式(bridge mode)下分配的内部 IP 地址。我们这⾥配置的${HOST_IP} 是从环境变量中获取到的宿主机ip的值,这需要我们在编写 docker-compose ⽂件时先为服务容器设置这个环境变量。在编写docker-compose⽂件时可以再详细说明。
如果没有配置这个ip的话,那么服务注册到nacos,那么就会默认访问这个服务的ip的
因为服务器不止一个,所以ip不是固定的,所以是变量HOST_IP–》写docker compose的时候固定
以前的配置,我们用dev保存了
微服务打包命令
先清理之前打包输出,然后再重新打包。
mvn clean package -DskipTests
脚本执⾏
后端项⽬完成打包之后,执⾏之前准备好的copy.ps1,将所有微服务的jar包统⼀移动到bitoj-jar⽬录下。
cd E:\bitepro\bite-oj\deploy\test\sh.\copy.ps1
用powershell执行脚本
1.2 前端项目打包
npm run build
分别对oj-fe-b(B端)和oj-fe-c(C端)两个前端⼯程通过 npm run build 命令进⾏打包。前端打包命令执⾏完成之后,B端和C端前端⼯程分别会创建出两个dist⽬录如下图所⽰:
将这两个dist⽬录分别移动到此前创建好的/deploy/test/nginx/dist⽬录下的对应位置
1.3 Dockerfile
完成打包之后我们为每⼀个微服务编写Dockerfile⽂件,并且存储到我们上⾯创建好的bitoj-jar⽬录的对应⽬录下。
Gateway
# 指定了基础镜像为openjdk:17.0.2,即使⽤OpenJDK 17.0.2版本的Java环境作为构建的基础。
FROM openjdk:17.0.2
# 拷⻉jar包到容器中
ADD ./oj-gateway.jar ./oj-gateway.jar
# 运⾏jar包 ⽤ Java 运⾏容器内的 oj-gateway.jar 应⽤程序
CMD ["java", "-jar", "oj-gateway.jar"]
friend
FROM openjdk:17.0.2
ADD ./oj-friend.jar ./oj-friend.jar
CMD ["java", "-jar", "oj-friend.jar"]
job
FROM openjdk:17.0.2
ADD ./oj-job.jar ./oj-job.jar
CMD ["java", "-jar", "oj-job.jar"]
judge
FROM openjdk:17.0.2
ADD ./oj-judge.jar ./oj-judge.jar
CMD ["java", "-jar", "oj-judge.jar"]
system
FROM openjdk:17.0.2
ADD ./oj-system.jar ./oj-system.jar
CMD ["java", "-jar", "oj-system.jar"]
1.4 docker-compose
根据上⽂提到我们每台服务器上所部署的内容不同,我们在编写docker-compose⽂件时需要为两台服务器的部署分别编写docker-compose⽂件。
第⼀台机器:
根据我们的实际情况,在⾸次进⾏项⽬部署时,需要分阶段逐步进⾏部署。因为项⽬⾸次部署时,所有组件都处于初始状态,⽽⽬前我们的项⽬已不再是初始状态。当前项⽬依赖于数据库和Nacos 等服务,但这些服务尚未完成初始配置,数据库中缺少项⽬所需的表,Nacos 中也缺少项⽬所需的配置。因此,我们需要先完成数据库和 Nacos 的部署和配置,然后再部署其他服务和组件。此外,Nacos 本⾝依赖于 MySQL,所以 MySQL 应该是我们⾸先部署的组件。
我们将⾸先使⽤仅包含 MySQL 的 docker-compose ⽂件来完成 MySQL 的部署。在将 docker-compose ⽂件上传到服务器并执⾏之前,我们⼀起来看⼀下⽂件中的内容。
1.5 mysql
# 指定 Docker Compose ⽂件的版本
version: '3.8'
#services:定义了服务列表
services:oj-mysql-server:image: mysql:5.7container_name: oj-mysql-serverenvironment:# 时区上海TZ: Asia/Shanghai# root 密码MYSQL_ROOT_PASSWORD: 123456ports:- "3306:3306"volumes:# 数据挂载- ./mysql/mysqldata/:/var/lib/mysql/# 配置MySQL 服务器的字符集与排序规则command:--character-set-server=utf8mb4--collation-server=utf8mb4_general_ci# 通过执行特定的 MySQL 命令来检查服务的健康状态healthcheck:test: ["CMD", "mysqladmin", "ping", "-u", "root", "-p123456"]interval: 10stimeout: 5sretries: 10
数据挂载部分(volumes),因为在项⽬部署阶段我们会多次创建和销毁 MySQL 服务。如果不进⾏数据挂载,MySQL 中已存储的数据将会丢失。
健康检查(healthcheck):⽤于监控容器内的应⽤是否正常运⾏。健康检查通常和
depends_on(⽤于定义定义服务之间的依赖关系的配置项)配合使⽤,我们后⾯也会使⽤到,⽤到的时候会给⼤家详细介绍。下⽅详细介绍了健康检查的相关参数:
test: 这⼀⾏定义了健康检查的实际命令。
interval: 这⼀⾏定义了两次连续健康检查之间的间隔时间。
timeout: 这⼀⾏定义了每次健康检查尝试的最⼤等待时间。
retries: 这⼀⾏定义了Docker在宣布容器不健康之前,会尝试进⾏健康检查的次数。
上传docker-compose⽂件到第⼀台服务器,然后执⾏。完成mysql组件部署之后,随后跳转⾄mysql配置,完成数据库的初始化⼯作。
然后我们用xftp来上传这个docker-compose文件到服务器
docker compose up -d
这个就可以执行docker-compose文件了
docker ps
#查看容器
而且处于健康状态
然后还有初始化mysql的数据–》nacos,xxl-job,表,创建其他用户来操作
1.6 mysql初始化
我们先链接到这个mysql
mysql容器对外暴露的端口号是3306
这样就成功了
先用root用户创建一个用户ojtest
CREATE USER 'ojtest'@'%' IDENTIFIED BY '123456';
CREATE database if NOT EXISTS `ckoj_dev`;
CREATE database if NOT EXISTS `ckoj_nacos_local`;
CREATE database if NOT EXISTS `xxl_job` default character set utf8mb4 collate utf8mb4_unicode_ci;
GRANT CREATE,DROP,SELECT, INSERT, UPDATE, DELETE,ALTER ON ckoj_dev.* TO 'ojtest'@'%';
GRANT CREATE,DROP,SELECT, INSERT, UPDATE, DELETE,ALTER ON ckoj_nacos_local.* TO 'ojtest'@'%';
GRANT CREATE,DROP,SELECT, INSERT, UPDATE, DELETE,ALTER ON xxl_job.* TO 'ojtest'@'%';
然后创建了三个库ckoj_dev,ckoj_nacos_local,xxl_job
再把三个库的操作权限给用户
然后是nacos数据库配置
use ckoj_nacos_local;
/******************************************/
/* 表名称 = config_info */
/******************************************/
CREATE TABLE `config_info` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`data_id` varchar(255) NOT NULL COMMENT 'data_id',`group_id` varchar(128) DEFAULT NULL COMMENT 'group_id',`content` longtext NOT NULL COMMENT 'content',`md5` varchar(32) DEFAULT NULL COMMENT 'md5',`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',`src_user` text COMMENT 'source user',`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',`tenant_id` varchar(128) DEFAULT '' COMMENT '租⼾字段',`c_desc` varchar(256) DEFAULT NULL COMMENT 'configuration description',`c_use` varchar(64) DEFAULT NULL COMMENT 'configuration usage',`effect` varchar(64) DEFAULT NULL COMMENT '配置⽣效的描述',`type` varchar(64) DEFAULT NULL COMMENT '配置的类型',`c_schema` text COMMENT '配置的模式',`encrypted_data_key` text NOT NULL COMMENT '密钥',PRIMARY KEY (`id`),UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';
/******************************************/
/* 表名称 = config_info_aggr */
/******************************************/
CREATE TABLE `config_info_aggr` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`data_id` varchar(255) NOT NULL COMMENT 'data_id',`group_id` varchar(128) NOT NULL COMMENT 'group_id',`datum_id` varchar(255) NOT NULL COMMENT 'datum_id',`content` longtext NOT NULL COMMENT '内容',`gmt_modified` datetime NOT NULL COMMENT '修改时间',`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',`tenant_id` varchar(128) DEFAULT '' COMMENT '租⼾字段',PRIMARY KEY (`id`),UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum`
(`data_id`,`group_id`,`tenant_id`,`datum_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租⼾字段';
/******************************************/
/* 表名称 = config_info_beta */
/******************************************/
CREATE TABLE `config_info_beta` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`data_id` varchar(255) NOT NULL COMMENT 'data_id',`group_id` varchar(128) NOT NULL COMMENT 'group_id',`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',`content` longtext NOT NULL COMMENT 'content',`beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',`md5` varchar(32) DEFAULT NULL COMMENT 'md5',`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',`src_user` text COMMENT 'source user',`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',`tenant_id` varchar(128) DEFAULT '' COMMENT '租⼾字段',`encrypted_data_key` text NOT NULL COMMENT '密钥',PRIMARY KEY (`id`),UNIQUE KEY `uk_configinfobeta_datagrouptenant`
(`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
COMMENT='config_info_beta';
/******************************************/
/* 表名称 = config_info_tag */
/******************************************/
CREATE TABLE `config_info_tag` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`data_id` varchar(255) NOT NULL COMMENT 'data_id',`group_id` varchar(128) NOT NULL COMMENT 'group_id',`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',`tag_id` varchar(128) NOT NULL COMMENT 'tag_id',`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',`content` longtext NOT NULL COMMENT 'content',`md5` varchar(32) DEFAULT NULL COMMENT 'md5',`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',`src_user` text COMMENT 'source user',`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',PRIMARY KEY (`id`),UNIQUE KEY `uk_configinfotag_datagrouptenanttag`
(`data_id`,`group_id`,`tenant_id`,`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
COMMENT='config_info_tag';
/******************************************/
/* 表名称 = config_tags_relation */
/******************************************/
CREATE TABLE `config_tags_relation` (`id` bigint(20) NOT NULL COMMENT 'id',`tag_name` varchar(128) NOT NULL COMMENT 'tag_name',`tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type',`data_id` varchar(255) NOT NULL COMMENT 'data_id',`group_id` varchar(128) NOT NULL COMMENT 'group_id',`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',`nid` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'nid, ⾃增⻓标识',PRIMARY KEY (`nid`),UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
COMMENT='config_tag_relation';
/******************************************/
/* 表名称 = group_capacity */
/******************************************/
CREATE TABLE `group_capacity` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',`group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表⽰整个集
群',`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表⽰使⽤默认值',`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使⽤量',`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置⼤⼩上限,单位
为字节,0表⽰使⽤默认值',`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合⼦配置最⼤
个数,,0表⽰使⽤默认值',`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的⼦
配置⼤⼩上限,单位为字节,0表⽰使⽤默认值',`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最⼤变更历史
数量',`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',PRIMARY KEY (`id`),UNIQUE KEY `uk_group_id` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量
信息表';
/******************************************/
/* 表名称 = his_config_info */
/******************************************/
CREATE TABLE `his_config_info` (`id` bigint(20) unsigned NOT NULL COMMENT 'id',`nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'nid, ⾃增标识',`data_id` varchar(255) NOT NULL COMMENT 'data_id',`group_id` varchar(128) NOT NULL COMMENT 'group_id',`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',`content` longtext NOT NULL COMMENT 'content',`md5` varchar(32) DEFAULT NULL COMMENT 'md5',`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',`src_user` text COMMENT 'source user',`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',`op_type` char(10) DEFAULT NULL COMMENT 'operation type',`tenant_id` varchar(128) DEFAULT '' COMMENT '租⼾字段',`encrypted_data_key` text NOT NULL COMMENT '密钥',PRIMARY KEY (`nid`),KEY `idx_gmt_create` (`gmt_create`),KEY `idx_gmt_modified` (`gmt_modified`),KEY `idx_did` (`data_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租⼾改造';
/******************************************/
/* 表名称 = tenant_capacity */
/******************************************/
CREATE TABLE `tenant_capacity` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',`tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID',`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表⽰使⽤默认值',`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使⽤量',`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置⼤⼩上限,单位
为字节,0表⽰使⽤默认值',`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合⼦配置最⼤
个数',`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的⼦
配置⼤⼩上限,单位为字节,0表⽰使⽤默认值',`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最⼤变更历史
数量',`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',PRIMARY KEY (`id`),UNIQUE KEY `uk_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租⼾容量信息表';
CREATE TABLE `tenant_info` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`kp` varchar(128) NOT NULL COMMENT 'kp',`tenant_id` varchar(128) default '' COMMENT 'tenant_id',`tenant_name` varchar(128) default '' COMMENT 'tenant_name',`tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc',`create_source` varchar(32) DEFAULT NULL COMMENT 'create_source',`gmt_create` bigint(20) NOT NULL COMMENT '创建时间',`gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',PRIMARY KEY (`id`),UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';
CREATE TABLE `users` (`username` varchar(50) NOT NULL PRIMARY KEY COMMENT 'username',`password` varchar(500) NOT NULL COMMENT 'password',`enabled` boolean NOT NULL COMMENT 'enabled'
);
CREATE TABLE `roles` (`username` varchar(50) NOT NULL COMMENT 'username',`role` varchar(50) NOT NULL COMMENT 'role',UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE
);
CREATE TABLE `permissions` (`role` varchar(50) NOT NULL COMMENT 'role',`resource` varchar(128) NOT NULL COMMENT 'resource',`action` varchar(8) NOT NULL COMMENT 'action',UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
);
INSERT INTO users (username, password, enabled) VALUES ('nacos',
'$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);
INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');
然后是xxl-job
use `xxl_job`;SET NAMES utf8mb4;CREATE TABLE `xxl_job_info`
(`id` int(11) NOT NULL AUTO_INCREMENT,`job_group` int(11) NOT NULL COMMENT '执行器主键ID',`job_desc` varchar(255) NOT NULL,`add_time` datetime DEFAULT NULL,`update_time` datetime DEFAULT NULL,`author` varchar(64) DEFAULT NULL COMMENT '作者',`alarm_email` varchar(255) DEFAULT NULL COMMENT '报警邮件',`schedule_type` varchar(50) NOT NULL DEFAULT 'NONE' COMMENT '调度类型',`schedule_conf` varchar(128) DEFAULT NULL COMMENT '调度配置,值含义取决于调度类型',`misfire_strategy` varchar(50) NOT NULL DEFAULT 'DO_NOTHING' COMMENT '调度过期策略',`executor_route_strategy` varchar(50) DEFAULT NULL COMMENT '执行器路由策略',`executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler',`executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数',`executor_block_strategy` varchar(50) DEFAULT NULL COMMENT '阻塞处理策略',`executor_timeout` int(11) NOT NULL DEFAULT '0' COMMENT '任务执行超时时间,单位秒',`executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数',`glue_type` varchar(50) NOT NULL COMMENT 'GLUE类型',`glue_source` mediumtext COMMENT 'GLUE源代码',`glue_remark` varchar(128) DEFAULT NULL COMMENT 'GLUE备注',`glue_updatetime` datetime DEFAULT NULL COMMENT 'GLUE更新时间',`child_jobid` varchar(255) DEFAULT NULL COMMENT '子任务ID,多个逗号分隔',`trigger_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '调度状态:0-停止,1-运行',`trigger_last_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '上次调度时间',`trigger_next_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '下次调度时间',PRIMARY KEY (`id`)
) ENGINE = InnoDBDEFAULT CHARSET = utf8mb4;CREATE TABLE `xxl_job_log`
(`id` bigint(20) NOT NULL AUTO_INCREMENT,`job_group` int(11) NOT NULL COMMENT '执行器主键ID',`job_id` int(11) NOT NULL COMMENT '任务,主键ID',`executor_address` varchar(255) DEFAULT NULL COMMENT '执行器地址,本次执行的地址',`executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler',`executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数',`executor_sharding_param` varchar(20) DEFAULT NULL COMMENT '执行器任务分片参数,格式如 1/2',`executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数',`trigger_time` datetime DEFAULT NULL COMMENT '调度-时间',`trigger_code` int(11) NOT NULL COMMENT '调度-结果',`trigger_msg` text COMMENT '调度-日志',`handle_time` datetime DEFAULT NULL COMMENT '执行-时间',`handle_code` int(11) NOT NULL COMMENT '执行-状态',`handle_msg` text COMMENT '执行-日志',`alarm_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '告警状态:0-默认、1-无需告警、2-告警成功、3-告警失败',PRIMARY KEY (`id`),KEY `I_trigger_time` (`trigger_time`),KEY `I_handle_code` (`handle_code`),KEY `I_jobid_jobgroup` (`job_id`,`job_group`),KEY `I_job_id` (`job_id`)
) ENGINE = InnoDBDEFAULT CHARSET = utf8mb4;CREATE TABLE `xxl_job_log_report`
(`id` int(11) NOT NULL AUTO_INCREMENT,`trigger_day` datetime DEFAULT NULL COMMENT '调度-时间',`running_count` int(11) NOT NULL DEFAULT '0' COMMENT '运行中-日志数量',`suc_count` int(11) NOT NULL DEFAULT '0' COMMENT '执行成功-日志数量',`fail_count` int(11) NOT NULL DEFAULT '0' COMMENT '执行失败-日志数量',`update_time` datetime DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `i_trigger_day` (`trigger_day`) USING BTREE
) ENGINE = InnoDBDEFAULT CHARSET = utf8mb4;CREATE TABLE `xxl_job_logglue`
(`id` int(11) NOT NULL AUTO_INCREMENT,`job_id` int(11) NOT NULL COMMENT '任务,主键ID',`glue_type` varchar(50) DEFAULT NULL COMMENT 'GLUE类型',`glue_source` mediumtext COMMENT 'GLUE源代码',`glue_remark` varchar(128) NOT NULL COMMENT 'GLUE备注',`add_time` datetime DEFAULT NULL,`update_time` datetime DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE = InnoDBDEFAULT CHARSET = utf8mb4;CREATE TABLE `xxl_job_registry`
(`id` int(11) NOT NULL AUTO_INCREMENT,`registry_group` varchar(50) NOT NULL,`registry_key` varchar(255) NOT NULL,`registry_value` varchar(255) NOT NULL,`update_time` datetime DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `i_g_k_v` (`registry_group`, `registry_key`, `registry_value`) USING BTREE
) ENGINE = InnoDBDEFAULT CHARSET = utf8mb4;CREATE TABLE `xxl_job_group`
(`id` int(11) NOT NULL AUTO_INCREMENT,`app_name` varchar(64) NOT NULL COMMENT '执行器AppName',`title` varchar(12) NOT NULL COMMENT '执行器名称',`address_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '执行器地址类型:0=自动注册、1=手动录入',`address_list` text COMMENT '执行器地址列表,多地址逗号分隔',`update_time` datetime DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE = InnoDBDEFAULT CHARSET = utf8mb4;CREATE TABLE `xxl_job_user`
(`id` int(11) NOT NULL AUTO_INCREMENT,`username` varchar(50) NOT NULL COMMENT '账号',`password` varchar(50) NOT NULL COMMENT '密码',`role` tinyint(4) NOT NULL COMMENT '角色:0-普通用户、1-管理员',`permission` varchar(255) DEFAULT NULL COMMENT '权限:执行器ID列表,多个逗号分割',PRIMARY KEY (`id`),UNIQUE KEY `i_username` (`username`) USING BTREE
) ENGINE = InnoDBDEFAULT CHARSET = utf8mb4;CREATE TABLE `xxl_job_lock`
(`lock_name` varchar(50) NOT NULL COMMENT '锁名称',PRIMARY KEY (`lock_name`)
) ENGINE = InnoDBDEFAULT CHARSET = utf8mb4;## —————————————————————— init data ——————————————————INSERT INTO `xxl_job_group`(`id`, `app_name`, `title`, `address_type`, `address_list`, `update_time`)VALUES (1, 'xxl-job-executor-sample', '通用执行器Sample', 0, NULL, now()),(2, 'xxl-job-executor-sample-ai', 'AI执行器Sample', 0, NULL, now());INSERT INTO `xxl_job_info`(`id`, `job_group`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`,`schedule_type`, `schedule_conf`, `misfire_strategy`, `executor_route_strategy`,`executor_handler`, `executor_param`, `executor_block_strategy`, `executor_timeout`,`executor_fail_retry_count`, `glue_type`, `glue_source`, `glue_remark`, `glue_updatetime`,`child_jobid`)
VALUES (1, 1, '示例任务01', now(), now(), 'XXL', '', 'CRON', '0 0 0 * * ? *','DO_NOTHING', 'FIRST', 'demoJobHandler', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 'GLUE代码初始化',now(), ''),(2, 2, 'Ollama示例任务01', now(), now(), 'XXL', '', 'NONE', '','DO_NOTHING', 'FIRST', 'ollamaJobHandler', '{"input": "慢SQL问题分析思路","prompt": "你是一个研发工程师,擅长解决技术类问题。"
}', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 'GLUE代码初始化',now(), ''),(3, 2, 'Dify示例任务', now(), now(), 'XXL', '', 'NONE', '','DO_NOTHING', 'FIRST', 'difyWorkflowJobHandler', '{"inputs":{"input":"查询班级各学科前三名"},"user": "xxl-job","baseUrl": "http://localhost/v1","apiKey": "app-OUVgNUOQRIMokfmuJvBJoUTN"
}', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 'GLUE代码初始化',now(), '');INSERT INTO `xxl_job_user`(`id`, `username`, `password`, `role`, `permission`)
VALUES (1, 'admin', 'e10adc3949ba59abbe56e057f20f883e', 1, NULL);INSERT INTO `xxl_job_lock` (`lock_name`)
VALUES ('schedule_lock');commit;
最后是本身项目依赖的表
use ckoj_dev;
create table tb_sys_user (
user_id bigint unsigned not null comment '⽤⼾id(主键)',
user_account varchar(20) not null comment '账号',
nick_name varchar(20) comment '昵称',
password char(60) not null comment '密码',
create_by bigint unsigned not null comment '创建⼈',
create_time datetime not null comment '创建时间',
update_by bigint unsigned comment '更新⼈',
update_time datetime comment '跟新时间',
primary key (`user_id`),
unique key `idx_user_account` (`user_account`)
);create table tb_question(
question_id bigint unsigned not null comment '题⽬id',
title varchar(50) not null comment '题⽬标题',
difficulty tinyint not null comment '题⽬难度1:简单 2:中等 3:困难',
time_limit int not null comment '时间限制',
space_limit int not null comment '空间限制',
content varchar(1000) not null comment '题⽬内容',
question_case varchar(1000) comment '题⽬⽤例',
default_code varchar(500) not null comment '默认代码块',
main_fuc varchar(500) not null comment 'main函数',
create_by bigint unsigned not null comment '创建⼈',
create_time datetime not null comment '创建时间',
update_by bigint unsigned comment '更新⼈',
update_time datetime comment '更新时间',
primary key(`question_id`)
);create table tb_exam (
exam_id bigint unsigned not null comment '竞赛id(主键)',
title varchar(50) not null comment '竞赛标题',
start_time datetime not null comment '竞赛开始时间',
end_time datetime not null comment '竞赛结束时间',
status tinyint not null default '0' comment '是否发布 0:未发布 1:已发布',
create_by bigint unsigned not null comment '创建⼈',
create_time datetime not null comment '创建时间',
update_by bigint unsigned comment '更新⼈',
update_time datetime comment '更新时间',
primary key(exam_id)
);create table tb_exam_question (
exam_question_id bigint unsigned not null comment '竞赛题⽬关系id(主键)',
question_id bigint unsigned not null comment '题⽬id(主键)',
exam_id bigint unsigned not null comment '竞赛id(主键)',
question_order int not null comment '题⽬顺序',
create_by bigint unsigned not null comment '创建⼈',
create_time datetime not null comment '创建时间',
update_by bigint unsigned comment '更新⼈',
update_time datetime comment '更新时间',
primary key(exam_question_id)
);create table tb_user(
user_id bigint unsigned NOT NULL COMMENT '⽤⼾id(主键)',
nick_name varchar(20) comment '⽤⼾昵称',
head_image varchar(100) comment '⽤⼾头像',
sex tinyint comment '⽤⼾状态1: 男 2:⼥',
phone char(11) not null comment '⼿机号',
code char(6) comment '验证码',
email varchar(20) comment '邮箱',
wechat varchar(20) comment '微信号',
school_name varchar(20) comment '学校',
major_name varchar(20) comment '专业',
introduce varchar(100) comment '个⼈介绍',
status tinyint not null comment '⽤⼾状态0: 拉⿊ 1:正常',
create_by bigint unsigned not null comment '创建⼈',
create_time datetime not null comment '创建时间',
update_by bigint unsigned comment '更新⼈',
update_time datetime comment '更新时间',
primary key(`user_id`)
);create table tb_user_exam(
user_exam_id bigint unsigned NOT NULL COMMENT '⽤⼾竞赛关系id',
user_id bigint unsigned NOT NULL COMMENT '⽤⼾id',
exam_id bigint unsigned NOT NULL COMMENT '竞赛id',
score int unsigned COMMENT '得分',
exam_rank int unsigned COMMENT '排名',
create_by bigint unsigned not null comment '创建⼈',
create_time datetime not null comment '创建时间',
update_by bigint unsigned comment '更新⼈',
update_time datetime comment '更新时间',
primary key(user_exam_id)
);create table tb_user_submit(
submit_id bigint unsigned NOT NULL COMMENT '提交记录id',
user_id bigint unsigned NOT NULL COMMENT '⽤⼾id',
question_id bigint unsigned NOT NULL COMMENT '题⽬id',
exam_id bigint unsigned COMMENT '竞赛id',
program_type tinyint NOT NULL COMMENT '代码类型 0 java 1 CPP',
user_code text NOT NULL COMMENT '⽤⼾代码',
pass tinyint NOT NULL COMMENT '0:未通过 1:通过',
exe_message varchar(500) COMMENT '执⾏结果',
case_judge_res varchar(1000) COMMENT '测试⽤例输出结果',
score int NOT NULL DEFAULT '0' COMMENT '得分',
create_by bigint unsigned not null comment '创建⼈',
create_time datetime not null comment '创建时间',
update_by bigint unsigned comment '更新⼈',
update_time datetime comment '更新时间',
primary key(`submit_id`)
);create table tb_message_text(
text_id bigint unsigned NOT NULL COMMENT '消息内容id(主键)',
message_title varchar(10) NOT NULL COMMENT '消息标题',
message_content varchar(200) NOT NULL COMMENT '消息内容',
create_by bigint unsigned not null comment '创建⼈',
create_time datetime not null comment '创建时间',
update_by bigint unsigned comment '更新⼈',
update_time datetime comment '更新时间',
primary key (text_id)
);create table tb_message(
message_id bigint unsigned NOT NULL COMMENT '消息id(主键)',
text_id bigint unsigned NOT NULL COMMENT '消息内容id(主键)',
send_id bigint unsigned NOT NULL COMMENT '消息发送⼈id',
rec_id bigint unsigned NOT NULL COMMENT '消息接收⼈id',
create_by bigint unsigned not null comment '创建⼈',
create_time datetime not null comment '创建时间',
update_by bigint unsigned comment '更新⼈',
update_time datetime comment '更新时间',
primary key (message_id)
);
1.7 nacos
oj-nacos-server:image: nacos/nacos-server:v2.2.2 # 替换为nacos的Docker镜像名及版本container_name: oj-nacos-server# 设置 Nacos 的运行模式为独立模式,限制了 Java 虚拟机的内存使用,并指定连接到 oj-mysql-server 数据库的信息environment:- MODE=standalone- JVM_XMS=256m- JVM_XMX=256m- SPRING_DATASOURCE_PLATFORM=mysql- MYSQL_SERVICE_HOST=oj-mysql-server- MYSQL_SERVICE_PORT=3306- MYSQL_SERVICE_DB_NAME=ckoj_nacos_local- MYSQL_SERVICE_USER=ojtest- MYSQL_SERVICE_PASSWORD=123456volumes:- ./nacos/conf/application.properties:/home/nacos/conf/application.properties# 将容器的 8848 和 9848 端口映射到主机的对应端口ports:- "8848:8848"- "9848:9848"depends_on:oj-mysql-server:condition: service_healthyhealthcheck:test: [ "CMD", "curl", "-f", "http://localhost:8848/nacos" ]interval: 30stimeout: 10sretries: 10
把宿主机上的./nacos/conf/application.properties的配置文件挂载到容器上/home/nacos/conf/application.properties
因为要修改nacos配置文件—》开启鉴权
只需要修改这三个就可以了
# spring
server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}
server.contextPath=/nacos
server.port=${NACOS_APPLICATION_PORT:8848}
server.tomcat.accesslog.max-days=30
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i %{Request-Source}i
server.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}
server.error.include-message=ALWAYS
# default current work dir
server.tomcat.basedir=file:.
#*************** Config Module Related Configurations ***************#
### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced.
#spring.datasource.platform=${SPRING_DATASOURCE_PLATFORM:}
spring.sql.init.platform=${SPRING_DATASOURCE_PLATFORM:}
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
db.num=${MYSQL_DATABASE_NUM:1}
db.url.0=jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT:3306}/${MYSQL_SERVICE_DB_NAME}?${MYSQL_SERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false}
db.user.0=${MYSQL_SERVICE_USER}
db.password.0=${MYSQL_SERVICE_PASSWORD}
### The auth system to use, currently only 'nacos' and 'ldap' is supported:
nacos.core.auth.system.type=${NACOS_AUTH_SYSTEM_TYPE:nacos}
### worked when nacos.core.auth.system.type=nacos
### The token expiration in seconds:
nacos.core.auth.plugin.nacos.token.expire.seconds=${NACOS_AUTH_TOKEN_EXPIRE_SECONDS:18000}
### The default token:
nacos.core.auth.plugin.nacos.token.secret.key=${NACOS_AUTH_TOKEN:VGhpc0lzTXlDdXN0b21TZWNyZXRLZXkwMTIzNDU2Nzg=}
### Turn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay.
nacos.core.auth.caching.enabled=${NACOS_AUTH_CACHE_ENABLE:false}
nacos.core.auth.enable.userAgentAuthWhite=${NACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLE:false}
nacos.core.auth.enabled=true
nacos.core.auth.server.identity.key=${NACOS_AUTH_IDENTITY_KEY:CKOJ202403031025}
nacos.core.auth.server.identity.value=${NACOS_AUTH_IDENTITY_VALUE:CKOJ202403031025}
## spring security config
### turn off security
nacos.security.ignore.urls=${NACOS_SECURITY_IGNORE_URLS:/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**}
# metrics for elastic search
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false
nacos.naming.distro.taskDispatchThreadCount=10
nacos.naming.distro.taskDispatchPeriod=200
nacos.naming.distro.batchSyncKeyCount=1000
nacos.naming.distro.initDataRatio=0.9
nacos.naming.distro.syncRetryDelay=5000
nacos.naming.data.warmup=true
这个就是配置文件
depends_on:的意思是mysql服务健康才会进行nacos的健康检查,才会启动
我们修改一下
记得还要拷贝nacos文件,因为
然后执行一下
docker compose up -d
volumes:- ./nacos/conf/application.properties:/home/nacos/conf/application.properties
这个的意思是把宿主机上的./nacos/conf/application.properties,挂载到容器/home/nacos/conf/application.properties
所以还要上传nacos文件上去才可以,因为我们上传的这个是修改过的
为什么要上传呢,因为我们修改了这个配置文件,如果没有修改的话,挂载的就是默认配置文件,不用上传