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

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

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

一、背景描述

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

二、線程池配置

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

@Configuration
public static class ReactNettyConfiguration {
    @Bean
    public ReactorResourceFactory reactorClientResourceFactory() {
        System.setProperty("reactor.netty.ioSelectCount","1");
        // 這里工作線程數(shù)為2-4倍都可以。看具體情況
        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,版本不一樣的話 可能參數(shù)key不太一樣??梢钥匆幌翷oopResources 中寫的key。

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

三、源碼分析

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線程數(shù),未配置的話。從cpu核心數(shù)和4直接取一個大的
    int DEFAULT_IO_WORKER_COUNT = Integer.parseInt(System.getProperty("reactor.netty.ioWorkerCount", "" + Math.max(Runtime.getRuntime().availableProcessors(), 4)));
    // 這里是select線程數(shù) 默認(rèn)是-1
    int DEFAULT_IO_SELECT_COUNT = Integer.parseInt(System.getProperty("reactor.netty.ioSelectCount", "-1"));
    ....
    // 創(chuàng)建一個默認(rèn)的資源,把兩個線程數(shù)的參數(shù)傳遞過去
    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);
    }
    ....

接下來看一下 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<>();
        // 因為默認(rèn)沒有配置 所以selectCode必然是-1
        if (selectCount == -1) {
            this.selectCount = workerCount;
            // serverSelectLoops沒有創(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() {
        // 兩個相等的話 使用 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;
    }

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

參考:http://www.fzitv.net/program/292774r05.htm

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

相關(guān)文章

  • Jenkins與SVN持續(xù)集成的示例代碼

    Jenkins與SVN持續(xù)集成的示例代碼

    這篇文章主要介紹了Jenkins與SVN持續(xù)集成的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • 解決SpringBoot整合Mybatis掃描不到Mapper的問題

    解決SpringBoot整合Mybatis掃描不到Mapper的問題

    這篇文章主要介紹了解決SpringBoot整合Mybatis掃描不到Mapper的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • JavaWeb實現(xiàn)文件上傳與下載實例詳解

    JavaWeb實現(xiàn)文件上傳與下載實例詳解

    在Web應(yīng)用程序開發(fā)中,文件上傳與下載功能是非常常用的功能,下面通過本文給大家介紹JavaWeb實現(xiàn)文件上傳與下載實例詳解,對javaweb文件上傳下載相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧
    2016-02-02
  • Spring Boot 2.x 實現(xiàn)文件上傳功能

    Spring Boot 2.x 實現(xiàn)文件上傳功能

    這篇文章主要介紹了Spring Boot 2.x 實現(xiàn)文件上傳功能,本文分步驟通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • 從@CrossOrigin到Gateway詳解Spring Boot跨域處理的10種姿勢

    從@CrossOrigin到Gateway詳解Spring Boot跨域處理的10種姿勢

    在前后端分離架構(gòu)成為主流的今天,跨域問題已成為每個Web開發(fā)者必須面對的挑戰(zhàn),本文將系統(tǒng)性地介紹10種Spring Boot跨域處理方案,下面小編就和大家簡單介紹一下吧
    2025-11-11
  • 模擬Ping操作的一個Java類

    模擬Ping操作的一個Java類

    這篇文章主要為大家詳細(xì)介紹了一個模擬Ping操作的Java類,感興趣的小伙伴們可以參考一下
    2016-03-03
  • 淺談標(biāo)簽和JLabel類構(gòu)造方法

    淺談標(biāo)簽和JLabel類構(gòu)造方法

    這篇文章主要介紹了標(biāo)簽和JLabel類構(gòu)造方法,具有一定參考價值,需要的朋友可以參考下。
    2017-09-09
  • Spring MVC如何設(shè)置響應(yīng)

    Spring MVC如何設(shè)置響應(yīng)

    本文介紹了如何在Spring框架中設(shè)置響應(yīng),并通過不同的注解返回靜態(tài)頁面、HTML片段和JSON數(shù)據(jù),此外,還講解了如何設(shè)置響應(yīng)的狀態(tài)碼和Header
    2025-01-01
  • Java基礎(chǔ)篇之List集合舉例詳解

    Java基礎(chǔ)篇之List集合舉例詳解

    Java中的List集合是一種常用的數(shù)據(jù)結(jié)構(gòu),它提供了一種有序、可重復(fù)的元素集合,下面這篇文章主要給大家介紹了關(guān)于Java基礎(chǔ)篇之List集合的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • SpringBoot使用Validation校驗參數(shù)的詳細(xì)過程

    SpringBoot使用Validation校驗參數(shù)的詳細(xì)過程

    這篇文章主要介紹了SpringBoot使用Validation校驗參數(shù),本文結(jié)合實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09

最新評論

高清| 镇赉县| 平江县| 岳普湖县| 涡阳县| 松滋市| 永城市| 民权县| 永修县| 牙克石市| 双峰县| 合肥市| 满洲里市| 吉安县| 禄丰县| 桐乡市| 老河口市| 满洲里市| 南部县| 长春市| 东台市| 丰县| 沙河市| 中卫市| 任丘市| 嘉峪关市| 镇沅| 塔城市| 梨树县| 江华| 花莲县| 乌拉特前旗| 平湖市| 新源县| 招远市| 涿州市| 修文县| 女性| 奉化市| 仁怀市| 涞源县|