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

spring?cloud?gateway中netty線程池小優(yōu)化

 更新時間:2023年07月21日 08:52:34   作者:whale-52赫茲  
這篇文章主要介紹了spring?cloud?gateway中netty線程池小優(yōu)化技巧示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

關于spring cloud gateway中 netty線程池的一點小優(yōu)化

最近測試同學對系統(tǒng)進行壓測。報出一個問題:幾乎所有接口的成績都不太好。甚至一些僅僅是主鍵查詢,并且數(shù)據(jù)量不大的接口也是如此。

排查過程中:跳過gateway網(wǎng)關,直接通過目標服務器ip進行壓測發(fā)現(xiàn)成績提升明顯。初步判斷是網(wǎng)關問題。

網(wǎng)上翻閱資料發(fā)現(xiàn)一個優(yōu)化點,就是netty本身的線程池配置。

源碼

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ù) 默認是-1
    int DEFAULT_IO_SELECT_COUNT = Integer.parseInt(System.getProperty("reactor.netty.ioSelectCount", "-1"));
    ....
    // 創(chuàng)建一個默認的資源,把兩個線程數(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<>();
		// 因為默認沒有配置 所以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;
	}
	// 這里相當于返回了工作組
	@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線程組的。結合分析reactor模型可以發(fā)現(xiàn),這種情況對處理效率是有影響的。而且最大只和cpu核心數(shù)量相同的配置也明顯無法重復利硬件用資源。

目前解決是注入一下參數(shù),當然也可以啟動jvm時指定。兩種都差不多

System.setProperty("reactor.netty.ioSelectCount","1");
// 這里工作線程數(shù)為2-4倍都可以??淳唧w情況
      System.setProperty("reactor.netty.ioWorkerCount",String.valueOf(Math.max(Runtime.getRuntime().availableProcessors()*3, 4)));

我這里版本是reactor-netty-core-1.0.3,版本不一樣的話 可能參數(shù)key不太一樣。可以看一下LoopResources 中寫的key

以上就是spring cloud gateway中netty線程池小優(yōu)化的詳細內容,更多關于spring cloud gateway netty的資料請關注腳本之家其它相關文章!

相關文章

  • SpringBoot使用Apache?Tika檢測敏感信息

    SpringBoot使用Apache?Tika檢測敏感信息

    Apache?Tika?是一個功能強大的內容分析工具,它能夠從多種文件格式中提取文本、元數(shù)據(jù)以及其他結構化信息,下面我們來看看如何使用Apache?Tika檢測敏感信息從而實現(xiàn)數(shù)據(jù)泄露防護吧
    2025-01-01
  • java代碼實現(xiàn)判斷字符串是否為亂碼

    java代碼實現(xiàn)判斷字符串是否為亂碼

    這篇文章主要為大家詳細介紹了如何使用java代碼實現(xiàn)判斷字符串是否為亂碼,文中的示例代碼講解詳細,有需要的小伙伴可以跟隨小編一起學習一下
    2026-03-03
  • lombok @Accessors用法詳解

    lombok @Accessors用法詳解

    這篇文章主要介紹了lombok @Accessors用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • Spring中@Scheduled注解的參數(shù)詳解

    Spring中@Scheduled注解的參數(shù)詳解

    這篇文章主要介紹了Spring中@Scheduled注解的參數(shù)詳解,@Scheduled注解的使用這里不詳細說明,@Scheduled注解有幾個參數(shù)需要說明一下,直接對8個參數(shù)進行講解,需要的朋友可以參考下
    2023-11-11
  • springMvc異步的DeferredResult long?polling應用示例解析

    springMvc異步的DeferredResult long?polling應用示例解析

    這篇文章主要為大家介紹了springMvc中DeferredResult的long?polling應用示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-03-03
  • java 加密之RSA算法加密與解密的實例詳解

    java 加密之RSA算法加密與解密的實例詳解

    這篇文章主要介紹了java 加密之RSA算法加解密與解密的實例詳解的相關資料,需要的朋友可以參考下
    2017-07-07
  • Java如何自定義線程池中隊列

    Java如何自定義線程池中隊列

    這篇文章主要介紹了Java如何自定義線程池中隊列,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-07-07
  • SpringBoot項目離線環(huán)境手動構建的過程

    SpringBoot項目離線環(huán)境手動構建的過程

    文章介紹了如何在IntelliJ IDEA中手動創(chuàng)建一個Spring Boot項目,并詳細講解了pom.xml文件的配置和基本項目結構的設置,感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • JDBC鏈接數(shù)據(jù)庫的幾個步驟

    JDBC鏈接數(shù)據(jù)庫的幾個步驟

    這篇文章主要介紹了JDBC鏈接數(shù)據(jù)庫的幾個步驟,通過將數(shù)據(jù)庫的連接放在一個工具類里面,達到重用的效果,需要的朋友可以參考下
    2015-07-07
  • java開發(fā)Activiti進階篇流程實例詳解

    java開發(fā)Activiti進階篇流程實例詳解

    這篇文章主要為大家介紹了java開發(fā)Activiti進階篇流程實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08

最新評論

黄冈市| 扬中市| 康保县| 石渠县| 延长县| 都昌县| 胶州市| 鄂托克旗| 怀化市| 朝阳区| 江陵县| 贵州省| 离岛区| 靖西县| 京山县| 苍溪县| 紫金县| 长宁县| 天祝| 隆化县| 长泰县| 义乌市| 禹州市| 壤塘县| 神农架林区| 集贤县| 区。| 通州区| 巴东县| 晋州市| 德格县| 财经| 温泉县| 漯河市| 蒙自县| 本溪| 犍为县| 永寿县| 连城县| 榆社县| 兴业县|