国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Nacos 實(shí)現(xiàn)動態(tài)化線程池,真香!

這篇具有很好參考價值的文章主要介紹了Nacos 實(shí)現(xiàn)動態(tài)化線程池,真香!。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

在后臺開發(fā)中,會經(jīng)常用到線程池技術(shù),對于線程池核心參數(shù)的配置很大程度上依靠經(jīng)驗(yàn)。然而,由于系統(tǒng)運(yùn)行過程中存在的不確定性,我們很難一勞永逸地規(guī)劃一個合理的線程池參數(shù)。

在對線程池配置參數(shù)進(jìn)行調(diào)整時,一般需要對服務(wù)進(jìn)行重啟,這樣修改的成本就會偏高。一種解決辦法就是,將線程池的配置放到平臺側(cè),運(yùn)行開發(fā)同學(xué)根據(jù)系統(tǒng)運(yùn)行情況對核心參數(shù)進(jìn)行動態(tài)配置。

本文以Nacos作為服務(wù)配置中心,以修改線程池核心線程數(shù)、最大線程數(shù)為例,實(shí)現(xiàn)一個簡單的動態(tài)化線程池。

代碼實(shí)現(xiàn)

推薦一個開源免費(fèi)的 Spring Boot 實(shí)戰(zhàn)項(xiàng)目:

https://github.com/javastacks/spring-boot-best-practice

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文件

Spring Boot 基礎(chǔ)就不介紹了,推薦看這個實(shí)戰(zhàn)項(xiàng)目:

https://github.com/javastacks/spring-boot-best-practice

bootstrap.yml:

server:
  port: 8010
  # 應(yīng)用名稱(nacos會將該名稱當(dāng)做服務(wù)名稱)
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中配置文件的加載是存在優(yōu)先級順序的,bootstrap優(yōu)先級高于application。

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

3.nacos配置

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

Nacos 實(shí)現(xiàn)動態(tài)化線程池,真香!

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

Nacos 實(shí)現(xiàn)動態(tài)化線程池,真香!

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

4.線程池配置和nacos配置變更監(jiān)聽

@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配置變更監(jiān)聽
        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));
                    }
                });
    }

    /**
     * 打印當(dāng)前線程池的狀態(tài)
     */
    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());
    }

    /**
     * 給線程池增加任務(wù)
     *
     * @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();
                    }
                }
            });
        }
    }

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

這個代碼就是實(shí)現(xiàn)動態(tài)線程池和核心了,需要說明的是:

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

5.controller

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

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

    @Autowired
    private DynamicThreadPool dynamicThreadPool;

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

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

6.測試

啟動項(xiàng)目,訪問http://localhost:8010/threadpool/print打印當(dāng)前線程池的配置。

Nacos 實(shí)現(xiàn)動態(tài)化線程池,真香!

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

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

Nacos 實(shí)現(xiàn)動態(tài)化線程池,真香!

可以看到已經(jīng)有線程在排隊(duì)了。

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

Nacos 實(shí)現(xiàn)動態(tài)化線程池,真香!

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

調(diào)整nacos配置,將核心線程數(shù)調(diào)整為50,最大線程數(shù)調(diào)整為100.

Nacos 實(shí)現(xiàn)動態(tài)化線程池,真香!

重新多次訪問/add接口增加任務(wù),發(fā)現(xiàn)沒有拒絕信息了。這時,打印具體的線程狀態(tài),發(fā)現(xiàn)線程池參數(shù)修改成功。

Nacos 實(shí)現(xiàn)動態(tài)化線程池,真香!

總結(jié)

這里,只是簡單實(shí)現(xiàn)了一個可以調(diào)整核心線程數(shù)和最大線程數(shù)的動態(tài)線程池。具體的線程池實(shí)現(xiàn)原理可以參考美團(tuán)的這篇文章:https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html,結(jié)合監(jiān)控告警等實(shí)現(xiàn)一個完善的動態(tài)線程池產(chǎn)品。

優(yōu)秀的輪子還有好多,比如Hippo4J ,使用起來和dynamic-tp差不多。Hippo4J 有無依賴中間件實(shí)現(xiàn)動靜線程池,也有默認(rèn)實(shí)現(xiàn)Nacos和Apollo的版本,而dynamic-tp 默認(rèn)實(shí)現(xiàn)依賴Nacos或Apollo。

來源:blog.csdn.net/m0_37558251/article/details/126542359

近期熱文推薦:

1.1,000+ 道 Java面試題及答案整理(2022最新版)

2.勁爆!Java 協(xié)程要來了。。。

3.Spring Boot 2.x 教程,太全了!

4.別再寫滿屏的爆爆爆炸類了,試試裝飾器模式,這才是優(yōu)雅的方式?。?/p>

5.《Java開發(fā)手冊(嵩山版)》最新發(fā)布,速速下載!

覺得不錯,別忘了隨手點(diǎn)贊+轉(zhuǎn)發(fā)哦!文章來源地址http://www.zghlxwxcb.cn/news/detail-711657.html

到了這里,關(guān)于Nacos 實(shí)現(xiàn)動態(tài)化線程池,真香!的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • iServer通過服務(wù)實(shí)例動態(tài)化管理MongoDB萬級瓦片集應(yīng)用實(shí)踐

    iServer通過服務(wù)實(shí)例動態(tài)化管理MongoDB萬級瓦片集應(yīng)用實(shí)踐

    作者:Carlo 數(shù)據(jù)特點(diǎn) 柵格數(shù)據(jù):數(shù)據(jù)量大、增長快、接收來源廣、類型多、時間跨度大 矢量數(shù)據(jù):隨著柵格數(shù)據(jù)增長而增長的,包含點(diǎn)線面類型 項(xiàng)目難點(diǎn) 有 萬級 數(shù)據(jù)(MongoDB瓦片)需要發(fā)布成GIS服務(wù)(wms、wmts) 單個iServer承載的GIS服務(wù)較多時, 出現(xiàn) 啟動過慢 等問題,原因

    2024年02月12日
    瀏覽(27)
  • 從靜態(tài)到動態(tài)化,Python數(shù)據(jù)可視化中的Matplotlib和Seaborn

    本文分享自華為云社區(qū)《Python數(shù)據(jù)可視化大揭秘:Matplotlib和Seaborn高效應(yīng)用指南》,作者: 檸檬味擁抱。 首先,確保你已經(jīng)安裝了Matplotlib和Seaborn庫。如果沒有安裝,可以使用以下命令進(jìn)行安裝: Matplotlib是一個靈活的繪圖庫,支持多種圖表類型。以下是一個簡單的折線圖的

    2024年03月25日
    瀏覽(28)
  • GaiaX開源解讀 | 跨端動態(tài)化模板引擎詳解,看完你也能寫一個

    GaiaX開源解讀 | 跨端動態(tài)化模板引擎詳解,看完你也能寫一個

    GaiaX跨端模板引擎,是在阿里優(yōu)酷、淘票票、大麥內(nèi)廣泛使用的Native動態(tài)化方案,其核心優(yōu)勢是性能、穩(wěn)定和易用。本系列文章《GaiaX開源解讀》,帶大家看看過去三年GaiaX的發(fā)展過程。 在“GaiaX開源解讀系列之第一篇:《GaiaX開源解讀 | 基于優(yōu)酷業(yè)務(wù)特色的跨平臺技術(shù)》”中

    2023年04月08日
    瀏覽(23)
  • 【Java項(xiàng)目】使用Nacos實(shí)現(xiàn)動態(tài)線程池技術(shù)以及Nacos配置文件更新監(jiān)聽事件

    【Java項(xiàng)目】使用Nacos實(shí)現(xiàn)動態(tài)線程池技術(shù)以及Nacos配置文件更新監(jiān)聽事件

    真誠的希望能給我項(xiàng)目一個stars?。?! 項(xiàng)目源碼 項(xiàng)目視頻演示 線程池(Thread Pool)是一種基于池化思想管理線程的工具,經(jīng)常出現(xiàn)在多線程服務(wù)器中,如Tomcat。 線程過多會帶來額外的開銷,其中包括創(chuàng)建銷毀線程的開銷、調(diào)度線程的開銷等等,同時也降低了計(jì)算機(jī)的整體性

    2024年02月09日
    瀏覽(18)
  • Gateway基于Nacos動態(tài)路由實(shí)現(xiàn)

    Gateway基于Nacos動態(tài)路由實(shí)現(xiàn)

    客戶端請求,首先會被 Gateway Handler Mapping 處理,用以在? 路由表? 中查找一個與請求匹配的? 路由 , 然后將請求交由? Web Handler ?處理, Web Handler ?維護(hù)了一個過濾器鏈,鏈?zhǔn)綀?zhí)行這些過濾器,這些過濾器在邏輯上存在兩個執(zhí)行階段? pre ? 與? post ? Nacos 致力于幫助您發(fā)現(xiàn)

    2024年02月06日
    瀏覽(25)
  • SpringCloud nacos 集成 gateway ,實(shí)現(xiàn)動態(tài)路由

    SpringCloud nacos 集成 gateway ,實(shí)現(xiàn)動態(tài)路由

    ?? 作者: Linux猿 ?? 簡介: CSDN博客專家??,華為云享專家??,Linux、C/C++、云計(jì)算、物聯(lián)網(wǎng)、面試、刷題、算法盡管咨詢我,關(guān)注我,有問題私聊! ?? 歡迎小伙伴們點(diǎn)贊??、收藏?、留言?? 目錄 一、準(zhǔn)備工作 1.1 下載代碼 1.2 運(yùn)行代碼 二、集成 gateway 2.1 修改 pom.xml 2

    2024年02月16日
    瀏覽(22)
  • logback實(shí)現(xiàn)讀取spring和nacos的動態(tài)配置

    例如在這里我們設(shè)置了一個spring.application.name的參數(shù) 注:這里的scope可以選擇content和local,如果集成了其他組件(例:logstash)并且希望此字段發(fā)出去,name設(shè)置為content,如果只是在此文件中使用,則設(shè)置為local? 是在這里就定義了一個appName的屬性,數(shù)據(jù)來源于spring.application

    2024年02月12日
    瀏覽(19)
  • SpringCloud-Gateway路由動態(tài)配置Nacos實(shí)現(xiàn)

    編寫配置類 properties添加配置 自定義RouteDefinitionLocator 編寫GatewayDynamicConfiguration配置類

    2024年02月07日
    瀏覽(27)
  • vue3后臺管理系統(tǒng)實(shí)現(xiàn)動態(tài)側(cè)邊導(dǎo)航菜單管理(ElementPlus組件)

    vue3后臺管理系統(tǒng)實(shí)現(xiàn)動態(tài)側(cè)邊導(dǎo)航菜單管理(ElementPlus組件)

    記住 一級(el-sub-menu)的都是只是展示的 點(diǎn)擊跳轉(zhuǎn)的都是一級下的子級(el-menu-item) 完整展示 1:在登陸功能進(jìn)行登陸 獲取menu列表 注冊路由表的時候 把文件進(jìn)行創(chuàng)建好 因?yàn)樽缘姆椒ㄐ枰@取這個路徑 整個router下的main product等等都要創(chuàng)建 2:側(cè)邊菜單界面 router/index.ts

    2024年02月16日
    瀏覽(31)
  • 如何在Spring Boot應(yīng)用中使用Nacos實(shí)現(xiàn)動態(tài)更新數(shù)據(jù)源

    如何在Spring Boot應(yīng)用中使用Nacos實(shí)現(xiàn)動態(tài)更新數(shù)據(jù)源

    ???? 博主貓頭虎 帶您 Go to New World.??? ?? 博客首頁——貓頭虎的博客?? ??《面試題大全專欄》 文章圖文并茂??生動形象??簡單易學(xué)!歡迎大家來踩踩~?? ?? 《IDEA開發(fā)秘籍專欄》學(xué)會IDEA常用操作,工作效率翻倍~?? ?? 《100天精通Golang(基礎(chǔ)入門篇)》學(xué)會Golang語言

    2024年02月10日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包