326 lines
7.5 KiB
Markdown
326 lines
7.5 KiB
Markdown
|
|
# 结伴客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后端服务的性能和稳定性。
|