AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁 > 科技  > 軟件

Spring Boot + Nacos 實(shí)現(xiàn)了一個(gè)動(dòng)態(tài)化線程池,非常實(shí)用!

來源: 責(zé)編: 時(shí)間:2024-02-04 08:59:05 227觀看
導(dǎo)讀在后臺(tái)開發(fā)中,會(huì)經(jīng)常用到線程池技術(shù),對(duì)于線程池核心參數(shù)的配置很大程度上依靠經(jīng)驗(yàn)。然而,由于系統(tǒng)運(yùn)行過程中存在的不確定性,我們很難一勞永逸地規(guī)劃一個(gè)合理的線程池參數(shù)。在對(duì)線程池配置參數(shù)進(jìn)行調(diào)整時(shí),一般需要對(duì)服務(wù)進(jìn)

在后臺(tái)開發(fā)中,會(huì)經(jīng)常用到線程池技術(shù),對(duì)于線程池核心參數(shù)的配置很大程度上依靠經(jīng)驗(yàn)。然而,由于系統(tǒng)運(yùn)行過程中存在的不確定性,我們很難一勞永逸地規(guī)劃一個(gè)合理的線程池參數(shù)。在對(duì)線程池配置參數(shù)進(jìn)行調(diào)整時(shí),一般需要對(duì)服務(wù)進(jìn)行重啟,這樣修改的成本就會(huì)偏高。一種解決辦法就是,將線程池的配置放到平臺(tái)側(cè),運(yùn)行開發(fā)同學(xué)根據(jù)系統(tǒng)運(yùn)行情況對(duì)核心參數(shù)進(jìn)行動(dòng)態(tài)配置。bLl28資訊網(wǎng)——每日最新資訊28at.com

本文以Nacos作為服務(wù)配置中心,以修改線程池核心線程數(shù)、最大線程數(shù)為例,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的動(dòng)態(tài)化線程池。bLl28資訊網(wǎng)——每日最新資訊28at.com

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

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:bLl28資訊網(wǎng)——每日最新資訊28at.com

server:  port: 8010  # 應(yīng)用名稱(nacos會(huì)將該名稱當(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:bLl28資訊網(wǎng)——每日最新資訊28at.com

spring:  profiles:    active: dev

為什么要配置兩個(gè)yml文件?bLl28資訊網(wǎng)——每日最新資訊28at.com

springboot中配置文件的加載是存在優(yōu)先級(jí)順序的,bootstrap優(yōu)先級(jí)高于application。bLl28資訊網(wǎng)——每日最新資訊28at.com

nacos在項(xiàng)目初始化時(shí),要保證先從配置中心進(jìn)行配置拉取,拉取配置之后才能保證項(xiàng)目的正常啟動(dòng)。bLl28資訊網(wǎng)——每日最新資訊28at.com

3.nacos配置

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

圖片圖片bLl28資訊網(wǎng)——每日最新資訊28at.com

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

圖片圖片bLl28資訊網(wǎng)——每日最新資訊28at.com

這里我們只配置了兩個(gè)參數(shù),核心線程數(shù)量和最大線程數(shù)。bLl28資訊網(wǎng)——每日最新資訊28at.com

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

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

這個(gè)代碼就是實(shí)現(xiàn)動(dòng)態(tài)線程池和核心了,需要說明的是:bLl28資訊網(wǎng)——每日最新資訊28at.com

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

5.controller

為了觀察線程池動(dòng)態(tài)變更的效果,增加Controller類。bLl28資訊網(wǎng)——每日最新資訊28at.com

@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.測(cè)試

啟動(dòng)項(xiàng)目,訪問http://localhost:8010/threadpool/print打印當(dāng)前線程池的配置。bLl28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片bLl28資訊網(wǎng)——每日最新資訊28at.com

可以看到,這個(gè)就是我們之前在nacos配置的線程數(shù)。bLl28資訊網(wǎng)——每日最新資訊28at.com

訪問http://localhost:8010/threadpool/add?count=20增加20個(gè)任務(wù),重新打印線程池配置bLl28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片bLl28資訊網(wǎng)——每日最新資訊28at.com

可以看到已經(jīng)有線程在排隊(duì)了。bLl28資訊網(wǎng)——每日最新資訊28at.com

為了能夠看到效果,我們多訪問幾次/add接口,增加任務(wù)數(shù),在控制臺(tái)出現(xiàn)拒絕信息時(shí)調(diào)整nacos配置。bLl28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片bLl28資訊網(wǎng)——每日最新資訊28at.com

此時(shí),執(zhí)行/add命令時(shí),所有的線程都會(huì)提示rejected。bLl28資訊網(wǎng)——每日最新資訊28at.com

調(diào)整nacos配置,將核心線程數(shù)調(diào)整為50,最大線程數(shù)調(diào)整為100.bLl28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片bLl28資訊網(wǎng)——每日最新資訊28at.com

重新多次訪問/add接口增加任務(wù),發(fā)現(xiàn)沒有拒絕信息了。這時(shí),打印具體的線程狀態(tài),發(fā)現(xiàn)線程池參數(shù)修改成功。bLl28資訊網(wǎng)——每日最新資訊28at.com

圖片bLl28資訊網(wǎng)——每日最新資訊28at.com

總結(jié)

這里,只是簡(jiǎn)單實(shí)現(xiàn)了一個(gè)可以調(diào)整核心線程數(shù)和最大線程數(shù)的動(dòng)態(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)一個(gè)完善的動(dòng)態(tài)線程池產(chǎn)品。bLl28資訊網(wǎng)——每日最新資訊28at.com

優(yōu)秀的輪子還有好多,比如Hippo4J ,使用起來和dynamic-tp差不多。Hippo4J 有無依賴中間件實(shí)現(xiàn)動(dòng)靜線程池,也有默認(rèn)實(shí)現(xiàn)Nacos和Apollo的版本,而dynamic-tp 默認(rèn)實(shí)現(xiàn)依賴Nacos或Apollo。bLl28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-72425-0.htmlSpring Boot + Nacos 實(shí)現(xiàn)了一個(gè)動(dòng)態(tài)化線程池,非常實(shí)用!

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 微信發(fā)布公告:打擊網(wǎng)絡(luò)賭博類違法行為,涉賭賬號(hào)將被限制支付能力、封號(hào)

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

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 0糖0卡0脂 旭日森林仙草烏龍茶優(yōu)惠:15瓶到手29元

    旭日森林無糖仙草烏龍茶510ml*15瓶平時(shí)要賣為79.9元,今日下單領(lǐng)取50元優(yōu)惠券,到手價(jià)為29.9元。產(chǎn)品規(guī)格:0糖0卡0脂,添加草本仙草汁,清涼爽口,富含茶多酚,保留
  • 線程通訊的三種方法!通俗易懂

    線程通信是指多個(gè)線程之間通過某種機(jī)制進(jìn)行協(xié)調(diào)和交互,例如,線程等待和通知機(jī)制就是線程通訊的主要手段之一。 在 Java 中,線程等待和通知的實(shí)現(xiàn)手段有以下幾種方式:Object 類下
  • SpringBoot中使用Cache提升接口性能詳解

    環(huán)境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPASpring 框架從 3.1 開始,對(duì) Spring 應(yīng)用程序提供了透明式添加緩存的支持。和事務(wù)支持一樣,抽象緩存允許一致地使用各
  • 一年經(jīng)驗(yàn)在二線城市面試后端的經(jīng)驗(yàn)分享

    忠告這篇文章只適合2年內(nèi)工作經(jīng)驗(yàn)、甚至沒有工作經(jīng)驗(yàn)的朋友閱讀。如果你是2年以上工作經(jīng)驗(yàn),請(qǐng)果斷劃走,對(duì)你沒啥幫助~主人公這篇文章內(nèi)容來自 「升職加薪」星球星友 的投稿,坐
  • 三言兩語說透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是兩種很有用的技術(shù),可以幫助我們寫出更加優(yōu)雅、泛用的函數(shù)。本文將首先介紹柯里化和反柯里化的概念、實(shí)現(xiàn)原理和應(yīng)用
  • WebRTC.Net庫開發(fā)進(jìn)階,教你實(shí)現(xiàn)屏幕共享和多路復(fù)用!

    WebRTC.Net庫:讓你的應(yīng)用更親民友好,實(shí)現(xiàn)視頻通話無痛接入! 除了基本用法外,還有一些進(jìn)階用法可以更好地利用該庫。自定義 STUN/TURN 服務(wù)器配置WebRTC.Net 默認(rèn)使用 Google 的
  • 猿輔導(dǎo)與新東方的兩種“歸途”

    作者|卓心月 出品|零態(tài)LT(ID:LingTai_LT)如何成為一家偉大企業(yè)?答案一定是對(duì)&ldquo;勢(shì)&rdquo;的把握,這其中最關(guān)鍵的當(dāng)屬對(duì)企業(yè)戰(zhàn)略的制定,且能夠站在未來看現(xiàn)在,即使這其中的
  • 2299元起!iQOO Pad開啟預(yù)售:性能最強(qiáng)天璣平板

    5月23日,iQOO如期舉行了新品發(fā)布會(huì),除了首發(fā)安卓最強(qiáng)旗艦處理器的iQOO Neo8系列新機(jī)外,還在發(fā)布會(huì)上推出了旗下首款平板電腦——iQOO Pad,其搭載了天璣
  • iQOO Neo8 Pro搶先上架:首發(fā)天璣9200+ 安卓性能之王

    經(jīng)過了一段時(shí)間的密集爆料,昨日iQOO官方如期對(duì)外宣布:將于5月23日推出全新的iQOO Neo8系列新品,官方稱這是一款擁有旗艦級(jí)性能調(diào)校的作品。隨著發(fā)布時(shí)
Top