Nacos 限流最佳實踐

2021-10-07 15:58:54 字數 3984 閱讀 6989

nacos自開源以來,版本迭代速度很快,已經發布了0.9版本,準備發1.0的正式版本,支援企業使用nacos生產高可用。在生產環境,nacos首先需要保證自身服務的穩定性,在正常的執行環境下不會出現服務掛掉的情況。當然在一些依賴的系統出問題的時候(比如磁碟和db),nacos服務會受到影響,需要監控系統發現這些問題並能及時的介入處理。

作為高效能的服務發現和配置管理服務,nacos也是存在自己的效能基線的,當瞬時的高峰流量超過自身的效能基線的時候,需要對高峰流量進行限流,以保證整體服務的健康執行而不影響到其他核心應用。

nacos基於spring boot使用內嵌的tomcat,tomcat執行緒分為acceptor執行緒和worker執行緒,acceptor執行緒負責從核心accept佇列中取出連線並交給worker執行緒,而worker執行緒則負責處理連線(讀取引數、執行處理、返回響應等)

當tomcat不能及時處理新的連線時,核心中新建的連線將會進入連線佇列排隊,acceptcount引數能夠設定tomcat accept連線佇列大小,當新的連線數超過acceptcount則拒絕連線,立即返回給client,不會讓client一直等待造成響應很慢或超時

接受了的連線需要由worker執行緒排程處理,當worker執行緒處理的連線數越來越多時,處理的速度會越來越慢造成client響應時間變長,需要根據系統和機器情況設定合理的maxconnections,當連線數到達maxconnections時,不再接受新的連線,讓新連線排隊等待,超出佇列長度則直接拒絕。

maxthreads引數設定tomcat的最大執行緒數,過高的執行緒數會讓系統執行的負載過高、響應變慢,過低的執行緒數讓系統的資源利用率太低,需要根據實際的運**況(cpu、io等)設定合理的最大執行緒數。

tomcat限流只能做到自身負載的調節,在實際生產環境中還遠遠不夠,需要依賴nacos自身的限流來提高系統的限流能力。

nacos的open api都是基於http協議,可以很方便地使用nginx來做限流,不需要自身再開發限流模組來支援各種限流策略。nginx的基本使用以及nginx+lua模組安裝網上資源很豐富,這裡就不再介紹。

nacos每個介面執行的代價不盡相同,一般來說寫操作代價比讀操作大,與此同時還有高頻操作和低頻操作之分,sdk呼叫的介面一般來說是高頻介面,容易出現問題,所以在生產環境需要將這些介面區別對待,根據服務自身的實際情況採取合理的限流策略,以防錯用方打垮nacos服務。下面介紹一下nacos在生產環境的幾種限流場景

limit_get_config對讀操作進行限流,正常使用nacos獲取動態配置一般就啟動和執行時修改配置推送到client,獲取配置相對來說是低頻操作,如果頻繁獲取配置肯定是client有錯用或者應用不正常(比如資料平台任務failover重試任務)

limit_req_zone $limit_key zone=limit_get_config:10m rate=10r/s;

server

rewrite ^ /limit_get_config_url last;

}location /limit_get_config_url

}

limit_publish_config對寫操作進行限流,可以有效防止熱點寫問題。對同乙個資料的高頻寫會觸發mysql的行鎖,從而導致mysql的多執行緒任務因等待行鎖排隊,最終導致mysql所有操作都超時服務不可用。這裡通過nginx lua模組獲取post請求的引數,設定limit_key

limit_req_zone $limit_key zone=limit_publish_config:10m rate=5r/s;

location /limit_publish_config_url

perclient對單個client的所有請求限制低於500qps,可以有效防止單台client的重試攻擊

limit_req_zone $remote_addr zone=perclient:10m rate=500r/s;

server

}

perserver限制整個nacos服務的qps,nacos的服務部署在nginx之後,nginx可以保證到達nacos的流量不會打垮nacos

limit_req zone=perserver burst=1000 nodelay;
/nacos/v1/cs/configs/listener介面是nacos的長連線通道,一般來說,乙個client乙個長連線就可以滿足生產需求。limit_conn_client限制client的連線數不超過10個,limit_conn_server限制nacos單機(8核16g記憶體)支撐最多9000個長連線,最多可以同時服務9000個應用節點

limit_conn_zone $remote_addr zone=limit_conn_client:10m;

limit_conn_zone $server_name zone=limit_conn_server:10m;

server

}

當生產環境發現有錯用的client影響到nacos服務,可以使用nginx黑名單限制client的訪問

deny 30.5.125.70;
從被限制的ip訪問nacos 

curl -x get "http://:8080/nacos/v1/cs/configs?dataid=nacos.cfg.dataid&group=test" -i
nginx返回403狀態碼給client,禁止client訪問 

有時候通過ip維度直接限制client訪問所有nacos介面粒度過大,會導致應用服務不可用,可以將讀操作和寫操作分開,禁止client寫nacos,依然允許其進行讀

# 1 limit read, 0 no limit

map "$remote_addr" $limit_read

# 1 limit write, 0 no limit

map "$remote_addr" $limit_write

location /some_url_to_write

}

ip黑名單功能是nginx提供的基礎能力,能夠限制某些ip的訪問,但是一般乙個應用會有很多臺機器,當乙個應用出問題的時候,會有很多ip訪問都有問題,通過ip的維度來限制訪問達不到預期,需要有應用的維度來限制

namespace(命名空間)是乙個可以區分不同應用的維度,不同的應用一般會使用不同的namespace,這樣可以在namespace維度對服務的訪問進行限制

map "$arg_tenant" $limit_namespace 

location /some_url

}

通過匹配namespace是否在黑名單中來設定limit_namespace變數,然後在訪問的url中判斷limit_namespace的值,如果為1返回403狀態碼

ak維度:使用乙個ak代表乙個應用,不同的應用在啟動的時候設定不同的ak。client在發起請求的時候會帶上ak引數到server端,在nginx層對請求的引數進行解析,對特定的應用的ak進行訪問限制

}本文簡單介紹了nacos在實際生產環境中如何通過限流來提高自身服務的穩定性,除了自身設定tomcat引數,還可以通過高效能的nginx作為前端對流量進行過濾提高限流能力。文中難免會有個別錯誤或者遺漏,如果大家有更多的限流或者提高穩定性的辦法可以在nacos官網提出來。

Nacos配置管理最佳實踐

nacos乙個最常用的功能就是配置中心,在具體使用時往往是多個團隊,甚至整個公司的研發團隊都使用同乙個nacos服務。那麼使用時如何保證配置在各個團隊之間的隔離,又能保證配置管理的便捷性?下面就來介紹乙個我使用下來比較好的實踐方式。namespace的劃分需要根據具體的開發團隊規模來。對於一些比較小...

最佳實踐 Flutter 最佳實踐

最佳實踐是乙個領域可以接受的專業標準,對於任何程式語言來說,提高 質量 可讀性 可維護性和健壯性都非常重要。讓我們探索一些設計和開發flutter應用程式的最佳實踐。class enum typedef和extension應採用駝峰命名uppercamelcase規則。class mainscree...

JUnit最佳實踐

junit最佳實踐 cherami 轉貼 參與分 20053,專家分 4960 發表 2003 9 16 下午7 57 版本 1.0 閱讀 3899次 martin fowler說過 當你試圖列印輸出一些資訊或除錯乙個表示式時,寫一些測試 來替代那些傳統的方法。一開始,你會發現你總是要建立一些新的f...