vhr项目部署与运维指南

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支持配置文件的层级覆盖机制,环境特定配置会覆盖主配置文件中的相同属性:

mermaid

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 环境"
}
配置管理最佳实践
  1. 版本控制: 所有配置文件都应纳入版本控制,但敏感信息应使用占位符
  2. 配置分离: 将环境相关配置与代码分离,便于独立部署
  3. 配置模板: 提供配置模板文件,如application-template.yml
  4. 文档化: 为每个配置项提供详细的注释说明
# 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容器化部署采用多容器架构,包含以下核心服务:

mermaid

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加密等多种功能,显著提升系统的性能和安全性。

部署架构概述

微人事项目采用典型的前后端分离架构:

mermaid

核心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配置后,需要执行以下验证步骤:

  1. 语法检查

    nginx -t
    
  2. 重载配置

    nginx -s reload
    
  3. 服务状态检查

    systemctl status nginx
    
  4. 端口监听验证

    netstat -tlnp | grep nginx
    
  5. 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项目的日志体系采用了分层设计,主要包括以下几个层面:

mermaid

数据库日志设计

操作日志表(oplog)

操作日志表用于记录系统用户的关键操作行为,表结构设计如下:

字段名类型说明约束
idint(11)主键IDPRIMARY KEY, AUTO_INCREMENT
addDatedate操作日期记录操作发生日期
operatevarchar(255)操作内容描述具体操作内容
hridint(11)操作员IDFOREIGN 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)

邮件发送日志表专门用于跟踪邮件发送状态和重试机制:

字段名类型说明约束
msgIdvarchar(255)消息ID唯一标识消息
empIdint(11)员工ID关联员工信息
statusint(11)发送状态0:发送中, 1:成功, 2:失败
routeKeyvarchar(255)路由键RabbitMQ路由键
exchangevarchar(255)交换机RabbitMQ交换机
countint(11)重试次数默认0,最大3次
tryTimedatetime重试时间第一次重试时间
createTimedatetime创建时间记录创建时间
updateTimedatetime更新时间最后更新时间
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和定时任务确保邮件可靠投递。

邮件发送状态机

mermaid

核心监控代码实现
@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 &lt; 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);
}

日志查询优化

为了提高日志查询效率,项目在数据库层面进行了优化:

  1. 索引优化:为oplog表的hrid字段和mail_send_log表的msgId字段创建了索引
  2. 状态过滤:通过status字段快速筛选需要处理的邮件日志
  3. 时间范围查询:利用tryTime字段进行时间范围的日志检索

监控告警机制

vhr项目通过以下机制实现监控告警:

  1. 定时任务监控:每10秒检查一次待重试的邮件
  2. 重试次数限制:最多重试3次,超过则标记为失败
  3. 实时状态更新:通过RabbitMQ确认回调实时更新发送状态
  4. 日志记录:所有关键操作都有详细的日志记录

最佳实践建议

基于vhr项目的日志监控体系,推荐以下最佳实践:

  1. 日志分级:根据不同重要性设置不同的日志级别
  2. 异步处理:日志记录应采用异步方式,避免影响主业务流程
  3. 日志聚合:使用ELK等工具进行日志聚合和分析
  4. 监控告警:设置关键指标的监控告警阈值
  5. 日志保留策略:制定合理的日志保留和归档策略

通过这套完整的日志监控体系,vhr项目能够有效跟踪系统运行状态,快速定位和解决问题,确保系统的稳定性和可靠性。

总结

vhr项目通过完善的多环境配置管理、容器化部署方案、Nginx反向代理优化以及系统监控日志体系,构建了企业级应用的完整运维解决方案。这些实践不仅确保了应用在不同环境中的稳定运行,还提供了良好的可扩展性和可维护性。合理的配置管理、容器化部署和监控日志体系是保障系统高可用性的关键因素,为类似项目的部署运维提供了有价值的参考。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值