Files
jiebanke/backend-java/PERFORMANCE_OPTIMIZATION.md

326 lines
7.5 KiB
Markdown
Raw Normal View 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中
```yaml
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连接池配置
```yaml
spring:
redis:
lettuce:
pool:
# 最大连接数
max-active: 20
# 最大空闲连接数
max-idle: 10
# 最小空闲连接数
min-idle: 5
# 获取连接最大等待时间
max-wait: 2000ms
```
### 3.2 Redis序列化优化
```java
@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 连接池配置
```yaml
spring:
rabbitmq:
listener:
simple:
# 并发消费者数量
concurrency: 5
# 最大并发消费者数量
max-concurrency: 20
# 每个消费者预取的消息数量
prefetch: 10
```
## 5. Feign客户端优化
### 5.1 Feign配置
```java
@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 自定义线程池
```java
@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 多级缓存设计
```java
@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分页优化
```java
@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 索引优化建议
```sql
-- 用户表索引优化
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 限流配置
```yaml
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配置
```yaml
management:
endpoints:
web:
exposure:
include: health,info,metrics,httptrace
endpoint:
health:
show-details: always
```
### 10.2 日志配置优化
```yaml
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
```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配置
```yaml
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后端服务的性能和稳定性。