vhr项目部署与运维指南
本文详细介绍了微人事(vhr)项目的多环境配置文件管理、Docker容器化部署方案、Nginx反向代理配置以及系统监控与日志管理等核心运维内容。文章涵盖了从开发到生产环境的完整部署流程,包括配置文件结构设计、Docker Compose编排、Nginx性能优化、日志体系架构等关键技术要点,为vhr项目的稳定运行提供全面指导。
多环境配置文件管理
在现代企业级应用开发中,多环境配置管理是确保应用在不同部署环境中稳定运行的关键环节。vhr项目作为基于Spring Boot的前后端分离项目,采用了灵活的配置文件管理策略来支持开发、测试、生产等多种环境。
配置文件结构设计
vhr项目的配置文件采用YAML格式,位于vhr/vhrserver/vhr-web/src/main/resources/目录下。项目采用单一主配置文件application.yml结合环境特定配置的方式来实现多环境管理。
# 主配置文件 application.yml
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
username: root
password: 123
url: jdbc:mysql://localhost:3306/vhr?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
rabbitmq:
username: guest
password: guest
host: 127.0.0.1
publisher-confirms: true
publisher-returns: true
redis:
host: 127.0.0.1
database: 0
port: 6379
password: 123
server:
port: 8081
多环境配置实现方案
1. 环境特定配置文件命名规范
vhr项目推荐使用Spring Boot的标准命名约定来管理多环境配置:
application-dev.yml- 开发环境配置application-test.yml- 测试环境配置application-prod.yml- 生产环境配置application.yml- 公共基础配置
2. 配置属性覆盖机制
Spring Boot支持配置文件的层级覆盖机制,环境特定配置会覆盖主配置文件中的相同属性:
3. 环境激活方式
vhr项目支持多种环境激活方式:
通过启动参数激活:
java -jar vhr-web.jar --spring.profiles.active=prod
通过环境变量激活:
export SPRING_PROFILES_ACTIVE=dev
java -jar vhr-web.jar
通过application.yml配置激活:
spring:
profiles:
active: @activatedProperties@
典型多环境配置示例
开发环境配置 (application-dev.yml)
spring:
datasource:
url: jdbc:mysql://dev-db:3306/vhr_dev
username: dev_user
password: dev_password
redis:
host: dev-redis
rabbitmq:
host: dev-rabbitmq
logging:
level:
org.javaboy.vhr: DEBUG
生产环境配置 (application-prod.yml)
spring:
datasource:
url: jdbc:mysql://prod-db-cluster:3306/vhr_prod
username: prod_user
password: ${DB_PASSWORD}
druid:
max-active: 20
min-idle: 5
redis:
host: redis-cluster
password: ${REDIS_PASSWORD}
rabbitmq:
host: rabbitmq-cluster
username: ${RABBITMQ_USER}
password: ${RABBITMQ_PASSWORD}
server:
port: 80
logging:
level:
org.javaboy.vhr: INFO
敏感信息安全管理
vhr项目推荐使用环境变量和密钥管理工具来处理敏感配置信息:
| 配置方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 环境变量 | 安全、易维护 | 需要额外配置 | 密码、密钥等敏感信息 |
| 配置文件 | 直观、易管理 | 安全性较低 | 非敏感配置项 |
| 外部配置中心 | 集中管理、动态更新 | 架构复杂 | 大型分布式系统 |
# 使用环境变量示例
spring:
datasource:
password: ${DATABASE_PASSWORD:default_password}
redis:
password: ${REDIS_PASSWORD}
配置验证与最佳实践
配置验证脚本
建议创建配置验证脚本来确保环境配置的正确性:
#!/bin/bash
# config-validator.sh
function validate_config() {
local env=$1
local config_file="application-${env}.yml"
if [ ! -f "$config_file" ]; then
echo "错误: 配置文件 $config_file 不存在"
return 1
fi
# 检查必要配置项
required_keys=("spring.datasource.url" "spring.datasource.username")
for key in "${required_keys[@]}"; do
if ! grep -q "^[[:space:]]*${key}:" "$config_file"; then
echo "警告: 配置项 $key 在 $config_file 中缺失"
fi
done
echo "配置验证完成: $env 环境"
}
配置管理最佳实践
- 版本控制: 所有配置文件都应纳入版本控制,但敏感信息应使用占位符
- 配置分离: 将环境相关配置与代码分离,便于独立部署
- 配置模板: 提供配置模板文件,如
application-template.yml - 文档化: 为每个配置项提供详细的注释说明
# application-template.yml
spring:
datasource:
# 数据库连接URL,格式: jdbc:mysql://host:port/database
url: jdbc:mysql://localhost:3306/vhr
# 数据库用户名
username: your_username
# 数据库密码,建议使用环境变量
password: ${DB_PASSWORD}
通过合理的多环境配置管理,vhr项目能够实现开发、测试、生产环境的无缝切换,提高部署效率和系统稳定性。
Docker容器化部署方案
微人事(vhr)作为一个典型的前后端分离企业级应用,采用Docker容器化部署能够显著提升部署效率、环境一致性和系统可维护性。本节将详细介绍如何将vhr项目容器化,构建完整的Docker部署方案。
容器化架构设计
vhr项目的Docker容器化部署采用多容器架构,包含以下核心服务:
Docker镜像构建配置
后端Spring Boot服务Dockerfile
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
EXPOSE 8081
前端Vue应用Dockerfile
FROM node:14-alpine as build-stage
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine as production-stage
COPY --from=build-stage /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
Nginx配置文件
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://vhr-web:8081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /ws/ {
proxy_pass http://vhr-web:8081;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Docker Compose编排配置
创建完整的docker-compose.yml文件来编排所有服务:
version: '3.8'
services:
# MySQL数据库服务
mysql:
image: mysql:8.0
container_name: vhr-mysql
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: vhr
MYSQL_USER: vhr_user
MYSQL_PASSWORD: vhr_pass
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
networks:
- vhr-network
# Redis缓存服务
redis:
image: redis:6-alpine
container_name: vhr-redis
ports:
- "6379:6379"
command: redis-server --requirepass redis123
volumes:
- redis_data:/data
networks:
- vhr-network
# RabbitMQ消息队列
rabbitmq:
image: rabbitmq:3-management-alpine
container_name: vhr-rabbitmq
ports:
- "5672:5672"
- "15672:15672"
environment:
RABBITMQ_DEFAULT_USER: guest
RABBITMQ_DEFAULT_PASS: guest
volumes:
- rabbitmq_data:/var/lib/rabbitmq
networks:
- vhr-network
# 主应用服务
vhr-web:
build:
context: ./vhr/vhrserver/vhr-web
dockerfile: Dockerfile
container_name: vhr-web
ports:
- "8081:8081"
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/vhr?useUnicode=true&characterEncoding=UTF-8
SPRING_DATASOURCE_USERNAME: vhr_user
SPRING_DATASOURCE_PASSWORD: vhr_pass
SPRING_REDIS_HOST: redis
SPRING_REDIS_PORT: 6379
SPRING_REDIS_PASSWORD: redis123
SPRING_RABBITMQ_HOST: rabbitmq
depends_on:
- mysql
- redis
- rabbitmq
networks:
- vhr-network
# 邮件服务
mailserver:
build:
context: ./vhr/mailserver
dockerfile: Dockerfile
container_name: vhr-mailserver
ports:
- "8082:8082"
environment:
SPRING_RABBITMQ_HOST: rabbitmq
SPRING_REDIS_HOST: redis
SPRING_REDIS_PASSWORD: redis123
depends_on:
- rabbitmq
- redis
networks:
- vhr-network
# 前端Nginx服务
nginx:
build:
context: ./vuehr
dockerfile: Dockerfile
container_name: vhr-nginx
ports:
- "80:80"
depends_on:
- vhr-web
networks:
- vhr-network
volumes:
mysql_data:
redis_data:
rabbitmq_data:
networks:
vhr-network:
driver: bridge
环境变量配置管理
为不同环境创建对应的环境配置文件:
application-docker.yml
spring:
datasource:
url: jdbc:mysql://mysql:3306/vhr?useUnicode=true&characterEncoding=UTF-8
username: vhr_user
password: vhr_pass
redis:
host: redis
port: 6379
password: redis123
rabbitmq:
host: rabbitmq
port: 5672
username: guest
password: guest
server:
port: 8081
数据库初始化脚本
创建数据库初始化脚本init.sql:
CREATE DATABASE IF NOT EXISTS vhr CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER IF NOT EXISTS 'vhr_user'@'%' IDENTIFIED BY 'vhr_pass';
GRANT ALL PRIVILEGES ON vhr.* TO 'vhr_user'@'%';
FLUSH PRIVILEGES;
构建和部署流程
1. 项目构建脚本
创建build.sh自动化构建脚本:
#!/bin/bash
echo "构建后端服务..."
cd vhr/vhrserver/vhr-web
mvn clean package -DskipTests
cd ../../..
echo "构建前端应用..."
cd vuehr
npm install
npm run build
cd ..
echo "构建Docker镜像..."
docker-compose build
echo "启动服务..."
docker-compose up -d
echo "部署完成!访问 http://localhost"
2. 健康检查配置
为关键服务添加健康检查:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8081/actuator/health"]
interval: 30s
timeout: 10s
retries: 3
监控和日志管理
日志配置
配置统一的日志收集:
logging:
file:
name: /var/log/vhr/app.log
logback:
rollingpolicy:
max-file-size: 10MB
max-history: 30
监控配置
集成Prometheus监控:
management:
endpoints:
web:
exposure:
include: health,info,metrics,prometheus
metrics:
tags:
application: vhr
持续集成部署
创建GitHub Actions工作流:
name: Docker Build and Deploy
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Build backend
run: |
cd vhr/vhrserver/vhr-web
mvn clean package -DskipTests
- name: Build frontend
run: |
cd vuehr
npm install
npm run build
- name: Build and push Docker images
run: |
docker-compose build
# 推送镜像到镜像仓库
安全最佳实践
1. 网络安全配置
networks:
vhr-internal:
internal: true
vhr-external:
driver: bridge
2. 密钥管理
使用Docker Secrets管理敏感信息:
echo "redis123" | docker secret create redis_password -
echo "vhr_pass" | docker secret create db_password -
性能优化建议
1. JVM调优
ENV JAVA_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar /app.jar"]
2. 资源限制
deploy:
resources:
limits:
memory: 1G
cpus: '0.5'
reservations:
memory: 512M
cpus: '0.25'
通过以上Docker容器化部署方案,vhr项目可以实现快速部署、弹性扩展和高效运维,为生产环境提供稳定可靠的服务基础。
Nginx反向代理配置
在微人事(vhr)项目的生产环境部署中,Nginx反向代理配置是至关重要的一环。通过合理的Nginx配置,我们可以实现前后端分离部署、负载均衡、静态资源缓存、SSL加密等多种功能,显著提升系统的性能和安全性。
部署架构概述
微人事项目采用典型的前后端分离架构:
核心Nginx配置详解
以下是一个完整的Nginx配置文件示例,适用于微人事项目的生产环境部署:
# nginx.conf
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
events {
worker_connections 1024;
use epoll;
}
http {
include mime.types;
default_type application/octet-stream;
# 日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# Gzip压缩配置
gzip on;
gzip_min_length 1k;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml application/json application/javascript application/xml+rss application/atom+xml image/svg+xml;
# 静态资源缓存
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=static_cache:10m max_size=10g inactive=60m;
server {
listen 80;
server_name your-domain.com;
# 重定向到HTTPS
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name your-domain.com;
# SSL证书配置
ssl_certificate /path/to/your/certificate.crt;
ssl_certificate_key /path/to/your/private.key;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
# 现代加密套件
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# 静态资源服务 - Vue前端
location / {
root /opt/vhr/dist;
index index.html index.htm;
try_files $uri $uri/ /index.html;
# 缓存静态资源
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
proxy_cache static_cache;
proxy_cache_valid 200 302 1y;
proxy_cache_valid 404 1m;
}
}
# API接口反向代理 - Spring Boot后端
location /api/ {
proxy_pass http://localhost:8081/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 超时设置
proxy_connect_timeout 30s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
# 启用缓冲
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
proxy_busy_buffers_size 8k;
}
# WebSocket代理配置
location /ws/ {
proxy_pass http://localhost:8081/ws/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# WebSocket超时设置
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
# 健康检查端点
location /health {
access_log off;
return 200 "healthy\n";
add_header Content-Type text/plain;
}
# 安全头设置
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
}
}
关键配置解析
1. 静态资源服务配置
location / {
root /opt/vhr/dist;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
root /opt/vhr/dist:指定Vue.js打包后的静态文件目录try_files $uri $uri/ /index.html:支持Vue Router的history模式- 静态资源缓存策略优化了加载性能
2. API反向代理配置
location /api/ {
proxy_pass http://localhost:8081/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
- 将所有
/api/开头的请求代理到后端Spring Boot服务 - 正确设置请求头,确保后端能获取真实的客户端信息
3. WebSocket代理配置
location /ws/ {
proxy_pass http://localhost:8081/ws/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
- 支持WebSocket长连接,用于实时聊天功能
- 配置适当的超时时间确保连接稳定性
性能优化配置
缓存策略
# 静态资源缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
Gzip压缩
gzip on;
gzip_min_length 1k;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml application/json application/javascript;
安全配置
SSL/TLS配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;
安全头设置
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
部署验证步骤
完成Nginx配置后,需要执行以下验证步骤:
-
语法检查:
nginx -t -
重载配置:
nginx -s reload -
服务状态检查:
systemctl status nginx -
端口监听验证:
netstat -tlnp | grep nginx -
SSL证书验证:
openssl s_client -connect your-domain.com:443
常见问题排查
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 502 Bad Gateway | 后端服务未启动 | 检查Spring Boot服务状态 |
| 404 Not Found | 静态资源路径错误 | 确认dist目录位置 |
| WebSocket连接失败 | 代理配置错误 | 检查WebSocket location配置 |
| SSL证书错误 | 证书路径或权限问题 | 验证证书文件权限 |
监控与日志分析
配置适当的日志记录便于问题排查:
# 访问日志
access_log /var/log/nginx/vhr-access.log main;
# 错误日志
error_log /var/log/nginx/vhr-error.log warn;
通过分析日志可以及时发现性能瓶颈和安全威胁,确保微人事系统的稳定运行。
合理的Nginx反向代理配置不仅提升了系统的性能和安全性,还为后续的扩展和维护提供了良好的基础。建议定期审查和优化Nginx配置,以适应业务发展的需求。
系统监控与日志管理
在微人事(vhr)项目中,系统监控与日志管理是确保系统稳定运行和问题排查的关键环节。项目采用了多层次的日志记录和监控机制,涵盖了操作日志、邮件发送日志、系统运行日志等多个方面。
日志体系架构
vhr项目的日志体系采用了分层设计,主要包括以下几个层面:
数据库日志设计
操作日志表(oplog)
操作日志表用于记录系统用户的关键操作行为,表结构设计如下:
| 字段名 | 类型 | 说明 | 约束 |
|---|---|---|---|
| id | int(11) | 主键ID | PRIMARY KEY, AUTO_INCREMENT |
| addDate | date | 操作日期 | 记录操作发生日期 |
| operate | varchar(255) | 操作内容 | 描述具体操作内容 |
| hrid | int(11) | 操作员ID | FOREIGN KEY REFERENCES hr(id) |
CREATE TABLE `oplog` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`addDate` date DEFAULT NULL COMMENT '添加日期',
`operate` varchar(255) DEFAULT NULL COMMENT '操作内容',
`hrid` int(11) DEFAULT NULL COMMENT '操作员ID',
PRIMARY KEY (`id`),
KEY `hrid` (`hrid`),
CONSTRAINT `oplog_ibfk_1` FOREIGN KEY (`hrid`) REFERENCES `hr` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
邮件发送日志表(mail_send_log)
邮件发送日志表专门用于跟踪邮件发送状态和重试机制:
| 字段名 | 类型 | 说明 | 约束 |
|---|---|---|---|
| msgId | varchar(255) | 消息ID | 唯一标识消息 |
| empId | int(11) | 员工ID | 关联员工信息 |
| status | int(11) | 发送状态 | 0:发送中, 1:成功, 2:失败 |
| routeKey | varchar(255) | 路由键 | RabbitMQ路由键 |
| exchange | varchar(255) | 交换机 | RabbitMQ交换机 |
| count | int(11) | 重试次数 | 默认0,最大3次 |
| tryTime | datetime | 重试时间 | 第一次重试时间 |
| createTime | datetime | 创建时间 | 记录创建时间 |
| updateTime | datetime | 更新时间 | 最后更新时间 |
CREATE TABLE `mail_send_log` (
`msgId` varchar(255) DEFAULT NULL,
`empId` int(11) DEFAULT NULL,
`status` int(11) DEFAULT '0' COMMENT '0发送中,1发送成功,2发送失败',
`routeKey` varchar(255) DEFAULT NULL,
`exchange` varchar(255) DEFAULT NULL,
`count` int(11) DEFAULT 0 COMMENT '重试次数',
`tryTime` datetime DEFAULT NULL COMMENT '第一次重试时间',
`createTime` datetime DEFAULT NULL,
`updateTime` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
邮件发送监控机制
vhr项目实现了完整的邮件发送监控和重试机制,通过RabbitMQ和定时任务确保邮件可靠投递。
邮件发送状态机
核心监控代码实现
@Component
public class MailSendTask {
@Autowired
MailSendLogService mailSendLogService;
@Scheduled(cron = "0/10 * * * * ?")
public void mailResendTask() {
List<MailSendLog> logs = mailSendLogService.getMailSendLogsByStatus();
if (logs == null || logs.size() == 0) {
return;
}
logs.forEach(mailSendLog->{
if (mailSendLog.getCount() >= 3) {
// 重试超过3次,标记为发送失败
mailSendLogService.updateMailSendLogStatus(mailSendLog.getMsgId(), 2);
}else{
// 继续重试
mailSendLogService.updateCount(mailSendLog.getMsgId(), new Date());
Employee emp = employeeService.getEmployeeById(mailSendLog.getEmpId());
rabbitTemplate.convertAndSend(
MailConstants.MAIL_EXCHANGE_NAME,
MailConstants.MAIL_ROUTING_KEY_NAME,
emp,
new CorrelationData(mailSendLog.getMsgId())
);
}
});
}
}
RabbitMQ消息确认机制
项目通过RabbitMQ的确认回调机制实现消息发送状态的实时监控:
@Configuration
public class RabbitConfig {
public final static Logger logger = LoggerFactory.getLogger(RabbitConfig.class);
@Bean
RabbitTemplate rabbitTemplate() {
RabbitTemplate rabbitTemplate = new RabbitTemplate(cachingConnectionFactory);
rabbitTemplate.setConfirmCallback((data, ack, cause) -> {
String msgId = data.getId();
if (ack) {
logger.info(msgId + ":消息发送成功");
mailSendLogService.updateMailSendLogStatus(msgId, 1);
} else {
logger.info(msgId + ":消息发送失败");
}
});
return rabbitTemplate;
}
}
日志服务层实现
邮件发送日志服务提供了完整的CRUD操作和状态管理:
@Service
public class MailSendLogService {
@Autowired
MailSendLogMapper mailSendLogMapper;
public Integer updateMailSendLogStatus(String msgId, Integer status) {
return mailSendLogMapper.updateMailSendLogStatus(msgId, status);
}
public Integer insert(MailSendLog mailSendLog) {
return mailSendLogMapper.insert(mailSendLog);
}
public List<MailSendLog> getMailSendLogsByStatus() {
return mailSendLogMapper.getMailSendLogsByStatus();
}
public Integer updateCount(String msgId, Date date) {
return mailSendLogMapper.updateCount(msgId, date);
}
}
MyBatis映射文件配置
邮件发送日志的数据库操作通过MyBatis XML映射文件实现:
<mapper namespace="org.javaboy.vhr.mapper.MailSendLogMapper">
<update id="updateMailSendLogStatus">
update mail_send_log set status = #{status} where msgId=#{msgId};
</update>
<insert id="insert" parameterType="org.javaboy.vhr.model.MailSendLog">
insert into mail_send_log (msgId,empId,routeKey,exchange,tryTime,createTime)
values (#{msgId},#{empId},#{routeKey},#{exchange},#{tryTime},#{createTime});
</insert>
<select id="getMailSendLogsByStatus" resultType="org.javaboy.vhr.model.MailSendLog">
select * from mail_send_log where status=0 and tryTime < sysdate()
</select>
<update id="updateCount">
update mail_send_log set count=count+1,updateTime=#{date} where msgId=#{msgId};
</update>
</mapper>
操作日志管理
操作日志通过专门的Mapper接口进行管理:
public interface OpLogMapper {
int insert(OpLog record);
int insertSelective(OpLog record);
OpLog selectByPrimaryKey(Integer id);
int updateByPrimaryKeySelective(OpLog record);
int updateByPrimaryKey(OpLog record);
}
日志查询优化
为了提高日志查询效率,项目在数据库层面进行了优化:
- 索引优化:为oplog表的hrid字段和mail_send_log表的msgId字段创建了索引
- 状态过滤:通过status字段快速筛选需要处理的邮件日志
- 时间范围查询:利用tryTime字段进行时间范围的日志检索
监控告警机制
vhr项目通过以下机制实现监控告警:
- 定时任务监控:每10秒检查一次待重试的邮件
- 重试次数限制:最多重试3次,超过则标记为失败
- 实时状态更新:通过RabbitMQ确认回调实时更新发送状态
- 日志记录:所有关键操作都有详细的日志记录
最佳实践建议
基于vhr项目的日志监控体系,推荐以下最佳实践:
- 日志分级:根据不同重要性设置不同的日志级别
- 异步处理:日志记录应采用异步方式,避免影响主业务流程
- 日志聚合:使用ELK等工具进行日志聚合和分析
- 监控告警:设置关键指标的监控告警阈值
- 日志保留策略:制定合理的日志保留和归档策略
通过这套完整的日志监控体系,vhr项目能够有效跟踪系统运行状态,快速定位和解决问题,确保系统的稳定性和可靠性。
总结
vhr项目通过完善的多环境配置管理、容器化部署方案、Nginx反向代理优化以及系统监控日志体系,构建了企业级应用的完整运维解决方案。这些实践不仅确保了应用在不同环境中的稳定运行,还提供了良好的可扩展性和可维护性。合理的配置管理、容器化部署和监控日志体系是保障系统高可用性的关键因素,为类似项目的部署运维提供了有价值的参考。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



