成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

利用 Nacos 實現了一個動態化線程池,非常實用!

開發 前端
簡單實現了一個可以調整核心線程數和最大線程數的動態線程池。具體的線程池實現原理可以參考美團的這篇文章:https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html,結合監控告警等實現一個完善的動態線程池產品。

在后臺開發中,會經常用到線程池技術,對于線程池核心參數的配置很大程度上依靠經驗。然而,由于系統運行過程中存在的不確定性,我們很難一勞永逸地規劃一個合理的線程池參數。在對線程池配置參數進行調整時,一般需要對服務進行重啟,這樣修改的成本就會偏高。一種解決辦法就是,將線程池的配置放到平臺側,運行開發同學根據系統運行情況對核心參數進行動態配置。

本文以Nacos作為服務配置中心,以修改線程池核心線程數、最大線程數為例,實現一個簡單的動態化線程池。

代碼實現

1.依賴

<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2021.1</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2021.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>

2.配置yml文件

bootstrap.yml:

server:
port: 8010
# 應用名稱(nacos會將該名稱當做服務名稱)
spring:
application:
name: order-service
cloud:
nacos:
discovery:
namespace: public
server-addr: 192.168.174.129:8848
config:
server-addr: 192.168.174.129:8848
file-extension: yml

application.yml:

spring:
profiles:
active: dev

為什么要配置兩個yml文件?

springboot中配置文件的加載是存在優先級順序的,bootstrap優先級高于application。

nacos在項目初始化時,要保證先從配置中心進行配置拉取,拉取配置之后才能保證項目的正常啟動。

3.nacos配置

登錄到nacos管理頁面,新建配置,如下圖所示:

圖片

注意Data ID的命名格式為,${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension} ?,在本文中,Data ID的名字就是order-service-dev.yml。

圖片

這里我們只配置了兩個參數,核心線程數量和最大線程數。

4.線程池配置和nacos配置變更監聽

@RefreshScope
@Configuration
public class DynamicThreadPool implements InitializingBean {
@Value("${core.size}")
private String coreSize;

@Value("${max.size}")
private String maxSize;

private static ThreadPoolExecutor threadPoolExecutor;

@Autowired
private NacosConfigManager nacosConfigManager;

@Autowired
private NacosConfigProperties nacosConfigProperties;

@Override
public void afterPropertiesSet() throws Exception {
//按照nacos配置初始化線程池
threadPoolExecutor = new ThreadPoolExecutor(Integer.parseInt(coreSize), Integer.parseInt(maxSize), 10L, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(10),
new ThreadFactoryBuilder().setNameFormat("c_t_%d").build(),
new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
System.out.println("rejected!");
}
});

//nacos配置變更監聽
nacosConfigManager.getConfigService().addListener("order-service-dev.yml", nacosConfigProperties.getGroup(),
new Listener() {
@Override
public Executor getExecutor() {
return null;
}

@Override
public void receiveConfigInfo(String configInfo) {
//配置變更,修改線程池配置
System.out.println(configInfo);
changeThreadPoolConfig(Integer.parseInt(coreSize), Integer.parseInt(maxSize));
}
});
}

/**
* 打印當前線程池的狀態
*/
public String printThreadPoolStatus() {
return String.format("core_size:%s,thread_current_size:%s;" +
"thread_max_size:%s;queue_current_size:%s,total_task_count:%s", threadPoolExecutor.getCorePoolSize(),
threadPoolExecutor.getActiveCount(), threadPoolExecutor.getMaximumPoolSize(), threadPoolExecutor.getQueue().size(),
threadPoolExecutor.getTaskCount());
}

/**
* 給線程池增加任務
*
* @param count
*/
public void dynamicThreadPoolAddTask(int count) {
for (int i = 0; i < count; i++) {
int finalI = i;
threadPoolExecutor.execute(new Runnable() {
@Override
public void run() {
try {
System.out.println(finalI);
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
}

/**
* 修改線程池核心參數
*
* @param coreSize
* @param maxSize
*/
private void changeThreadPoolConfig(int coreSize, int maxSize) {
threadPoolExecutor.setCorePoolSize(coreSize);
threadPoolExecutor.setMaximumPoolSize(maxSize);
}
}

這個代碼就是實現動態線程池和核心了,需要說明的是:

  • @RefreshScope:這個注解用來支持nacos的動態刷新功能;
  • @Value("${max.size}")?,@Value("${core.size}"):這兩個注解用來讀取我們上一步在nacos配置的具體信息;同時,nacos配置變更時,能夠實時讀取到變更后的內容
  • nacosConfigManager.getConfigService().addListener:配置監聽,nacos配置變更時實時修改線程池的配置。

5.controller

為了觀察線程池動態變更的效果,增加Controller類。

@RestController
@RequestMapping("/threadpool")
public class ThreadPoolController {

@Autowired
private DynamicThreadPool dynamicThreadPool;

/**
* 打印當前線程池的狀態
*/
@GetMapping("/print")
public String printThreadPoolStatus() {
return dynamicThreadPool.printThreadPoolStatus();
}

/**
* 給線程池增加任務
*
* @param count
*/
@GetMapping("/add")
public String dynamicThreadPoolAddTask(int count) {
dynamicThreadPool.dynamicThreadPoolAddTask(count);
return String.valueOf(count);
}
}

6.測試

啟動項目,訪問http://localhost:8010/threadpool/print打印當前線程池的配置。

圖片

可以看到,這個就是我們之前在nacos配置的線程數。

訪問http://localhost:8010/threadpool/add?count=20增加20個任務,重新打印線程池配置

圖片

可以看到已經有線程在排隊了。

為了能夠看到效果,我們多訪問幾次/add接口,增加任務數,在控制臺出現拒絕信息時調整nacos配置。

圖片

此時,執行/add命令時,所有的線程都會提示rejected。

調整nacos配置,將核心線程數調整為50,最大線程數調整為100.

圖片

重新多次訪問/add接口增加任務,發現沒有拒絕信息了。這時,打印具體的線程狀態,發現線程池參數修改成功。

圖片

總結

這里,只是簡單實現了一個可以調整核心線程數和最大線程數的動態線程池。具體的線程池實現原理可以參考美團的這篇文章:https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html,結合監控告警等實現一個完善的動態線程池產品。

優秀的輪子還有好多,比如Hippo4J ,使用起來和dynamic-tp差不多。Hippo4J 有無依賴中間件實現動靜線程池,也有默認實現Nacos和Apollo的版本,而dynamic-tp 默認實現依賴Nacos或Apollo。

責任編輯:武曉燕 來源: 碼猿技術專欄
相關推薦

2024-02-04 09:19:00

Nacos動態化線程池

2024-11-08 14:11:09

2023-03-08 07:43:07

DUCC配置平臺

2024-07-02 11:29:28

Typer庫Python命令

2022-03-09 09:43:01

工具類線程項目

2014-05-23 10:37:37

聊天程序PHP聊天程序

2025-01-09 11:24:59

線程池美團動態配置中心

2020-10-27 13:24:35

線程池系統模型

2022-02-14 16:08:15

開源項目線程池動態可監控

2024-11-13 13:14:38

2023-01-26 11:43:03

線程池CPUJava

2022-08-29 09:06:43

hippo4j動態線程池

2022-03-22 09:20:57

應用線程池技術

2019-02-12 11:22:29

Linux 系統 命令

2021-05-27 09:50:03

連接池FTP服務器

2021-10-27 06:49:34

線程池Core函數

2024-08-28 10:33:56

2023-06-04 17:13:26

.NET開發應用程序

2022-12-06 17:18:42

2021-07-31 22:20:00

線程池系統參數
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产午夜视频 | 最新国产精品视频 | 国产剧情一区 | www.亚洲视频 | 福利久久 | 亚洲成人一级 | 黑人精品xxx一区一二区 | 久久久人成影片一区二区三区 | 成人精品福利 | 日本亚洲欧美 | 色毛片| 一区二区三区四区在线视频 | caoporn国产精品免费公开 | aacc678成免费人电影网站 | 一区二区视屏 | 久久久精品日本 | 日韩三级在线 | 91偷拍精品一区二区三区 | 久久综合久久久 | 狠狠躁天天躁夜夜躁婷婷老牛影视 | 国产乱码精品一品二品 | 一区二区三区欧美 | 久久久久国产精品一区二区 | 色婷综合网 | 日韩中文字幕av | 欧美久久久电影 | 日韩在线国产精品 | 亚洲欧美激情精品一区二区 | 色站综合| 日本久久精品视频 | 91看国产 | 成人在线视频网 | 国产精品永久免费 | 天天综合网91 | 99视频入口 | 成年免费大片黄在线观看一级 | 国产精品成人一区 | 黄色网址在线免费观看 | 精品欧美一区二区三区久久久 | 成人自拍视频网站 | 午夜一级做a爰片久久毛片 精品综合 |