欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Dubbo框架線(xiàn)程池使用介紹

 更新時(shí)間:2022年09月02日 10:35:30   作者:悠然予夏  
當(dāng)我們?cè)谑褂胐ubbo的時(shí)候,是可以通過(guò)調(diào)整線(xiàn)程池來(lái)達(dá)到調(diào)優(yōu)的效果,我們可以在dubbo:protocol 標(biāo)簽中使用用threadpool屬性選擇自己想要使用的線(xiàn)程池,通過(guò)threads屬性配置服務(wù)線(xiàn)程數(shù),queues屬性配置使用的隊(duì)列

1、Dubbo已有線(xiàn)程池

dubbo在使用時(shí),都是通過(guò)創(chuàng)建真實(shí)的業(yè)務(wù)線(xiàn)程池進(jìn)行操作的。目前已知的線(xiàn)程池模型有兩個(gè)和java中的相互對(duì)應(yīng):

  • fix: 表示創(chuàng)建固定大小的線(xiàn)程池。也是Dubbo默認(rèn)的使用方式,默認(rèn)創(chuàng)建的執(zhí)行線(xiàn)程數(shù)為200,并且是沒(méi)有任何等待隊(duì)列的。所以在極端的情況下可能會(huì)存在問(wèn)題,比如某個(gè)操作大量執(zhí)行時(shí),可能存在堵塞的情況。后面也會(huì)講相關(guān)的處理辦法。
  • cache: 創(chuàng)建非固定大小的線(xiàn)程池,當(dāng)線(xiàn)程不足時(shí),會(huì)自動(dòng)創(chuàng)建新的線(xiàn)程。但是使用這種的時(shí)候需要注意,如果突然有高TPS的請(qǐng)求過(guò)來(lái),方法沒(méi)有及時(shí)完成,則會(huì)造成大量的線(xiàn)程創(chuàng)建,對(duì)系統(tǒng)的CPU和負(fù)載都是壓力,執(zhí)行越多反而會(huì)拖慢整個(gè)系統(tǒng)。

2、自定義線(xiàn)程池

在真實(shí)的使用過(guò)程中可能會(huì)因?yàn)槭褂胒ix模式的線(xiàn)程池,導(dǎo)致具體某些業(yè)務(wù)場(chǎng)景因?yàn)榫€(xiàn)程池中的線(xiàn)程數(shù)量不足而產(chǎn)生錯(cuò)誤,而很多業(yè)務(wù)研發(fā)是對(duì)這些無(wú)感知的,只有當(dāng)出現(xiàn)錯(cuò)誤的時(shí)候才會(huì)去查看告警或者通過(guò)客戶(hù)反饋出現(xiàn)嚴(yán)重的問(wèn)題才去查看,結(jié)果發(fā)現(xiàn)是線(xiàn)程池滿(mǎn)了。所以可以在創(chuàng)建線(xiàn)程池的時(shí),通過(guò)某些手段對(duì)這個(gè)線(xiàn)程池進(jìn)行監(jiān)控,這樣就可以進(jìn)行及時(shí)的擴(kuò)縮容機(jī)器或者告警。下面的這個(gè)程序就是這樣子的,會(huì)在創(chuàng)建線(xiàn)程池后進(jìn)行對(duì)其監(jiān)控,并且及時(shí)作出相應(yīng)處理。

(1)線(xiàn)程池實(shí)現(xiàn), 這里主要是基于對(duì)FixedThreadPool 中的實(shí)現(xiàn)做擴(kuò)展出線(xiàn)程監(jiān)控的部分

package com.lagou.threadpool;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.threadpool.support.fixed.FixedThreadPool;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Map;
import java.util.concurrent.*;
public class WachingThreadPool extends FixedThreadPool implements Runnable {
    private static final Logger LOGGER = LoggerFactory.getLogger(WachingThreadPool.class);
    // 定義線(xiàn)程池使用的閥值
    private static final double ALARM_PERCENT = 0.90;
    private final Map<URL, ThreadPoolExecutor> THREAD_POOLS = new ConcurrentHashMap<>();
    public WachingThreadPool() {
        // 每隔3秒打印線(xiàn)程使用情況
        Executors.newSingleThreadScheduledExecutor().scheduleWithFixedDelay(this, 1, 3, TimeUnit.SECONDS);
    }
    // 通過(guò)父類(lèi)創(chuàng)建線(xiàn)程池
    @Override
    public Executor getExecutor(URL url) {
        final Executor executor = super.getExecutor(url);
        if (executor instanceof ThreadPoolExecutor) {
            THREAD_POOLS.put(url, (ThreadPoolExecutor) executor);
        }
        return executor;
    }
    @Override
    public void run() {
        // 遍歷線(xiàn)程池
        for (Map.Entry<URL, ThreadPoolExecutor> entry : THREAD_POOLS.entrySet()) {
            final URL url = entry.getKey();
            final ThreadPoolExecutor executor = entry.getValue();
            // 計(jì)算相關(guān)指標(biāo)
            final int activeCount = executor.getActiveCount();
            final int poolSize = executor.getCorePoolSize();
            double usedPercent = activeCount / (poolSize * 1.0);
            LOGGER.info("線(xiàn)程池執(zhí)行狀態(tài):[{}/{}:{}%]", activeCount, poolSize, usedPercent * 100);
            if (usedPercent > ALARM_PERCENT) {
                LOGGER.error("超出警戒線(xiàn)! host:{} 當(dāng)前使用率是:{},URL:{}", url.getIp(), usedPercent * 100, url);
            }
        }
    }
}

(2)SPI聲明,創(chuàng)建文件(固定的)

META-INF/dubbo/org.apache.dubbo.common.threadpool.ThreadPool

watching=包名.線(xiàn)程池名

(3)在服務(wù)提供方項(xiàng)目引入該依賴(lài)

(4)在服務(wù)提供方項(xiàng)目中設(shè)置使用該線(xiàn)程池生成器

dubbo.provider.threadpool=watching

(5)接下來(lái)需要做的就是模擬整個(gè)流程,因?yàn)樵摼€(xiàn)程當(dāng)前是每1秒抓一次數(shù)據(jù),所以我們需要對(duì)該方法的提供者超過(guò)1秒的時(shí)間(比如這里用休眠Thread.sleep ),消費(fèi)者則需要啟動(dòng)多個(gè)線(xiàn)程來(lái)并行執(zhí)行,來(lái)模擬整個(gè)并發(fā)情況。

(6)在調(diào)用方則嘗試簡(jiǎn)單通過(guò)for循環(huán)啟動(dòng)多個(gè)線(xiàn)程來(lái)執(zhí)行 查看服務(wù)提供方的監(jiān)控情況

package com.lagou;
import com.lagou.bean.ConsumerComponent;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import java.io.IOException;
public class AnnotationConsumerMain {
    public static void main(String[] args) throws IOException, InterruptedException {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConsumerConfiguration.class);
        context.start();
        ConsumerComponent service = context.getBean(ConsumerComponent.class);
        while (true) {
            for (int i = 0; i < 1000; i++) {
                Thread.sleep(5);
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        String msg = service.sayHello("world", 0);
                        System.out.println(msg);
                    }
                }).start();
            }
        }
    }
    @Configuration
    @PropertySource("classpath:/dubbo-consumer.properties")
    //@EnableDubbo(scanBasePackages = "com.lagou.bean")
    @ComponentScan("com.lagou.bean")
    @EnableDubbo
    static class ConsumerConfiguration {
    }
}

到此這篇關(guān)于Dubbo框架線(xiàn)程池使用介紹的文章就介紹到這了,更多相關(guān)Dubbo線(xiàn)程池內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談Java中的final關(guān)鍵字與C#中的const, readonly關(guān)鍵字

    淺談Java中的final關(guān)鍵字與C#中的const, readonly關(guān)鍵字

    下面小編就為大家?guī)?lái)一篇淺談Java中的final關(guān)鍵字與C#中的const, readonly關(guān)鍵字。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-10-10
  • Hibernate懶加載之<class>標(biāo)簽上的lazy

    Hibernate懶加載之<class>標(biāo)簽上的lazy

    這篇文章主要介紹了Hibernate懶加載之<class>標(biāo)簽上的lazy,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • spring boot項(xiàng)目導(dǎo)入依賴(lài)后代碼報(bào)錯(cuò)問(wèn)題的解決方法

    spring boot項(xiàng)目導(dǎo)入依賴(lài)后代碼報(bào)錯(cuò)問(wèn)題的解決方法

    這篇文章主要給大家介紹了關(guān)于spring boot項(xiàng)目導(dǎo)入依賴(lài)后代碼報(bào)錯(cuò)問(wèn)題的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • SpringBoot實(shí)現(xiàn)在webapp下直接訪(fǎng)問(wèn)html,jsp

    SpringBoot實(shí)現(xiàn)在webapp下直接訪(fǎng)問(wèn)html,jsp

    這篇文章主要介紹了SpringBoot實(shí)現(xiàn)在webapp下直接訪(fǎng)問(wèn)html,jsp問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Java基礎(chǔ)之extends用法詳解及簡(jiǎn)單實(shí)例

    Java基礎(chǔ)之extends用法詳解及簡(jiǎn)單實(shí)例

    這篇文章主要介紹了 Java基礎(chǔ)之extends用法詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • 使用Java WebSocket獲取客戶(hù)端IP地址的示例代碼

    使用Java WebSocket獲取客戶(hù)端IP地址的示例代碼

    在開(kāi)發(fā)Web應(yīng)用程序時(shí),我們通常需要獲取客戶(hù)端的 IP 地址用于日志記錄、身份驗(yàn)證、限制訪(fǎng)問(wèn)等操作,本文將介紹如何使用Java WebSocket API獲取客戶(hù)端IP地址,以及如何在常見(jiàn)的WebSocket框架中獲得客戶(hù)端 IP地址,需要的朋友可以參考下
    2023-11-11
  • request.getRequestURL()等方法得到路徑的區(qū)別及說(shuō)明

    request.getRequestURL()等方法得到路徑的區(qū)別及說(shuō)明

    這篇文章主要介紹了request.getRequestURL()等方法得到路徑的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java實(shí)現(xiàn)兩人五子棋游戲(五) 判斷是否有一方勝出

    Java實(shí)現(xiàn)兩人五子棋游戲(五) 判斷是否有一方勝出

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)兩人五子棋游戲,判斷是否有一方勝出,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • JavaWeb三大組件之一的Filter詳解

    JavaWeb三大組件之一的Filter詳解

    本篇文章主要介紹了JavaWeb三大組件之中的Filter過(guò)濾器詳解,實(shí)例分析了JavaWeb之Filter過(guò)濾器的使用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2022-06-06
  • Java 基于雪花算法生成分布式id

    Java 基于雪花算法生成分布式id

    SnowFlake 算法(雪花算法), 是Twitter開(kāi)源的分布式id生成算法。其核心思想就是: 使用一個(gè)64 bit的long型的數(shù)字作為全局唯一id。本文講述Java 基于雪花算法生成分布式id的方法
    2021-06-06

最新評(píng)論