夜夜躁很很躁日日躁麻豆,精品人妻无码,制服丝袜国产精品,成人免费看www网址入口

網(wǎng)易首頁 > 網(wǎng)易號 > 正文 申請入駐

緊急提醒!SpringBoot 這 8 個默認(rèn)配置不改,上線必崩!

0
分享至

SpringBoot 的 “開箱即用” 讓 Java 開發(fā)效率翻倍,但默認(rèn)配置就是 “開發(fā)環(huán)境專屬”!很多開發(fā)者直接照搬上生產(chǎn),結(jié)果遭遇 OOM 崩潰、服務(wù)雪崩、用戶重復(fù)登錄等致命問題,連夜加班排查才發(fā)現(xiàn),竟是沒改幾個基礎(chǔ)配置惹的禍!

上篇分享 8 個必改配置后,無數(shù)開發(fā)者留言說 “踩中同款坑”。今天繼續(xù)分享 8 個高頻雷區(qū),每個坑都附 “真實場景 + 直接復(fù)制的生產(chǎn)配置”,新手也能輕松上手,建議收藏轉(zhuǎn)發(fā),避免上線踩雷!

一、JVM 參數(shù):默認(rèn)配置導(dǎo)致 OOM 崩潰!致命坑點

SpringBoot 默認(rèn)不指定 JVM 參數(shù),堆內(nèi)存僅占物理內(nèi)存 1/4(16GB 服務(wù)器僅給 4GB),高并發(fā)下直接 OOM;且不開啟 GC 日志和崩潰排查文件,崩了都不知道為啥!

真實場景

某電商商品服務(wù),每周三固定崩潰,排查發(fā)現(xiàn)是高峰期商品數(shù)據(jù)占滿堆內(nèi)存,默認(rèn)配置沒開崩潰日志,只能靠猜,最后調(diào)整 JVM 參數(shù)才解決。

生產(chǎn)配置(直接復(fù)制)方式 1:啟動腳本(推薦)

java -jar your-app.jar \

-Xms8g \ # 16GB服務(wù)器設(shè)8GB,物理內(nèi)存50%

-Xmx8g \ # 最大堆內(nèi)存=初始內(nèi)存,避免頻繁擴容

-Xmn4g \ # 新生代占50%,提升回收效率

-XX:MetaspaceSize=256m \

-XX:MaxMetaspaceSize=512m \

-XX:+HeapDumpOnOutOfMemoryError \ # OOM生成排查文件

-XX:HeapDumpPath=/var/log/oom.dump \

-XX:+PrintGCDetails \

-XX:LogFile=/var/log/gc.log

方式 2:application.yml(SpringBoot2.3+)

spring:

jvm:

args: >

-Xms8g -Xmx8g -Xmn4g

-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/oom.dump

-XX:+PrintGCDetails -XX:LogFile=/var/log/gc.log

關(guān)鍵提醒

  • 堆內(nèi)存按 “物理內(nèi)存 ×50%~70%” 配置,32GB 服務(wù)器可設(shè) 16GB;
  • 一定要開 OOM 排查文件,不然崩潰后無跡可尋!
二、Redis 緩存:默認(rèn)序列化 + 無連接池 = 性能災(zāi)難!致命坑點

默認(rèn)用 Java 原生序列化,數(shù)據(jù)又大又亂碼;無連接池,并發(fā)高了直接超時;緩存無過期時間,Redis 內(nèi)存遲早撐爆!

生產(chǎn)配置(直接復(fù)制)第一步:引入依賴

org.springframework.boot

spring-boot-starter-data-redis

2.7.15

org.apache.commons

commons-pool2


第二步:yml 配置

spring:

redis:

host: ${REDIS_HOST:127.0.0.1}

port: ${REDIS_PORT:6379}

password: ${REDIS_PASSWORD:} # 環(huán)境變量存密碼,別硬編碼

timeout: 3000

lettuce:

pool:

max-active: 200

max-idle: 50

min-idle: 10

cache:

type: redis

redis:

use-key-prefix: true

key-prefix: "${spring.application.name}:" # 加前綴防沖突

cache-Null-values: false # 不緩存null,防穿透

time-to-live: 3600000 # 1小時過期

第三步:序列化配置(關(guān)鍵)

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.data.redis.cache.RedisCacheManager;

import org.springframework.data.redis.connection.RedisConnectionFactory;

import org.springframework.data.redis.serializer.GenericJackson2JSONRedisSerializer;

import org.springframework.data.redis.serializer.StringRedisSerializer;

import com.fasterxml.jackson.databind.ObjectMapper;

import java.time.Duration;

@Configuration

public class RedisCacheConfig {

@Bean

public RedisCacheManager redisCacheManager(RedisConnectionFactory factory) {

ObjectMapper objectMapper = new ObjectMapper();

GenericJackson2JsonRedisSerializer valueSerializer = new GenericJackson2JsonRedisSerializer(objectMapper);

StringRedisSerializer keySerializer = new StringRedisSerializer();

var config = org.springframework.data.redis.cache.RedisCacheConfiguration.defaultCacheConfig()

.entryTtl(Duration.ofHours(1))

.serializeKeysWith(org.springframework.data.redis.serializer.RedisSerializationContext

.SerializationPair.fromSerializer(keySerializer))

.serializeValuesWith(org.springframework.data.redis.serializer.RedisSerializationContext

.SerializationPair.fromSerializer(valueSerializer))

.disableCachingNullValues();

return RedisCacheManager.builder(factory).cacheDefaults(config).build();

關(guān)鍵提醒

  • 千萬別用默認(rèn)序列化,JSON 格式又小又好懂;
  • 緩存必須設(shè)過期時間,避免 Redis 內(nèi)存溢出!
三、跨域配置:前端報錯 “跨域攔截”,生產(chǎn)必配!致命坑點

開發(fā)環(huán)境靠前端代理掩蓋跨域問題,生產(chǎn)環(huán)境沒配置,前端所有接口報錯 “跨域攔截”,用戶直接用不了!

生產(chǎn)配置(直接復(fù)制)

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.web.cors.CorsConfiguration;

import org.springframework.web.cors.UrlBasedCorsConfigurationSource;

import org.springframework.web.filter.CorsFilter;

@Configuration

public class CorsConfig {

@Bean

public CorsFilter corsFilter() {

CorsConfiguration config = new CorsConfiguration();

// 生產(chǎn)環(huán)境指定具體域名,別用*(不安全)

config.addAllowedOrigin("https://admin.xxx.com");

config.addAllowedOrigin("https://www.xxx.com");

config.addAllowedMethod("*");

config.addAllowedHeader("*");

config.setAllowCredentials(true);

config.setMaxAge(1800L); // 預(yù)檢緩存30分鐘

UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();

source.registerCorsConfiguration("/**", config);

return new CorsFilter(source);

關(guān)鍵提醒

  • 禁用config.addAllowedOrigin("*"),存在安全風(fēng)險;
  • 多環(huán)境可把域名寫進配置文件,避免硬編碼!
四、Session 共享:分布式部署,用戶頻繁登錄!致命坑點

默認(rèn) Session 存服務(wù)器內(nèi)存,多實例部署時,用戶切換實例就需重新登錄,體驗極差,投訴不斷!

生產(chǎn)配置(直接復(fù)制)第一步:引入依賴

org.springframework.boot

spring-boot-starter-data-redis

org.springframework.session

spring-session-data-redis


第二步:yml 配置

spring:

session:

store-type: redis # Session存Redis,多實例共享

redis:

namespace: spring:session:${spring.application.name}

cleanup-cron: 0 0 * * * * # 每小時清理過期Session

timeout: 1800 # 30分鐘過期

redis:

host: ${REDIS_HOST:127.0.0.1}

port: ${REDIS_PORT:6379}

password: ${REDIS_PASSWORD:}

關(guān)鍵提醒

  • 分布式部署必配!不然用戶會頻繁登錄,直接流失;
  • Redis 設(shè)密碼,防止 Session 數(shù)據(jù)泄露!
五、定時任務(wù):單線程導(dǎo)致任務(wù)阻塞,數(shù)據(jù)同步延遲!致命坑點

默認(rèn)定時任務(wù)用單線程,一個任務(wù)執(zhí)行 10 分鐘,后面的任務(wù)全阻塞,比如 5 分鐘同步一次的訂單,變成 1 小時才同步!

生產(chǎn)配置(直接復(fù)制)

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.scheduling.annotation.EnableScheduling;

import org.springframework.scheduling.annotation.SchedulingConfigurer;

import org.springframework.scheduling.config.ScheduledTaskRegistrar;

import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

import java.util.concurrent.ThreadPoolExecutor;

@Configuration

@EnableScheduling

public class SchedulerConfig implements SchedulingConfigurer {

@Bean

public ThreadPoolTaskScheduler taskScheduler() {

ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();

scheduler.setPoolSize(15); // 線程池大小,按任務(wù)數(shù)調(diào)整

scheduler.setThreadNamePrefix("scheduled-task-");

scheduler.setQueueCapacity(100);

scheduler.setWaitForTasksToCompleteOnShutdown(true);

scheduler.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());

// 捕獲異常,避免線程死亡

scheduler.setErrorHandler(t -> System.err.println("定時任務(wù)失敗:" + t.getMessage()));

scheduler.initialize();

return scheduler;

@Override

public void configureTasks(ScheduledTaskRegistrar registrar) {

registrar.setScheduler(taskScheduler());

關(guān)鍵提醒

  • 線程池大小按任務(wù)數(shù) 1.5 倍設(shè)置,不用太大;
  • 必須加異常處理,不然一個任務(wù)報錯,整個線程池崩了!
六、全局異常處理:返回錯誤棧,泄露敏感信息!致命坑點

默認(rèn) 404 返回空白頁,500 返回錯誤棧,不僅前端不好處理,還泄露接口路徑、數(shù)據(jù)庫表名,有安全風(fēng)險!

生產(chǎn)配置(直接復(fù)制)第一步:統(tǒng)一返回格式

import lombok.Data;

import java.io.Serializable;

@Data

public class Result implements Serializable {

private int code; // 200成功,其他失敗

private String msg;

private T data;

public static Result success() {

return new Result<>(200, "操作成功", null);

public static Result success(T data) {

return new Result<>(200, "操作成功", data);

public static Result fail(int code, String msg) {

return new Result<>(code, msg, null);

第二步:全局異常處理器

import lombok.extern.slf4j.Slf4j;

import org.springframework.web.bind.MethodArgumentNotValidexception;

import org.springframework.web.bind.annotation.ExceptionHandler;

import org.springframework.web.bind.annotation.RestControllerAdvice;

import org.springframework.web.servlet.NoHandlerFoundException;

@Slf4j

@RestControllerAdvice

public class GlobalExceptionHandler {

// 404異常

@ExceptionHandler(NoHandlerFoundException.class)

public Result handle404(NoHandlerFoundException e) {

log.error("接口不存在:", e);

return Result.fail(404, "請求的接口不存在");

// 參數(shù)校驗異常

@ExceptionHandler(MethodArgumentNotValidException.class)

public Result handleParamError(MethodArgumentNotValidException e) {

StringBuilder errorMsg = new StringBuilder("參數(shù)錯誤:");

e.getBindingResult().getFieldErrors().forEach(fieldError -> {

errorMsg.append(fieldError.getField()).append(":").append(fieldError.getDefaultMessage()).append(",");

String msg = errorMsg.substring(0, errorMsg.length() - 1);

log.error(msg);

return Result.fail(400, msg);

// 兜底異常

@ExceptionHandler(Exception.class)

public Result handleOtherError(Exception e) {

log.error("系統(tǒng)異常:", e);

return Result.fail(500, "系統(tǒng)繁忙,請稍后再試");

第三步:開啟 404 捕獲

spring:

mvc:

throw-exception-if-no-handler-found: true

web:

resources:

add-mappings: false

關(guān)鍵提醒

  • 錯誤提示要友好,別暴露技術(shù)術(shù)語;
  • 詳細錯誤棧記日志,方便排查!
七、數(shù)據(jù)庫連接超時 + 熔斷:避免服務(wù)雪崩!致命坑點

默認(rèn)連接超時 30 秒,數(shù)據(jù)庫故障時,大量請求阻塞,線程池被占滿,引發(fā)全鏈路雪崩,數(shù)據(jù)庫恢復(fù)了服務(wù)也得重啟!

生產(chǎn)配置(直接復(fù)制)第一步:連接超時優(yōu)化

spring:

datasource:

hikari:

connection-timeout: 5000 # 5秒超時,快速失敗

maximum-pool-size: 50

minimum-idle: 10

第二步:引入依賴

org.springframework.retry

spring-retry

org.aspectj

aspectjweaver

io.github.resilience4j

resilience4j-spring-boot2

1.9.5


第三步:yml 配置

spring:

retry:

max-attempts: 3 # 最多重試3次

backoff:

delay: 1000

resilience4j:

circuitbreaker:

instances:

databaseService:

failure-rate-threshold: 50 # 失敗率50%觸發(fā)熔斷

wait-duration-in-open-state: 60000 # 熔斷60秒后嘗試恢復(fù)

第四步:業(yè)務(wù)層注解

import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;

import io.github.resilience4j.retry.annotation.Retry;

import org.springframework.stereotype.Service;

import java.util.Collections;

import java.util.List;

@Service

public class OrderService {

private final OrderRepository orderRepository;

// 構(gòu)造方法注入(省略)

@Retry(name = "databaseService")

@CircuitBreaker(name = "databaseService", fallbackMethod = "queryOrderFallback")

public List queryOrder(Long userId) {

return orderRepository.findByUserId(userId);

// 降級方法

public List queryOrderFallback(Long userId, Exception e) {

log.error("查詢失敗,觸發(fā)降級:", e);

return Collections.emptyList();

關(guān)鍵提醒

  • 連接超時別設(shè)太長,5 秒足夠;
  • 熔斷是 “保險絲”,數(shù)據(jù)庫故障時保護服務(wù)不雪崩!
八、靜態(tài)資源緩存:頁面加載慢,帶寬浪費!致命坑點

默認(rèn)不緩存 JS、CSS、圖片,用戶每次訪問都重新下載,頁面加載慢,還浪費服務(wù)器帶寬!

生產(chǎn)配置(直接復(fù)制)第一步:SpringBoot 配置

spring:

web:

resources:

static-locations: classpath:/static/,classpath:/public/

cache:

cachecontrol:

max-age: 604800 # 緩存7天

cache-public: true

第二步:Nginx 配置(推薦)

server {

listen 80;

server_name static.xxx.com; # 靜態(tài)資源獨立域名

root /usr/share/nginx/html/static;

location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {

expires 7d;

add_header Cache-Control "public, max-age=604800";

access_log off;

gzip on; # 啟用壓縮

關(guān)鍵提醒

  • 靜態(tài)資源加版本號(如 app.1.0.0.js),更新時改版本號;
  • 用獨立域名存靜態(tài)資源,加載更快!
最后緊急提醒

SpringBoot 默認(rèn)配置只適合開發(fā) / 測試!以上 8 個配置覆蓋性能、安全、穩(wěn)定性,直接復(fù)制到生產(chǎn)項目,部署前逐一檢查,避免連夜加班!

你在項目中曾因默認(rèn)配置踩過哪些坑?歡迎在評論區(qū)分享經(jīng)歷!覺得有用的話,點贊 + 收藏 + 關(guān)注,下次配置直接對照用,少走彎路!

#JAVA培訓(xùn)##JAVA開發(fā)#

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關(guān)推薦
熱點推薦
止步于連續(xù)9場!約基奇的NBA紀(jì)錄就此中斷

止步于連續(xù)9場!約基奇的NBA紀(jì)錄就此中斷

籃球大視野
2025-11-16 16:41:05
家里托關(guān)系找的工作有多抽象?網(wǎng)友:真離譜,這是什么家人

家里托關(guān)系找的工作有多抽象?網(wǎng)友:真離譜,這是什么家人

解讀熱點事件
2025-11-14 00:10:03
山西狗咬人事件,鄰居家的監(jiān)控幫申某家大忙了!對方輪番上去打砸

山西狗咬人事件,鄰居家的監(jiān)控幫申某家大忙了!對方輪番上去打砸

火山詩話
2025-11-16 08:12:14
不撞南墻不回頭,退出春晚、解散公司,43歲賈玲走上了另一條道路

不撞南墻不回頭,退出春晚、解散公司,43歲賈玲走上了另一條道路

豆哥記錄
2025-11-16 17:47:09
陳英已任重慶市委組織部副部長(主持日常工作)

陳英已任重慶市委組織部副部長(主持日常工作)

澎湃新聞
2025-11-16 19:18:28
奪冠不到24小時,林高遠就被人民日報點名,鄧亞萍的話有人信了

奪冠不到24小時,林高遠就被人民日報點名,鄧亞萍的話有人信了

林子說事
2025-11-16 02:15:00
一夜負債200億?電動車巨頭轟然倒塌:終于活成了賈躍亭信徒

一夜負債200億?電動車巨頭轟然倒塌:終于活成了賈躍亭信徒

詩意世界
2025-11-15 20:37:35
誰在逼西安人交“溫暖稅”?5.8元一平的暖氣費背后是場精妙的算計

誰在逼西安人交“溫暖稅”?5.8元一平的暖氣費背后是場精妙的算計

貞觀108坊
2025-11-16 17:41:52
鄰里監(jiān)控曝光,郭家妹妹謊言被錘的稀碎,鄰居家身份個個有來頭

鄰里監(jiān)控曝光,郭家妹妹謊言被錘的稀碎,鄰居家身份個個有來頭

鋭娛之樂
2025-11-16 14:25:29
6000平方公里沙漠變綠,10多萬股民血本無歸,是誰導(dǎo)演這場戲

6000平方公里沙漠變綠,10多萬股民血本無歸,是誰導(dǎo)演這場戲

一號位故事
2025-11-12 09:46:54
春秋航空發(fā)布非自愿退改規(guī)定通知

春秋航空發(fā)布非自愿退改規(guī)定通知

半島晨報
2025-11-16 10:38:45
岳云鵬演唱會孫浩翻紅,網(wǎng)友:現(xiàn)在全網(wǎng)最高興的人就是張嘉譯了

岳云鵬演唱會孫浩翻紅,網(wǎng)友:現(xiàn)在全網(wǎng)最高興的人就是張嘉譯了

丫頭舫
2025-11-15 22:40:03
7輪10分!世界杯擴軍后,他們反而出局了!無緣連續(xù)參加3屆世界杯

7輪10分!世界杯擴軍后,他們反而出局了!無緣連續(xù)參加3屆世界杯

小火箭愛體育
2025-11-16 11:23:57
樊振東衛(wèi)冕全運會男單冠軍!鄧亞萍銳評:他渾身都是球,你說你打哪兒?

樊振東衛(wèi)冕全運會男單冠軍!鄧亞萍銳評:他渾身都是球,你說你打哪兒?

上觀新聞
2025-11-16 15:08:09
降息,突變!美聯(lián)儲,大消息!

降息,突變!美聯(lián)儲,大消息!

證券時報
2025-11-16 15:37:10
男子花3000買顯卡,全程錄視頻,卻只收到兩本書,店家回應(yīng)亮了

男子花3000買顯卡,全程錄視頻,卻只收到兩本書,店家回應(yīng)亮了

攬星河的筆記
2025-11-14 17:06:16
毛主席開會煙沒了,見李先念抽雪茄,問:這么好的煙,咋不告訴我

毛主席開會煙沒了,見李先念抽雪茄,問:這么好的煙,咋不告訴我

歷史龍元閣
2025-11-16 15:15:04
當(dāng)菲律賓網(wǎng)友質(zhì)疑中國“只亮劍不拔劍”,加拿大網(wǎng)友:中國不拔劍,非不敢而是不值

當(dāng)菲律賓網(wǎng)友質(zhì)疑中國“只亮劍不拔劍”,加拿大網(wǎng)友:中國不拔劍,非不敢而是不值

雨先森觀察
2025-10-20 04:11:07
燕梳樓:如果日本驅(qū)逐薛劍,就是向中國宣戰(zhàn)!

燕梳樓:如果日本驅(qū)逐薛劍,就是向中國宣戰(zhàn)!

燕梳樓頻道
2025-11-13 12:44:36
韓國突然斷供!70%天價漲幅撕開半導(dǎo)體命門,中國6家企業(yè)已殺瘋

韓國突然斷供!70%天價漲幅撕開半導(dǎo)體命門,中國6家企業(yè)已殺瘋

李博世財經(jīng)
2025-11-16 14:08:51
2025-11-16 23:20:49
我不叫阿哏
我不叫阿哏
分享有趣、有用的故事!
206文章數(shù) 6029關(guān)注度
往期回顧 全部

科技要聞

雷軍,怒了!剛剛連發(fā)多條微博

頭條要聞

日高層:高市早苗今后應(yīng)該不會再有此類發(fā)言

頭條要聞

日高層:高市早苗今后應(yīng)該不會再有此類發(fā)言

體育要聞

最佳新秀候選!2028美國男籃有他一個位置

娛樂要聞

CEO爆料肖戰(zhàn)《藏海傳》狂賺幾十億!

財經(jīng)要聞

房源暗中調(diào)價 央企舉報廣州國資房企

汽車要聞

"冰彩沙"全配齊 紅旗HS6 PHEV預(yù)售17.88萬起

態(tài)度原創(chuàng)

健康
數(shù)碼
親子
旅游
公開課

血液科專家揭秘白血病七大誤區(qū)

數(shù)碼要聞

華為鴻蒙HarmonyOS 6.0.0.112版本首曝,支持電腦投平板

親子要聞

一分鐘教你判斷孩子的咳嗽代表什么

旅游要聞

第十五屆安徽國際文化旅游節(jié)在黃山市隆重開幕

公開課

李玫瑾:為什么性格比能力更重要?

無障礙瀏覽 進入關(guān)懷版 无码熟妇人妻av在线网站| 久久婷婷五月综合色99啪ak| 欧美日韩人成视频在线播放| 乱码丰满人妻一二三区| 亚洲欧美精品一中文字幕| 少妇张开雪白双腿黑人视频| 中文字幕无码日韩欧毛| 国产美女免费| 经典国产乱子伦精品视频| 危险期AV剧情,麻豆| 精品久久久久久无码不卡| 99精品国产中文字幕| 无码少妇一区二区性色av| 免费无码性爱视频| 亚洲网综合| 激情视频无码| 亚洲Av秘 无码一区二区| 中文无码毛片又爽又刺激| 亚洲ed2k| 午夜精品在线| 亚洲国产精品久久久久秋霞影院| 中文字幕亚洲无线码A| 一区二区三区69少妇视频| 高潮呻吟AV| 日韩中文字幕亚洲精品| 国产老太grαnnychinese| www99re| 亚洲AV成人片不卡无码| 亚洲 都市 无码 校园 激情 | 精品国产粉嫩内射白浆内射双马尾 | 在线观看热码亚洲AV每日更新| 日本乱伦熟妇| 强奸中国多毛少妇| 成av人片在线观看www| 成人午夜福利视频一区二区| XXX 无码视频| 香港日本三级亚洲三级| 香蕉视频你懂的| 思思re热免费精品视频66| 国产亚洲精品XXXAV| 亚洲AV成人一二三区观看|