docs(deployment): 更新部署文档并添加自动化部署脚本
- 更新了 DEPLOYMENT.md 文档,增加了更多部署细节和说明 - 添加了 Linux 和 Windows 平台的自动化部署脚本 - 更新了 README.md,增加了部署相关说明 - 调整了 .env 文件配置,以适应新的部署流程 - 移除了部分不必要的代码和配置
This commit is contained in:
326
backend-java/PERFORMANCE_OPTIMIZATION.md
Normal file
326
backend-java/PERFORMANCE_OPTIMIZATION.md
Normal file
@@ -0,0 +1,326 @@
|
||||
# 结伴客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后端服务的性能和稳定性。
|
||||
Reference in New Issue
Block a user