日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2024-02-04 08:59:05 238觀看
導讀在后臺開發中,會經常用到線程池技術,對于線程池核心參數的配置很大程度上依靠經驗。然而,由于系統運行過程中存在的不確定性,我們很難一勞永逸地規劃一個合理的線程池參數。在對線程池配置參數進行調整時,一般需要對服務進

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

本文以Nacos作為服務配置中心,以修改線程池核心線程數、最大線程數為例,實現一個簡單的動態化線程池。iP028資訊網——每日最新資訊28at.com

代碼實現

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:iP028資訊網——每日最新資訊28at.com

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:iP028資訊網——每日最新資訊28at.com

spring:  profiles:    active: dev

為什么要配置兩個yml文件?iP028資訊網——每日最新資訊28at.com

springboot中配置文件的加載是存在優先級順序的,bootstrap優先級高于application。iP028資訊網——每日最新資訊28at.com

nacos在項目初始化時,要保證先從配置中心進行配置拉取,拉取配置之后才能保證項目的正常啟動。iP028資訊網——每日最新資訊28at.com

3.nacos配置

登錄到nacos管理頁面,新建配置,如下圖所示:iP028資訊網——每日最新資訊28at.com

圖片圖片iP028資訊網——每日最新資訊28at.com

注意Data ID的命名格式為,${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension} ,在本文中,Data ID的名字就是order-service-dev.yml。iP028資訊網——每日最新資訊28at.com

圖片圖片iP028資訊網——每日最新資訊28at.com

這里我們只配置了兩個參數,核心線程數量和最大線程數。iP028資訊網——每日最新資訊28at.com

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

@RefreshScope@Configurationpublic 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);    }}

這個代碼就是實現動態線程池和核心了,需要說明的是:iP028資訊網——每日最新資訊28at.com

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

5.controller

為了觀察線程池動態變更的效果,增加Controller類。iP028資訊網——每日最新資訊28at.com

@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打印當前線程池的配置。iP028資訊網——每日最新資訊28at.com

圖片圖片iP028資訊網——每日最新資訊28at.com

可以看到,這個就是我們之前在nacos配置的線程數。iP028資訊網——每日最新資訊28at.com

訪問http://localhost:8010/threadpool/add?count=20增加20個任務,重新打印線程池配置iP028資訊網——每日最新資訊28at.com

圖片圖片iP028資訊網——每日最新資訊28at.com

可以看到已經有線程在排隊了。iP028資訊網——每日最新資訊28at.com

為了能夠看到效果,我們多訪問幾次/add接口,增加任務數,在控制臺出現拒絕信息時調整nacos配置。iP028資訊網——每日最新資訊28at.com

圖片圖片iP028資訊網——每日最新資訊28at.com

此時,執行/add命令時,所有的線程都會提示rejected。iP028資訊網——每日最新資訊28at.com

調整nacos配置,將核心線程數調整為50,最大線程數調整為100.iP028資訊網——每日最新資訊28at.com

圖片圖片iP028資訊網——每日最新資訊28at.com

重新多次訪問/add接口增加任務,發現沒有拒絕信息了。這時,打印具體的線程狀態,發現線程池參數修改成功。iP028資訊網——每日最新資訊28at.com

圖片iP028資訊網——每日最新資訊28at.com

總結

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

優秀的輪子還有好多,比如Hippo4J ,使用起來和dynamic-tp差不多。Hippo4J 有無依賴中間件實現動靜線程池,也有默認實現Nacos和Apollo的版本,而dynamic-tp 默認實現依賴Nacos或Apollo。iP028資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-72425-0.htmlSpring Boot + Nacos 實現了一個動態化線程池,非常實用!

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 微信發布公告:打擊網絡賭博類違法行為,涉賭賬號將被限制支付能力、封號

下一篇: 沒研究過SynchronousQueue源碼,就別寫精通線程池

標簽:
  • 熱門焦點
  • K60至尊版剛預熱 一加Ace2 Pro正面硬剛

    Redmi這邊剛如火如荼的宣傳了K60 Ultra的各種技術和硬件配置,作為競品的一加也坐不住了。一加中國區總裁李杰發布了兩條微博,表示在自家的一加Ace2上早就已經采用了和PixelWo
  • 小米官宣:2023年上半年出貨量中國第一!

    今日早間,小米電視官方微博帶來消息,稱2023年小米電視上半年出貨量達到了中國第一,同時還表示小米電視的巨屏風暴即將開始。“公布一個好消息2023年#小米電視上半年出貨量中國
  • 影音體驗是真的強 簡單聊聊iQOO Pad

    大公司的好處就是產品線豐富,非常細分化的東西也能給你做出來,例如早先我們看到了新的vivo Pad2,之后我們又在iQOO Neo8 Pro的發布會上看到了iQOO的首款平板產品iQOO Pad。雖
  • 28個SpringBoot項目中常用注解,日常開發、求職面試不再懵圈

    前言在使用SpringBoot開發中或者在求職面試中都會使用到很多注解或者問到注解相關的知識。本文主要對一些常用的注解進行了總結,同時也會舉出具體例子,供大家學習和參考。注解
  • 一文看懂為蘋果Vision Pro開發應用程序

    譯者 | 布加迪審校 | 重樓蘋果的Vision Pro是一款混合現實(MR)頭戴設備。Vision Pro結合了虛擬現實(VR)和增強現實(AR)的沉浸感。其高分辨率顯示屏、先進的傳感器和強大的處理能力
  • 學習JavaScript的10個理由...

    作者 | Simplilearn編譯 | 王瑞平當你決心學習一門語言的時候,很難選擇到底應該學習哪一門,常用的語言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • 慕巖炮轟抖音,百合網今何在?

    來源:價值研究所 作者:Hernanderz&ldquo;難道就因為自己的一個產品牛逼了,從客服到總裁,都不愿意正視自己產品和運營上的問題,選擇逃避了嗎?&rdquo;這一番話,出自百合網聯合創
  • 10天營收超1億美元,《星鐵》比《原神》差在哪?

    來源:伯虎財經作者:陳平安即便你沒玩過《原神》,你一定聽說過的它的大名。恨它的人把《原神》開服那天稱作是中國游戲史上最黑暗的一天,有粉絲因為索尼在PS平臺上線《原神》,怒而
  • 華為HarmonyOS 4.0將于8月4日發布 或搭載AI大模型技術

    華為宣布HarmonyOS4.0將于8月4日正式發布。此前,華為已經針對開發者公布了HarmonyOS4.0,以便于開發者提前進行適配,也因此被曝光出了一些新系統的特性
Top 主站蜘蛛池模板: 新竹市| 屯留县| 曲水县| 闵行区| 南京市| 伊川县| 马鞍山市| 奉化市| 和政县| 西畴县| 抚顺县| 壤塘县| 佛学| 建瓯市| 繁峙县| 佛山市| 南安市| 鸡西市| 乐昌市| 陆河县| 城口县| 微博| 合阳县| 剑河县| 两当县| 道孚县| 随州市| 色达县| 齐齐哈尔市| 筠连县| 莆田市| 临猗县| 松滋市| 灯塔市| 南丹县| 科技| 柳州市| 民丰县| 南投县| 云霄县| 阳春市|