最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java動態(tài)線程池插件dynamic-tp集成過程淺析

 更新時間:2023年03月02日 09:59:11   作者:Redick01  
這篇文章主要介紹了Java動態(tài)線程池插件dynamic-tp集成過程,dynamic-tp是一個輕量級的動態(tài)線程池插件,它是一個基于配置中心的動態(tài)線程池,線程池的參數(shù)可以通過配置中心配置進行動態(tài)的修改

前言

dynamic-tp是一個輕量級的動態(tài)線程池插件,它是一個基于配置中心的動態(tài)線程池,線程池的參數(shù)可以通過配置中心配置進行動態(tài)的修改,目前支持的配置中心有Apollo,NacosZookeeper,同時dynamic-tp支持線程池的監(jiān)控和報警,具體特性如下:

  • 基于Spring框架,現(xiàn)只支持SpringBoot項目使用,輕量級,引入 starter 即可使用
  • 基于配置中心實現(xiàn)線程池參數(shù)動態(tài)調(diào)整,實時生效;集成主流配置中心,已支持 Nacos、Apollo,Zookeeper, 同時也提供 SPI 接口可自定義擴展實現(xiàn)
  • 內(nèi)置通知報警功能,提供多種報警維度(配置變更通知、活性報警、容量閾值報警、拒絕策略觸發(fā)報警), 默認(rèn)支持企業(yè)微信、釘釘報警,同時提供 SPI 接口可自定義擴展實現(xiàn)
  • 內(nèi)置線程池指標(biāo)采集功能,支持通過 MicroMeter、JsonLog 日志輸出、Endpoint 三種方式,可通過 SPI 接口自定義擴展實現(xiàn)
  • 集成管理常用第三方組件的線程池,已集成 SpringBoot 內(nèi)置 WebServer(tomcat、undertow、jetty)的線程池管理
  • Builder 提供TTL包裝功能,生成的線程池支持上下文信息傳遞

具體介紹及使用方式

為了方便用戶快速接入,筆者這里對Zookeeper配置中心接入做一個詳細(xì)的介紹,其他配置中心的demo示例可以參考項目的example,該模塊也是筆者貢獻的。這里我會詳細(xì)的介紹Zookeeper配置中心的接入和對接監(jiān)控平臺PrometheusGrafana。

快速開始

pom依賴

dynamic-tp-spring-boot-starter-zookeeper是集成dynamic-tp的starter,這里引入了micrometer-registry-prometheusspring-boot-starter-actuator用于對接Prometheus

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </dependency>
        <dependency>
            <groupId>io.github.lyh200</groupId>
            <artifactId>dynamic-tp-spring-boot-starter-zookeeper</artifactId>
            <version>1.0.2</version>
        </dependency>
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-prometheus</artifactId>
            <version>1.6.4</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>

YML配置

server:
  port: 8888

spring:
  application:
    name: dynamic-tp-zookeeper-demo
  # 下面是接入zk配置中心的配置  
  dynamic:
    tp:
      config-type: properties # zookeeper只支持properties配置
      zookeeper:
        config-version: 1.0.0 # 配置版本號
        zk-connect-str: 127.0.0.1:2181 # zk配置中心,如果是集群用逗號分開
        root-node: /configserver/userproject # 項目節(jié)點
        node: dynamic-tp-zookeeper-demo # 配置文件節(jié)點
# 對接prometheus
management:
  metrics:
    tags:
      application: ${spring.application.name}
  endpoints:
    web:
      exposure:
        include: '*'

配置中心dynamic-tp-zookeeper-demo配置文件配置

注:Zookeeper配置中心只支持properties類型配置,配置示例如下:

spring.dynamic.tp.executors部分是對線程池的配置,該配置是數(shù)組類型,可以定義多個線程池

spring.dynamic.tp.executors[1].notifyItems部分配置是對線程池報警平臺的配置,可以配置多個報警平臺

# 開啟動態(tài)線程池
spring.dynamic.tp.enabled=true
# 打印動態(tài)線程池banner
spring.dynamic.tp.enabledBanner=true
# 開啟線程池監(jiān)控指標(biāo)收集
spring.dynamic.tp.enabledCollect=true
# 線程池監(jiān)控指標(biāo)收集類型 logging-日志文件 micrometer-采集到第三方平臺 
spring.dynamic.tp.collectorType=logging
# 采集監(jiān)控數(shù)據(jù)時間間隔 5s
spring.dynamic.tp.monitorInterval=5
spring.dynamic.tp.executors[0].threadPoolName=dynamic-tp-test-1
spring.dynamic.tp.executors[0].corePoolSize=50
spring.dynamic.tp.executors[0].maximumPoolSize=50
spring.dynamic.tp.executors[0].queueCapacity=3000
spring.dynamic.tp.executors[0].queueType=VariableLinkedBlockingQueue
spring.dynamic.tp.executors[0].rejectedHandlerType=CallerRunsPolicy
spring.dynamic.tp.executors[0].keepAliveTime=50
spring.dynamic.tp.executors[0].allowCoreThreadTimeOut=false
spring.dynamic.tp.executors[0].threadNamePrefix=test1
spring.dynamic.tp.executors[0].notifyItems[0].type=capacity
spring.dynamic.tp.executors[0].notifyItems[0].enabled=false
spring.dynamic.tp.executors[0].notifyItems[0].threshold=80
spring.dynamic.tp.executors[0].notifyItems[0].platforms[0]=ding
spring.dynamic.tp.executors[0].notifyItems[0].platforms[1]=wechat
spring.dynamic.tp.executors[0].notifyItems[0].interval=120
spring.dynamic.tp.executors[0].notifyItems[1].type=change
spring.dynamic.tp.executors[0].notifyItems[1].enabled=false
spring.dynamic.tp.executors[0].notifyItems[2].type=liveness
spring.dynamic.tp.executors[0].notifyItems[2].enabled=false
spring.dynamic.tp.executors[0].notifyItems[2].threshold=80
spring.dynamic.tp.executors[0].notifyItems[3].type=reject
spring.dynamic.tp.executors[0].notifyItems[3].enabled=false
spring.dynamic.tp.executors[0].notifyItems[3].threshold=1
spring.dynamic.tp.executors[1].threadPoolName=dynamic-tp-test-2
spring.dynamic.tp.executors[1].corePoolSize=20
spring.dynamic.tp.executors[1].maximumPoolSize=30
spring.dynamic.tp.executors[1].queueCapacity=1000
spring.dynamic.tp.executors[1].queueType=VariableLinkedBlockingQueue
spring.dynamic.tp.executors[1].rejectedHandlerType=CallerRunsPolicy
spring.dynamic.tp.executors[1].keepAliveTime=50
spring.dynamic.tp.executors[1].allowCoreThreadTimeOut=false
spring.dynamic.tp.executors[1].threadNamePrefix=test2
spring.dynamic.tp.executors[1].notifyItems[0].type=capacity
spring.dynamic.tp.executors[1].notifyItems[0].enabled=false
spring.dynamic.tp.executors[1].notifyItems[0].threshold=80
spring.dynamic.tp.executors[1].notifyItems[0].platforms[0]=ding
spring.dynamic.tp.executors[1].notifyItems[0].platforms[1]=wechat
spring.dynamic.tp.executors[1].notifyItems[0].interval=120
spring.dynamic.tp.executors[1].notifyItems[1].type=change
spring.dynamic.tp.executors[1].notifyItems[1].enabled=false
spring.dynamic.tp.executors[1].notifyItems[2].type=liveness
spring.dynamic.tp.executors[1].notifyItems[2].enabled=false
spring.dynamic.tp.executors[1].notifyItems[2].threshold=80
spring.dynamic.tp.executors[1].notifyItems[3].type=reject
spring.dynamic.tp.executors[1].notifyItems[3].enabled=false
spring.dynamic.tp.executors[1].notifyItems[3].threshold=1

創(chuàng)建線程池

創(chuàng)建線程池,會注冊到dynamic-tp

@Configuration
public class ThreadPoolConfiguration {
    @Bean
    public DtpExecutor dtpExecutor() {

        return ThreadPoolCreator.createDynamicFast("dynamic-tp-test-1");
    }
    @Bean
    public ThreadPoolExecutor threadPoolExecutor() {
        return ThreadPoolBuilder.newBuilder()
                .threadPoolName("dynamic-tp-test-2")
                .corePoolSize(10)
                .maximumPoolSize(15)
                .keepAliveTime(15000)
                .timeUnit(TimeUnit.MILLISECONDS)
                .workQueue(QueueTypeEnum.SYNCHRONOUS_QUEUE.getName(), null, false)
                .buildDynamic();
    }
}

使用

初次使用不注意官網(wǎng)文檔的話可能會通過@Autowired的方式使用,目前版本這么使用是不正確的,因為當(dāng)讀取配置文件后,配置文件生成的線程池對象就會把@Bean創(chuàng)建的線程池覆蓋了,所以目前版本只能根據(jù)名字從DtpRegistry獲取線程池對象了,筆者也和項目作者溝通過,項目作者也覺得通過@Autowired方式更好一些,后面版本也會優(yōu)化。

@Slf4j
@RestController
@SuppressWarnings("all")
public class TestController {
    @GetMapping("/dtp-zookeeper-example/test")
    public String test() {
        new Thread(() -> {
            try {
                task();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
        return "success";
    }
    public void task() throws InterruptedException {
        DtpExecutor dtpExecutor1 = DtpRegistry.getExecutor("dynamic-tp-test-1");
        DtpExecutor dtpExecutor2 = DtpRegistry.getExecutor("dynamic-tp-test-2");
        for (int i = 0; i < 100; i++) {
            Thread.sleep(100);
            dtpExecutor1.execute(() -> {
                log.info("i am dynamic-tp-test-1 task");
            });
            dtpExecutor2.execute(() -> {
                log.info("i am dynamic-tp-test-2 task");
            });
        }
    }
}

監(jiān)控數(shù)據(jù)和第三方平臺對接

logging方式

spring.dynamic.tp.collectorType=logging,logging方式的監(jiān)控數(shù)據(jù),采集日志文件中,文件的位置可以通過spring.dynamic.tp.logPath配置,默認(rèn) ${user.home}/logs,日志內(nèi)容如下:

2022-03-07 13:48:31.585 INFO [dtp-monitor1:D.M.LOG] {"activeCount":0,"queueSize":0,"largestPoolSize":0,"poolSize":0,"rejectHandlerName":"CallerRunsPolicy","queueCapacity":0,"fair":false,"rejectCount":0,"waitTaskCount":0,"taskCount":0,"queueRemainingCapacity":0,"corePoolSize":40,"queueType":"SynchronousQueue","completedTaskCount":0,"dtpName":"dynamic-tp-test-2","maximumPoolSize":55}
2022-03-07 13:48:31.585 INFO [dtp-monitor1:D.M.LOG] {"activeCount":0,"queueSize":0,"largestPoolSize":0,"poolSize":0,"queueCapacity":2147483647,"fair":false,"rejectCount":0,"waitTaskCount":0,"taskCount":0,"queueRemainingCapacity":2147483647,"corePoolSize":10,"queueType":"TaskQueue","completedTaskCount":0,"dtpName":"tomcatWebServerTp","maximumPoolSize":200}
2022-03-07 13:48:36.590 INFO [dtp-monitor1:D.M.LOG] {"activeCount":0,"queueSize":0,"largestPoolSize":0,"poolSize":0,"rejectHandlerName":"CallerRunsPolicy","queueCapacity":1024,"fair":false,"rejectCount":0,"waitTaskCount":0,"taskCount":0,"queueRemainingCapacity":1024,"corePoolSize":50,"queueType":"VariableLinkedBlockingQueue","completedTaskCount":0,"dtpName":"dynamic-tp-test-1","maximumPoolSize":50}
2022-03-07 13:48:36.590 INFO [dtp-monitor1:D.M.LOG] {"activeCount":0,"queueSize":0,"largestPoolSize":0,"poolSize":0,"rejectHandlerName":"CallerRunsPolicy","queueCapacity":0,"fair":false,"rejectCount":0,"waitTaskCount":0,"taskCount":0,"queueRemainingCapacity":0,"corePoolSize":40,"queueType":"SynchronousQueue","completedTaskCount":0,"dtpName":"dynamic-tp-test-2","maximumPoolSize":55}
2022-03-07 13:48:36.590 INFO [dtp-monitor1:D.M.LOG] {"activeCount":0,"queueSize":0,"largestPoolSize":0,"poolSize":0,"queueCapacity":2147483647,"fair":false,"rejectCount":0,"waitTaskCount":0,"taskCount":0,"queueRemainingCapacity":2147483647,"corePoolSize":10,"queueType":"TaskQueue","completedTaskCount":0,"dtpName":"tomcatWebServerTp","maximumPoolSize":200}

MicroMeter方式

spring.dynamic.tp.collectorType=micrometer 采集數(shù)據(jù)到第三方平臺,這里使用的是Prometheus??梢暬故拘枰?code>Grafana平臺配置,數(shù)據(jù)源選擇Prometheus,然后創(chuàng)建Dashboard,先要在Dashboard配置動態(tài)的參數(shù)Variables,如下圖:

配置完參數(shù)后,我們創(chuàng)建Panel,可以創(chuàng)建多個Panel,然后配置Panel的數(shù)據(jù)查詢,報警顯示等等,如下圖:

最終的Dashboard如下圖:

總結(jié)

促使我使用dynamic-tp的一個最主要的點就是它輕量級,提供了線程池監(jiān)控、報警、基于配置中心修改線程池參數(shù)功能,完全滿足了我在業(yè)務(wù)中的需要,同時監(jiān)控數(shù)據(jù)能夠?qū)庸粳F(xiàn)有的監(jiān)控平臺(Prometheus+Grafana),并且在使用上也十分方便,我在剛接觸這個插件的時候它還不支持Zookeeper,恰好我司使用的配置中心就是Zookeeper,因為我在此基礎(chǔ)上把Zookeeper配置中心集成到了dynamic-tp并貢獻給社區(qū),希望可以幫到更多的人,下一篇簡單介紹下dynamic-tp支持Zookeeper的實現(xiàn)細(xì)節(jié)。

到此這篇關(guān)于Java動態(tài)線程池插件dynamic-tp集成過程淺析的文章就介紹到這了,更多相關(guān)Java dynamic-tp內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot日志信息以及Lombok的常用注解詳析

    SpringBoot日志信息以及Lombok的常用注解詳析

    日志在我們的日常開發(fā)當(dāng)中是必定會用到的,這篇文章主要給大家介紹了關(guān)于SpringBoot日志信息以及Lombok的常用注解的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • Spring Cloud搭建eureka過程圖解

    Spring Cloud搭建eureka過程圖解

    這篇文章主要介紹了Spring Cloud搭建eureka過程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • Java?Collections.sort()實現(xiàn)List排序的默認(rèn)方法和自定義方法

    Java?Collections.sort()實現(xiàn)List排序的默認(rèn)方法和自定義方法

    這篇文章主要介紹了Java?Collections.sort()實現(xiàn)List排序的默認(rèn)方法和自定義方法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2017-06-06
  • java利用url實現(xiàn)網(wǎng)頁內(nèi)容的抓取

    java利用url實現(xiàn)網(wǎng)頁內(nèi)容的抓取

    本文主要介紹了java利用url實現(xiàn)網(wǎng)頁內(nèi)容抓取的示例。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • Java實現(xiàn)AOP功能的封裝與配置的小框架實例代碼

    Java實現(xiàn)AOP功能的封裝與配置的小框架實例代碼

    這篇文章主要介紹了Java實現(xiàn)AOP功能的封裝與配置的小框架實例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • 如何基于mybatis框架查詢數(shù)據(jù)庫表數(shù)據(jù)并打印

    如何基于mybatis框架查詢數(shù)據(jù)庫表數(shù)據(jù)并打印

    這篇文章主要介紹了如何基于mybatis框架查詢數(shù)據(jù)庫表數(shù)據(jù)并打印,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • java web實現(xiàn)簡單聊天室

    java web實現(xiàn)簡單聊天室

    這篇文章主要為大家詳細(xì)介紹了java-web實現(xiàn)簡單聊天室,含拍一拍功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • Hyperlane 文件分塊上傳服務(wù)端的解決方案

    Hyperlane 文件分塊上傳服務(wù)端的解決方案

    在現(xiàn)代Web應(yīng)用中,文件上傳是一個核心功能,尤其是對于大文件,傳統(tǒng)的上傳方式常常因網(wǎng)絡(luò)中斷或超時而失敗,為了解決這一痛點,我們推出了基于 Hyperlane 的文件分塊上傳服務(wù)端代碼,為開發(fā)者提供了一個高效、可靠的大文件上傳解決方案,感興趣的朋友一起看看吧
    2025-04-04
  • SpringBoot如何加載多個YAML配置文件

    SpringBoot如何加載多個YAML配置文件

    在Spring?Boot中加載多個?YAML?配置文件是一個常見的需求,通常用于將配置信息分離到多個文件中以便于管理和維護,下面就跟隨小編一起來看看具體實現(xiàn)吧
    2025-02-02
  • java8 對象轉(zhuǎn)Map時重復(fù) key Duplicate key xxxx的解決

    java8 對象轉(zhuǎn)Map時重復(fù) key Duplicate key xxxx的解決

    這篇文章主要介紹了java8 對象轉(zhuǎn)Map時重復(fù) key Duplicate key xxxx的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評論

遂川县| 扶沟县| 呼图壁县| 乌什县| 广水市| 桐柏县| 凤翔县| 土默特左旗| 大方县| 理塘县| 韶关市| 大余县| 辽中县| 瑞丽市| 禹州市| 和林格尔县| 望都县| 金塔县| 博乐市| 西吉县| 阜康市| 湘阴县| 视频| 平昌县| 阳信县| 正定县| 防城港市| 开封县| 旬邑县| 伊川县| 昂仁县| 广丰县| 高陵县| 咸丰县| 久治县| 新兴县| 天峻县| 大石桥市| 崇左市| 秦皇岛市| 郴州市|