diff --git a/Jenkinsfile b/Jenkinsfile index 80af5e1..19dd792 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -22,7 +22,7 @@ pipeline { DEPS_IMAGE = "${REGISTRY}/aiot-deps:latest" // 服务配置 - CORE_SERVICES = 'viewsh-gateway,viewsh-module-system-server,viewsh-module-infra-server,viewsh-module-iot-server,viewsh-module-iot-gateway' + CORE_SERVICES = 'viewsh-gateway,viewsh-module-system-server,viewsh-module-infra-server,viewsh-module-iot-server,viewsh-module-iot-gateway,viewsh-module-ops-server' // 部署配置 DEPLOY_HOST = '172.19.0.1' @@ -1000,7 +1000,8 @@ def sortServicesByDependency(def services) { 'viewsh-module-system-server', 'viewsh-module-infra-server', 'viewsh-module-iot-server', - 'viewsh-module-iot-gateway' + 'viewsh-module-iot-gateway', + 'viewsh-module-ops-server' ] return services.sort { a, b -> @@ -1016,7 +1017,8 @@ def getContainerNameForService(String service) { 'viewsh-module-system-server': 'aiot-system-server', 'viewsh-module-infra-server': 'aiot-infra-server', 'viewsh-module-iot-server': 'aiot-iot-server', - 'viewsh-module-iot-gateway': 'aiot-iot-gateway' + 'viewsh-module-iot-gateway': 'aiot-iot-gateway', + 'viewsh-module-ops-server': 'aiot-ops-server' ] return map.get(service, "aiot-${service}") } @@ -1029,7 +1031,8 @@ def getModulePathForService(String service) { 'viewsh-module-system-server': 'viewsh-module-system/viewsh-module-system-server', 'viewsh-module-infra-server': 'viewsh-module-infra/viewsh-module-infra-server', 'viewsh-module-iot-server': 'viewsh-module-iot/viewsh-module-iot-server', - 'viewsh-module-iot-gateway': 'viewsh-module-iot/viewsh-module-iot-gateway' + 'viewsh-module-iot-gateway': 'viewsh-module-iot/viewsh-module-iot-gateway', + 'viewsh-module-ops-server': 'viewsh-module-ops/viewsh-module-ops-server' ] return map.get(service, service) } diff --git a/docker-compose.core.yml b/docker-compose.core.yml index 93e23b5..e6dd515 100644 --- a/docker-compose.core.yml +++ b/docker-compose.core.yml @@ -208,3 +208,40 @@ services: depends_on: - viewsh-module-iot-server + viewsh-module-ops-server: + image: ${REGISTRY_HOST:-localhost:5000}/viewsh-module-ops-server:${IMAGE_TAG:-latest} + container_name: aiot-ops-server + restart: on-failure:5 + ports: + - "48092:48092" + environment: + TZ: Asia/Shanghai + SPRING_PROFILES_ACTIVE: prod + JAVA_OPTS: "-Xms512m -Xmx1024m -XX:+UseContainerSupport -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/app/logs" + + NACOS_USERNAME: nacos + NACOS_PASSWORD: 9oDxX~}e7DeP + NACOS_ADDR: 172.17.16.14:8848 + NACOS_DISCOVERY_NAMESPACE: "8efd6d96-de7f-4664-b28e-c2788ffa1395" + NACOS_CONFIG_NAMESPACE: "8efd6d96-de7f-4664-b28e-c2788ffa1395" + + SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_URL: jdbc:mysql://172.17.16.14:3306/aiot-platform?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true + SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_USERNAME: root + SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_PASSWORD: "65p^VTPi9Qd+" + + SPRING_DATA_REDIS_HOST: 172.17.16.14 + SPRING_DATA_REDIS_PASSWORD: "9kHXcZ1ojFsD" + + ROCKETMQ_NAME_SERVER: 172.17.16.14:9876 + + volumes: + - app-logs:/app/logs + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:48092/actuator/health"] + interval: 10s + timeout: 5s + retries: 12 + start_period: 120s + depends_on: + viewsh-module-iot-server: + condition: service_healthy diff --git a/viewsh-module-ops/viewsh-module-ops-server/Dockerfile b/viewsh-module-ops/viewsh-module-ops-server/Dockerfile new file mode 100644 index 0000000..37ec1d8 --- /dev/null +++ b/viewsh-module-ops/viewsh-module-ops-server/Dockerfile @@ -0,0 +1,19 @@ +## AdoptOpenJDK 停止发布 OpenJDK 二进制,而 Eclipse Temurin 是它的延伸,提供更好的稳定性 +## 感谢复旦核博士的建议!灰子哥,牛皮! +FROM eclipse-temurin:21-jre + +## 创建目录,并使用它作为工作目录 +RUN mkdir -p /viewsh-module-ops-server +WORKDIR /viewsh-module-ops-server +## 将后端项目的 Jar 文件,复制到镜像中 +COPY ./target/viewsh-module-ops-server.jar app.jar + +## 设置 TZ 时区 +## 设置 JAVA_OPTS 环境变量,可通过 docker run -e "JAVA_OPTS=" 进行覆盖 +ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms512m -Xmx512m" + +## 暴露后端项目的 48092 端口 +EXPOSE 48092 + +## 启动后端项目 +CMD java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar app.jar diff --git a/viewsh-module-ops/viewsh-module-ops-server/src/main/resources/application-prod.yaml b/viewsh-module-ops/viewsh-module-ops-server/src/main/resources/application-prod.yaml new file mode 100644 index 0000000..dfae8cc --- /dev/null +++ b/viewsh-module-ops/viewsh-module-ops-server/src/main/resources/application-prod.yaml @@ -0,0 +1,147 @@ +--- #################### 注册中心 + 配置中心相关配置 #################### + +spring: + cloud: + nacos: + server-addr: ${NACOS_ADDR:127.0.0.1:8848} # Nacos 服务器地址 + username: ${NACOS_USERNAME:nacos} # Nacos 账号 + password: ${NACOS_PASSWORD:nacos} # Nacos 密码 + discovery: # 【配置中心】配置项 + namespace: ${NACOS_DISCOVERY_NAMESPACE:public} # 命名空间 + group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP + metadata: + version: 1.0.0 # 服务实例的版本号,可用于灰度发布 + config: # 【注册中心】配置项 + namespace: ${NACOS_CONFIG_NAMESPACE:public} # 命名空间 + group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP + +--- #################### 数据库相关配置 #################### +spring: + # 数据源配置项 + autoconfigure: + # noinspection SpringBootApplicationYaml + exclude: + - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 排除 Druid 的自动配置,使用 dynamic-datasource-spring-boot-starter 配置多数据源 + datasource: + druid: # Druid 【监控】相关的全局配置 + web-stat-filter: + enabled: true + stat-view-servlet: + enabled: true + allow: # 设置白名单,不填则允许所有访问 + url-pattern: /druid/* + login-username: # 控制台管理用户名和密码 + login-password: + filter: + stat: + enabled: true + log-slow-sql: true # 慢 SQL 记录 + slow-sql-millis: 100 + merge-sql: true + wall: + config: + multi-statement-allow: true + dynamic: # 多数据源配置 + druid: # Druid 【连接池】相关的全局配置 + initial-size: 5 # 初始连接数 + min-idle: 10 # 最小连接池数量 + max-active: 20 # 最大连接池数量 + max-wait: 60000 # 配置获取连接等待超时的时间,单位:毫秒(1 分钟) + time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒(1 分钟) + min-evictable-idle-time-millis: 600000 # 配置一个连接在池中最小生存的时间,单位:毫秒(10 分钟) + max-evictable-idle-time-millis: 1800000 # 配置一个连接在池中最大生存的时间,单位:毫秒(30 分钟) + validation-query: SELECT 1 FROM DUAL # 配置检测连接是否有效 + test-while-idle: true + test-on-borrow: false + test-on-return: false + pool-prepared-statements: true # 是否开启 PreparedStatement 缓存 + max-pool-prepared-statement-per-connection-size: 20 # 每个连接缓存的 PreparedStatement 数量 + primary: master + datasource: + master: + url: ${SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_URL} + username: ${SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_USERNAME} + password: ${SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_PASSWORD} + slave: # 模拟从库,可根据自己需要修改 + lazy: true # 开启懒加载,保证启动速度 + url: ${SPRING_DATASOURCE_DYNAMIC_DATASOURCE_SLAVE_URL:${SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_URL}} + username: ${SPRING_DATASOURCE_DYNAMIC_DATASOURCE_SLAVE_USERNAME:${SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_USERNAME}} + password: ${SPRING_DATASOURCE_DYNAMIC_DATASOURCE_SLAVE_PASSWORD:${SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_PASSWORD}} + # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 + data: + redis: + host: ${SPRING_DATA_REDIS_HOST:127.0.0.1} # 地址 + port: ${SPRING_DATA_REDIS_PORT:6379} # 端口 + database: ${SPRING_DATA_REDIS_DATABASE:0} # 数据库索引 + password: ${SPRING_DATA_REDIS_PASSWORD} # 密码 + +--- #################### MQ 消息队列相关配置 #################### + +# rocketmq 配置项,对应 RocketMQProperties 配置类 +rocketmq: + name-server: ${ROCKETMQ_NAME_SERVER:127.0.0.1:9876} # RocketMQ Namesrv + +spring: + # RabbitMQ 配置项,对应 RabbitProperties 配置类 + rabbitmq: + host: ${SPRING_RABBITMQ_HOST:127.0.0.1} # RabbitMQ 服务的地址 + port: ${SPRING_RABBITMQ_PORT:5672} # RabbitMQ 服务的端口 + username: ${SPRING_RABBITMQ_USERNAME:guest} # RabbitMQ 服务的账号 + password: ${SPRING_RABBITMQ_PASSWORD:guest} # RabbitMQ 服务的密码 + # Kafka 配置项,对应 KafkaProperties 配置类 + kafka: + bootstrap-servers: ${SPRING_KAFKA_BOOTSTRAP_SERVERS:127.0.0.1:9092} # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔 + +--- #################### 定时任务相关配置 #################### + +xxl: + job: + enabled: true + admin: + addresses: ${XXL_JOB_ADMIN_ADDRESSES:http://127.0.0.1:9090/xxl-job-admin} # 调度中心部署跟地址 + +--- #################### 服务保障相关配置 #################### + +# Lock4j 配置项 +lock4j: + acquire-timeout: 3000 # 获取分布式锁超时时间,默认为 3000 毫秒 + expire: 30000 # 分布式锁的超时时间,默认为 30 毫秒 + +--- #################### 监控相关配置 #################### + +# Actuator 监控端点的配置项 +management: + endpoints: + web: + base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator + exposure: + include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 + +# Spring Boot Admin 配置项 +spring: + boot: + admin: + # Spring Boot Admin Client 客户端的相关配置 + client: + instance: + service-host-type: IP # 注册实例时,优先使用 IP [IP, HOST_NAME, CANONICAL_HOST_NAME] + username: ${SPRING_BOOT_ADMIN_CLIENT_USERNAME:admin} + password: ${SPRING_BOOT_ADMIN_CLIENT_PASSWORD:admin} + +# 日志文件配置 +logging: + level: + # 配置自己写的 MyBatis Mapper 打印日志 + com.viewsh.module.ops.dal.mysql: info # 生产环境建议 info + org.springframework.context.support.PostProcessorRegistrationDelegate: ERROR # TODO 芋艿:先禁用,Spring Boot 3.X 存在部分错误的 WARN 提示 + +--- #################### 芋道相关配置 #################### + +# 芋道配置项,设置当前项目所有自定义的配置 +viewsh: + env: # 多环境的配置项 + tag: ${HOSTNAME} + security: + mock-enable: false # 生产环境禁用 mock + access-log: # 访问日志的配置项 + enable: true # 生产环境开启访问日志