亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring?Cloud?Gateway中netty線(xiàn)程池優(yōu)化示例詳解

 更新時(shí)間:2023年07月21日 08:53:27   作者:AC編程  
這篇文章主要介紹了Spring?Cloud?Gateway中netty線(xiàn)程池優(yōu)化示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

一、背景描述

最近測(cè)試同學(xué)對(duì)系統(tǒng)進(jìn)行壓測(cè)。報(bào)出一個(gè)問(wèn)題:幾乎所有接口的成績(jī)都不太好。甚至一些僅僅是主鍵查詢(xún),并且數(shù)據(jù)量不大的接口也是如此。排查過(guò)程中:跳過(guò)gateway網(wǎng)關(guān),直接通過(guò)目標(biāo)服務(wù)器ip進(jìn)行壓測(cè)發(fā)現(xiàn)成績(jī)提升明顯。初步判斷是網(wǎng)關(guān)問(wèn)題。網(wǎng)上翻閱資料發(fā)現(xiàn)一個(gè)優(yōu)化點(diǎn),就是netty本身的線(xiàn)程池配置。

二、線(xiàn)程池配置

要設(shè)置可同時(shí)工作的線(xiàn)程數(shù)需要設(shè)置netty中的reactor.netty.ioWorkerCount參數(shù)。該參數(shù)無(wú)法直接配置,需要通過(guò)System.setProperty設(shè)置,故我們可以創(chuàng)建以下配置類(lèi)來(lái)配置該參數(shù):

@Configuration
public static class ReactNettyConfiguration {
    @Bean
    public ReactorResourceFactory reactorClientResourceFactory() {
        System.setProperty("reactor.netty.ioSelectCount","1");
        // 這里工作線(xiàn)程數(shù)為2-4倍都可以??淳唧w情況
        int ioWorkerCount = Math.max(Runtime.getRuntime().availableProcessors()*3, 4));
        System.setProperty("reactor.netty.ioWorkerCount",String.valueOf(ioWorkerCount);
        return new ReactorResourceFactory();
    }
}

我這里版本是reactor-netty-core-1.0.3,版本不一樣的話(huà) 可能參數(shù)key不太一樣??梢钥匆幌翷oopResources 中寫(xiě)的key。

Runtime.getRuntime().availableProcessors()獲取的是cpu核心線(xiàn)程數(shù)也就是計(jì)算資源,而不是CPU物理核心數(shù),對(duì)于支持超線(xiàn)程的CPU來(lái)說(shuō),單個(gè)物理處理器相當(dāng)于擁有兩個(gè)邏輯處理器,能夠同時(shí)執(zhí)行兩個(gè)線(xiàn)程。

三、源碼分析

package reactor.netty.resources;
import io.netty.channel.Channel;
import io.netty.channel.EventLoopGroup;
import java.time.Duration;
import java.util.Objects;
import reactor.core.Disposable;
import reactor.core.publisher.Mono;
@FunctionalInterface
public interface LoopResources extends Disposable {
    // 這里是worker線(xiàn)程數(shù),未配置的話(huà)。從cpu核心數(shù)和4直接取一個(gè)大的
    int DEFAULT_IO_WORKER_COUNT = Integer.parseInt(System.getProperty("reactor.netty.ioWorkerCount", "" + Math.max(Runtime.getRuntime().availableProcessors(), 4)));
    // 這里是select線(xiàn)程數(shù) 默認(rèn)是-1
    int DEFAULT_IO_SELECT_COUNT = Integer.parseInt(System.getProperty("reactor.netty.ioSelectCount", "-1"));
    ....
    // 創(chuàng)建一個(gè)默認(rèn)的資源,把兩個(gè)線(xiàn)程數(shù)的參數(shù)傳遞過(guò)去
    static LoopResources create(String prefix) {
        if (Objects.requireNonNull(prefix, "prefix").isEmpty()) {
            throw new IllegalArgumentException("Cannot use empty prefix");
        }
        return new DefaultLoopResources(prefix, DEFAULT_IO_SELECT_COUNT, DEFAULT_IO_WORKER_COUNT, true);
    }
    ....

接下來(lái)看一下 DefaultLoopResources做了什么

DefaultLoopResources(String prefix, int selectCount, int workerCount, boolean daemon) {
        this.running = new AtomicBoolean(true);
        this.daemon = daemon;
        this.workerCount = workerCount;
        this.prefix = prefix;
        this.serverLoops = new AtomicReference<>();
        this.clientLoops = new AtomicReference<>();
        this.cacheNativeClientLoops = new AtomicReference<>();
        this.cacheNativeServerLoops = new AtomicReference<>();
        // 因?yàn)槟J(rèn)沒(méi)有配置 所以selectCode必然是-1
        if (selectCount == -1) {
            this.selectCount = workerCount;
            // serverSelectLoops沒(méi)有創(chuàng)建,而是直接使用的serverLoops
            this.serverSelectLoops = this.serverLoops;
            this.cacheNativeSelectLoops = this.cacheNativeServerLoops;
        }
        else {
            this.selectCount = selectCount;
            this.serverSelectLoops = new AtomicReference<>();
            this.cacheNativeSelectLoops = new AtomicReference<>();
        }
    }
    @SuppressWarnings("FutureReturnValueIgnored")
    EventLoopGroup cacheNioSelectLoops() {
        // 兩個(gè)相等的話(huà) 使用 cacheNioServerLoops 返回工作組
        if (serverSelectLoops == serverLoops) {
            return cacheNioServerLoops();
        }
        EventLoopGroup eventLoopGroup = serverSelectLoops.get();
        if (null == eventLoopGroup) {
            EventLoopGroup newEventLoopGroup = new NioEventLoopGroup(selectCount,
                    threadFactory(this, "select-nio"));
            if (!serverSelectLoops.compareAndSet(null, newEventLoopGroup)) {
                //"FutureReturnValueIgnored" this is deliberate
                newEventLoopGroup.shutdownGracefully(0, 0, TimeUnit.MILLISECONDS);
            }
            eventLoopGroup = cacheNioSelectLoops();
        }
        return eventLoopGroup;
    }
    // 這里相當(dāng)于返回了工作組
    @SuppressWarnings("FutureReturnValueIgnored")
    EventLoopGroup cacheNioServerLoops() {
        EventLoopGroup eventLoopGroup = serverLoops.get();
        if (null == eventLoopGroup) {
            EventLoopGroup newEventLoopGroup = new NioEventLoopGroup(workerCount,
                    threadFactory(this, "nio"));
            if (!serverLoops.compareAndSet(null, newEventLoopGroup)) {
                //"FutureReturnValueIgnored" this is deliberate
                newEventLoopGroup.shutdownGracefully(0, 0, TimeUnit.MILLISECONDS);
            }
            eventLoopGroup = cacheNioServerLoops();
        }
        return eventLoopGroup;
    }

可以看出來(lái),如果未配置。netty是沒(méi)有select線(xiàn)程組的。結(jié)合分析reactor模型可以發(fā)現(xiàn),這種情況對(duì)處理效率是有影響的。而且最大只和cpu核心數(shù)量相同的配置也明顯無(wú)法重復(fù)利硬件用資源。

參考:http://chabaoo.cn/program/292774r05.htm

以上就是Spring Cloud Gateway中netty線(xiàn)程池優(yōu)化的詳細(xì)內(nèi)容,更多關(guān)于Spring Cloud Gateway中netty線(xiàn)程池優(yōu)化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java實(shí)現(xiàn)指定線(xiàn)程執(zhí)行順序的三種方式示例

    Java實(shí)現(xiàn)指定線(xiàn)程執(zhí)行順序的三種方式示例

    這篇文章主要介紹了Java實(shí)現(xiàn)指定線(xiàn)程執(zhí)行順序的三種方式,包括通過(guò)共享對(duì)象鎖加上可見(jiàn)變量,通過(guò)主線(xiàn)程Join()以及通過(guò)線(xiàn)程執(zhí)行時(shí)Join()等三種實(shí)現(xiàn)方法,需要的朋友可以參考下
    2019-01-01
  • 使用java實(shí)現(xiàn)網(wǎng)絡(luò)爬蟲(chóng)

    使用java實(shí)現(xiàn)網(wǎng)絡(luò)爬蟲(chóng)

    這篇文章主要介紹了使用java實(shí)現(xiàn)網(wǎng)絡(luò)爬蟲(chóng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Spring Cloud Gateway(讀取、修改 Request Body)的操作

    Spring Cloud Gateway(讀取、修改 Request Body)的操作

    這篇文章主要介紹了Spring Cloud Gateway(讀取、修改 Request Body)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • 淺談java是如何做資源回收補(bǔ)救的

    淺談java是如何做資源回收補(bǔ)救的

    這篇文章主要介紹了淺談java是如何做資源回收補(bǔ)救的,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • SpringBoot使用validation做參數(shù)校驗(yàn)說(shuō)明

    SpringBoot使用validation做參數(shù)校驗(yàn)說(shuō)明

    這篇文章主要介紹了SpringBoot使用validation做參數(shù)校驗(yàn)說(shuō)明,首先通過(guò)添加hibernate-validator展開(kāi)全文內(nèi)容,具有一定的參考價(jià)值,需要的小伙伴可以參考與喜愛(ài)
    2022-04-04
  • SpringCloud Hystrix的使用

    SpringCloud Hystrix的使用

    這篇文章主要介紹了SpringCloud Hystrix的使用,幫助大家更好的理解和學(xué)習(xí)使用SpringCloud,感興趣的朋友可以了解下
    2021-04-04
  • Spring中的@Autowired、@Qualifier和@Primary注解詳解

    Spring中的@Autowired、@Qualifier和@Primary注解詳解

    這篇文章主要介紹了Spring中的@Autowired、@Qualifier和@Primary注解詳解,@Autowired?注解,可以對(duì)類(lèi)成員變量、方法和構(gòu)造函數(shù)進(jìn)行標(biāo)注,完成自動(dòng)裝配的工作,@Autowired?是默認(rèn)根據(jù)?byType?進(jìn)行自動(dòng)裝配的,需要的朋友可以參考下
    2023-11-11
  • 淺談java常量池

    淺談java常量池

    下面小編就為大家?guī)?lái)一篇淺談java常量池。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06
  • Java中的線(xiàn)程安全問(wèn)題詳細(xì)解析

    Java中的線(xiàn)程安全問(wèn)題詳細(xì)解析

    這篇文章主要介紹了Java中的線(xiàn)程安全問(wèn)題詳細(xì)解析,線(xiàn)程安全是如果有多個(gè)線(xiàn)程在同時(shí)運(yùn)行,而這些線(xiàn)程可能會(huì)同時(shí)運(yùn)行這段代碼,程序每次運(yùn)行結(jié)果和單線(xiàn)程運(yùn)行的結(jié)果是一樣的,而且其他的變量的值也和預(yù)期的是一樣的,此時(shí)我們就稱(chēng)之為是線(xiàn)程安全的,需要的朋友可以參考下
    2023-11-11
  • Java調(diào)用opencv實(shí)現(xiàn)圖片矯正功能

    Java調(diào)用opencv實(shí)現(xiàn)圖片矯正功能

    這篇文章主要為大家詳細(xì)介紹了Java如何調(diào)用opencv實(shí)現(xiàn)圖片矯正功能,文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-09-09

最新評(píng)論