你還在為 SpringBoot 服務吞吐量而煩擾嗎?如何提升?

點擊上方 "程序員小樂"關注, 星標或置頂一起成長

每天凌晨00點00分, 第一時間與你相約


每日英文

The more you know who you are, and what you want, the less you let things upset you.

你越瞭解自己,越懂得自己想要什麼,能令你沮喪的事情就越少。


每日掏心話

不要總是羨慕別人的美好,要用心經營自己的幸福。放棄了,就不該後悔。失去了,就不該回憶。


來自:lipengHeke | 責編:樂樂

鏈接:my.oschina.net/u/560547/blog/3162343

你還在為 SpringBoot 服務吞吐量而煩擾嗎?如何提升?

程序員小樂(ID:study_tech)第 793 次推文 圖片來自百度


往日回顧:美團面試題:Hashmap的結構,1.7和1.8有哪些區別,史上最深入的分析


正文


背景

生產環境偶爾會有一些慢請求導致系統性能下降,吞吐量下降,下面介紹幾種優化建議。

方案

1、undertow替換tomcat

電子商務類型網站大多都是短請求,一般響應時間都在100ms,這時可以將web容器從tomcat替換為undertow,下面介紹下步驟:

1、增加pom配置

<dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-web/<artifactid>
<exclusions>
<exclusion>
<groupid>org.springframework.boot/<groupid>


<artifactid>spring-boot-starter-tomcat/<artifactid>
/<exclusion>
/<exclusions>
/<dependency>
<dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-undertow/<artifactid>
/<dependency>
2、增加相關配置server:
undertow:
direct-buffers: true
io-threads: 4
worker-threads: 160

重新啟動可以在控制檯看到容器已經切換為undertow了

2、緩存

將部分熱點數據或者靜態數據放到本地緩存或者redis中,如果有需要可以定時更新緩存數據

3、異步

在代碼過程中我們很多代碼都不需要等返回結果,也就是部分代碼是可以並行執行,這個時候可以使用異步,最簡單的方案是使用springboot提供的@Async註解,當然也可以通過線程池來實現,下面簡單介紹下異步步驟。

1、pom依賴

一般springboot引入web相關依賴就行

<dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-web/<artifactid>
/<dependency>


2、在啟動類中增加@EnableAsync註解@EnableAsync
@SpringBootApplication
public class AppApplication
{
public static void main(String[] args)
{
SpringApplication.run(AppApplication.class, args);
}
}
3、需要時在指定方法中增加@Async註解,如果是需要等待返回值,則demo如下 @Async
public Future<string> doReturn(int i){
try {
// 這個方法需要調用500毫秒
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 消息彙總
return new AsyncResult<>("異步調用");
}
4、如果有線程變量或者logback中的mdc,可以增加傳遞import org.slf4j.MDC;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.TaskDecorator;
import org.springframework.scheduling.annotation.AsyncConfigurerSupport;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.Map;
import java.util.concurrent.Executor;

/**
* @Description:
*/
@EnableAsync
@Configuration
public class AsyncConfig extends AsyncConfigurerSupport {
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setTaskDecorator(new MdcTaskDecorator());
executor.initialize();
return executor;
}

}

class MdcTaskDecorator implements TaskDecorator {

@Override
public Runnable decorate(Runnable runnable) {
Map<string> contextMap = MDC.getCopyOfContextMap();
return () -> {
try {
MDC.setContextMap(contextMap);
runnable.run();
} finally {
MDC.clear();
}
};
}
}
5、有時候異步需要增加阻塞import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;

@Configuration
@Slf4j
public class TaskExecutorConfig {

@Bean("localDbThreadPoolTaskExecutor")
public Executor threadPoolTaskExecutor() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(5);
taskExecutor.setMaxPoolSize(200);
taskExecutor.setQueueCapacity(200);
taskExecutor.setKeepAliveSeconds(100);
taskExecutor.setThreadNamePrefix("LocalDbTaskThreadPool");
taskExecutor.setRejectedExecutionHandler((Runnable r, ThreadPoolExecutor executor) -> {
if (!executor.isShutdown()) {
try {
Thread.sleep(300);
executor.getQueue().put(r);
} catch (InterruptedException e) {
log.error(e.toString(), e);
Thread.currentThread().interrupt();
}
}
}
);

taskExecutor.initialize();
return taskExecutor;
}


}
/<string>/<string>

4、業務拆分

可以將比較耗時或者不同的業務拆分出來提供單節點的吞吐量

5、集成消息隊列

有很多場景對數據實時性要求不那麼強的,或者對業務進行業務容錯處理時可以將消息發送到kafka,然後延時消費。

舉個例子,根據條件查詢指定用戶發送推送消息,這裡可以時按時、按天、按月等等,這時就

你還在為 SpringBoot 服務吞吐量而煩擾嗎?如何提升?


你還在為 SpringBoot 服務吞吐量而煩擾嗎?如何提升?

歡迎在留言區留下你的觀點,一起討論提高。如果今天的文章讓你有新的啟發,學習能力的提升上有新的認識,歡迎轉發分享給更多人。


猜你還想看


阿里、騰訊、百度、華為、京東最新面試題彙集

Undertow技術:為什麼很多Spring Boot開發者放棄了Tomcat?

一文了解 Kafka 分佈式!

IntelliJ IDEA 最常用配置詳細圖解,適合剛剛用的新人!

關注訂閱號「程序員小樂」,收看更多精彩內容
嘿,你在看嗎?



分享到:


相關文章: