Files
jiebanke/backend-java/PERFORMANCE_OPTIMIZATION.md
aiotagro b2d940e014 docs(deployment): 更新部署文档并添加自动化部署脚本
- 更新了 DEPLOYMENT.md 文档,增加了更多部署细节和说明
- 添加了 Linux 和 Windows 平台的自动化部署脚本
- 更新了 README.md,增加了部署相关说明
- 调整了 .env 文件配置,以适应新的部署流程
- 移除了部分不必要的代码和配置
2025-09-10 14:16:27 +08:00

7.5 KiB
Raw Blame History

结伴客Java后端性能优化指南

1. JVM调优

1.1 堆内存设置

# 堆内存大小设置(根据服务器配置调整)
-Xms512m
-Xmx2g

# 新生代大小设置
-Xmn256m

# Metaspace大小设置
-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=512m

1.2 垃圾回收器选择

# G1垃圾回收器适用于大堆内存
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:G1HeapRegionSize=16m

# 或者CMS垃圾回收器适用于低延迟要求
-XX:+UseConcMarkSweepGC
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=70

2. 数据库连接池优化

2.1 HikariCP配置在application.yml中

spring:
  datasource:
    hikari:
      # 连接池大小
      maximum-pool-size: 20
      # 最小空闲连接数
      minimum-idle: 5
      # 连接超时时间
      connection-timeout: 30000
      # 空闲超时时间
      idle-timeout: 600000
      # 最大生命周期
      max-lifetime: 1800000
      # 连接测试查询
      connection-test-query: SELECT 1

3. Redis性能优化

3.1 Redis连接池配置

spring:
  redis:
    lettuce:
      pool:
        # 最大连接数
        max-active: 20
        # 最大空闲连接数
        max-idle: 10
        # 最小空闲连接数
        min-idle: 5
        # 获取连接最大等待时间
        max-wait: 2000ms

3.2 Redis序列化优化

@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
    RedisTemplate<String, Object> template = new RedisTemplate<>();
    template.setConnectionFactory(connectionFactory);
    
    // 使用更高效的序列化方式
    template.setKeySerializer(new StringRedisSerializer());
    template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
    template.setHashKeySerializer(new StringRedisSerializer());
    template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
    
    return template;
}

4. RabbitMQ性能优化

4.1 连接池配置

spring:
  rabbitmq:
    listener:
      simple:
        # 并发消费者数量
        concurrency: 5
        # 最大并发消费者数量
        max-concurrency: 20
        # 每个消费者预取的消息数量
        prefetch: 10

5. Feign客户端优化

5.1 Feign配置

@Configuration
public class FeignConfig {
    
    @Bean
    public Request.Options options() {
        // 连接超时时间和读取超时时间
        return new Request.Options(5000, 10000);
    }
    
    @Bean
    public Retryer retryer() {
        // 重试策略
        return new Retryer.Default(1000, 2000, 3);
    }
}

6. 线程池优化

6.1 自定义线程池

@Configuration
public class ThreadPoolConfig {
    
    @Bean("taskExecutor")
    public ExecutorService taskExecutor() {
        return new ThreadPoolExecutor(
            10,           // 核心线程数
            20,           // 最大线程数
            60L,          // 空闲线程存活时间
            TimeUnit.SECONDS,
            new LinkedBlockingQueue<>(100),  // 任务队列
            new ThreadFactoryBuilder().setNameFormat("task-pool-%d").build(),
            new ThreadPoolExecutor.CallerRunsPolicy()  // 拒绝策略
        );
    }
}

7. 缓存策略优化

7.1 多级缓存设计

@Service
public class UserService {
    
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    
    // 本地缓存Caffeine
    private Cache<String, Object> localCache = Caffeine.newBuilder()
        .maximumSize(1000)
        .expireAfterWrite(10, TimeUnit.MINUTES)
        .build();
    
    public User getUserById(Long userId) {
        // 1. 先查本地缓存
        User user = (User) localCache.getIfPresent("user:" + userId);
        if (user != null) {
            return user;
        }
        
        // 2. 再查Redis缓存
        user = (User) redisTemplate.opsForValue().get("user:" + userId);
        if (user != null) {
            localCache.put("user:" + userId, user);
            return user;
        }
        
        // 3. 最后查数据库
        user = userMapper.selectById(userId);
        if (user != null) {
            redisTemplate.opsForValue().set("user:" + userId, user, 30, TimeUnit.MINUTES);
            localCache.put("user:" + userId, user);
        }
        
        return user;
    }
}

8. 数据库查询优化

8.1 MyBatis-Plus分页优化

@Configuration
public class MybatisPlusConfig {
    
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 分页插件
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        // 乐观锁插件
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
    }
}

8.2 索引优化建议

-- 用户表索引优化
CREATE INDEX idx_user_phone ON users(phone);
CREATE INDEX idx_user_email ON users(email);
CREATE INDEX idx_user_status ON users(status);

-- 旅行表索引优化
CREATE INDEX idx_travel_creator ON travels(creator_id);
CREATE INDEX idx_travel_status ON travels(status);
CREATE INDEX idx_travel_start_time ON travels(start_time);

-- 动物表索引优化
CREATE INDEX idx_animal_shelter ON animals(shelter_id);
CREATE INDEX idx_animal_status ON animals(status);

-- 订单表索引优化
CREATE INDEX idx_order_user ON orders(user_id);
CREATE INDEX idx_order_status ON orders(status);
CREATE INDEX idx_order_create_time ON orders(create_time);

9. API网关优化

9.1 限流配置

spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/api/users/**
          filters:
            - name: RequestRateLimiter
              args:
                redis-rate-limiter.replenishRate: 10
                redis-rate-limiter.burstCapacity: 20

10. 监控和日志优化

10.1 Actuator配置

management:
  endpoints:
    web:
      exposure:
        include: health,info,metrics,httptrace
  endpoint:
    health:
      show-details: always

10.2 日志配置优化

logging:
  level:
    com.jiebanke: INFO
    org.springframework: WARN
    org.mybatis: WARN
  pattern:
    console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
    file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
  file:
    name: logs/application.log

11. Docker部署优化

11.1 JVM参数优化Dockerfile

FROM openjdk:17-jdk-slim

LABEL maintainer="jiebanke-team"

WORKDIR /app

COPY target/*.jar app.jar

# JVM参数优化
ENV JAVA_OPTS="-Xms512m -Xmx2g -XX:+UseG1GC -XX:MaxGCPauseMillis=200"

EXPOSE 8080

ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]

12. 负载均衡优化

12.1 Ribbon配置

ribbon:
  # 连接超时时间
  ConnectTimeout: 3000
  # 读取超时时间
  ReadTimeout: 10000
  # 是否启用重试
  OkToRetryOnAllOperations: false
  # 切换实例重试次数
  MaxAutoRetriesNextServer: 1
  # 当前实例重试次数
  MaxAutoRetries: 0

13. 性能测试建议

13.1 压力测试工具

  • JMeter用于API接口压力测试
  • wrk用于HTTP基准测试
  • ab (Apache Bench)简单的HTTP性能测试工具

13.2 监控工具

  • Prometheus + Grafana系统指标监控
  • ELK Stack日志分析
  • SkyWalking分布式追踪

通过以上优化措施可以显著提升结伴客Java后端服务的性能和稳定性。