Dubbo高級篇4
https://blog.csdn.net/moonpure/article/details/52842115
線程模型
http://dubbo.io/User+Guide-zh.htm 用戶指南>>線程模型 類似於數據庫的連接池(+) (#)
事件處理線程說明
|
- Dispatcher
- all 所有消息都派發到線程池,包括請求,響應,連接事件,斷開事件,心跳等。
- direct 所有消息都不派發到線程池,全部在IO線程上直接執行。
- message 只有請求響應消息派發到線程池,其它連接斷開事件,心跳等消息,直接在IO線程上執行。
- execution 只請求消息派發到線程池,不含響應,響應和其它連接斷開事件,心跳等消息,直接在IO線程上執行。
- connection 在IO線程上,將連接斷開事件放入隊列,有序逐個執行,其它消息派發到線程池。
- ThreadPool
- fixed 固定大小線程池,啟動時建立線程,不關閉,一直持有。(缺省)
- cached 緩存線程池,空閑一分鐘自動刪除,需要時重建。
- limited 可伸縮線程池,但池中的線程數只會增長不會收縮。(為避免收縮時突然來了大流量引起的性能問題)。
配置如:
< dubbo:protocol name = "dubbo" dispatcher = "all" threadpool = "fixed" threads = "100" />
|
配置標簽
<dubbo:provider/>
<dubbo:protocol/>
例:
<!-- 當ProtocolConfig和ServiceConfig某屬性沒有配置時,采用此缺省值 -->
<dubbo:provider timeout="10000" threadpool="fixed" threads="100" accepts="1000" />
<dubbo:protocol/>
(+) (#)
服務提供者協議配置:
配置類:com.alibaba.dubbo.config.ProtocolConfig
說明:如果需要支持多協議,可以聲明多個<dubbo:protocol>標簽,並在<dubbo:service>中通過protocol屬性指定使用的協議。
標簽 | 屬性 | 對應URL參數 | 類型 | 是否必填 | 缺省值 | 作用 | 描述 | 兼容性 |
---|---|---|---|---|---|---|---|---|
<dubbo:protocol> | id | string | 可選 | dubbo | 配置關聯 | 協議BeanId,可以在<dubbo:service protocol="">中引用此ID,如果ID不填,缺省和name屬性值一樣,重復則在name後加序號。 | 2.0.5以上版本 | |
<dubbo:protocol> | name | <protocol> | string | 必填 | dubbo | 性能調優 | 協議名稱 | 2.0.5以上版本 |
<dubbo:protocol> | port | <port> | int | 可選 | dubbo協議缺省端口為20880,rmi協議缺省端口為1099,http和hessian協議缺省端口為80 如果配置為-1 或者 沒有配置port,則會分配一個沒有被占用的端口。Dubbo 2.4.0+,分配的端口在協議缺省端口的基礎上增長,確保端口段可控。 |
服務發現 | 服務端口 | 2.0.5以上版本 |
<dubbo:protocol> | host | <host> | string | 可選 | 自動查找本機IP | 服務發現 | -服務主機名,多網卡選擇或指定VIP及域名時使用,為空則自動查找本機IP,-建議不要配置,讓Dubbo自動獲取本機IP | 2.0.5以上版本 |
<dubbo:protocol> | threadpool | threadpool | string | 可選 | fixed | 性能調優 | 線程池類型,可選:fixed/cached | 2.0.5以上版本 |
<dubbo:protocol> | threads | threads | int | 可選 | 100 | 性能調優 | 服務線程池大小(固定大小) | 2.0.5以上版本 |
<dubbo:protocol> | iothreads | threads | int | 可選 | cpu個數+1 | 性能調優 | io線程池大小(固定大小) | 2.0.5以上版本 |
<dubbo:protocol> | accepts | accepts | int | 可選 | 0 | 性能調優 | 服務提供方最大可接受連接數 | 2.0.5以上版本 |
<dubbo:protocol> | payload | payload | int | 可選 | 88388608(=8M) | 性能調優 | 請求及響應數據包大小限制,單位:字節 | 2.0.5以上版本 |
<dubbo:protocol> | codec | codec | string | 可選 | dubbo | 性能調優 | 協議編碼方式 | 2.0.5以上版本 |
<dubbo:protocol> | serialization | serialization | string | 可選 | dubbo協議缺省為hessian2,rmi協議缺省為java,http協議缺省為json | 性能調優 | 協議序列化方式,當協議支持多種序列化方式時使用,比如:dubbo協議的dubbo,hessian2,java,compactedjava,以及http協議的json等 | 2.0.5以上版本 |
<dubbo:protocol> | accesslog | accesslog | string/boolean | 可選 | 服務治理 | 設為true,將向logger中輸出訪問日誌,也可填寫訪問日誌文件路徑,直接把訪問日誌輸出到指定文件 | 2.0.5以上版本 | |
<dubbo:protocol> | path | <path> | string | 可選 | 服務發現 | 提供者上下文路徑,為服務path的前綴 | 2.0.5以上版本 | |
<dubbo:protocol> | transporter | transporter | string | 可選 | dubbo協議缺省為netty | 性能調優 | 協議的服務端和客戶端實現類型,比如:dubbo協議的mina,netty等,可以分拆為server和client配置 | 2.0.5以上版本 |
<dubbo:protocol> | server | server | string | 可選 | dubbo協議缺省為netty,http協議缺省為servlet | 性能調優 | 協議的服務器端實現類型,比如:dubbo協議的mina,netty等,http協議的jetty,servlet等 | 2.0.5以上版本 |
<dubbo:protocol> | client | client | string | 可選 | dubbo協議缺省為netty | 性能調優 | 協議的客戶端實現類型,比如:dubbo協議的mina,netty等 | 2.0.5以上版本 |
<dubbo:protocol> | dispatcher | dispatcher | string | 可選 | dubbo協議缺省為all | 性能調優 | 協議的消息派發方式,用於指定線程模型,比如:dubbo協議的all, direct, message, execution, connection等 | 2.1.0以上版本 |
<dubbo:protocol> | queues | queues | int | 可選 | 0 | 性能調優 | 線程池隊列大小,當線程池滿時,排隊等待執行的隊列大小,建議不要設置,當線程程池時應立即失敗,重試其它服務提供機器,而不是排隊,除非有特殊需求。 | 2.0.5以上版本 |
<dubbo:protocol> | charset | charset | string | 可選 | UTF-8 | 性能調優 | 序列化編碼 | 2.0.5以上版本 |
<dubbo:protocol> | buffer | buffer | int | 可選 | 8192 | 性能調優 | 網絡讀寫緩沖區大小 | 2.0.5以上版本 |
<dubbo:protocol> | heartbeat | heartbeat | int | 可選 | 0 | 性能調優 | 心跳間隔,對於長連接,當物理層斷開時,比如拔網線,TCP的FIN消息來不及發送,對方收不到斷開事件,此時需要心跳來幫助檢查連接是否已斷開 | 2.0.10以上版本 |
<dubbo:protocol> | telnet | telnet | string | 可選 | 服務治理 | 所支持的telnet命令,多個命令用逗號分隔 | 2.0.5以上版本 | |
<dubbo:protocol> | register | register | boolean | 可選 | true | 服務治理 | 該協議的服務是否註冊到註冊中心 | 2.0.8以上版本 |
<dubbo:protocol> | contextpath | contextpath | String | 可選 | 缺省為空串 | 服務治理 | 2.0.6以上版本 |
Linux 用戶線程數限制導致的 Java.lang.OutOfMemoryError: unable to create new native thread異常
系統默認最大的線程數為1024個
[root@edu-provider-01 ~]# cat /etc/security/limits.d/90-nproc.conf
# Default limit for number of user‘s processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
* soft nproc 1024
root soft nproc unlimited
[root@edu-provider-01 ~]# vi /etc/security/limits.d/90-nproc.conf
調整時要註意:
1、 盡量不要使用 root 用戶來部署應用程序,避免資源耗盡後無法登錄操作系統。
因為root用戶默認沒有限制線程數,如果線程過多,會使資源占用很多,導致不能關機,只能硬關機
2、 普通用戶的線程數限制值要看可用物理內存容量來配置
[root@edu-provider-01 ~]# cat /proc/meminfo |grep MemTotal
MemTotal: 2941144 kB
[root@edu-provider-01 ~]# echo "2941144/128"|bc
22977
[root@edu-provider-01 ~]# ulimit -u
1024
[1]+ Stopped vi /etc/security/limits.d/90-nproc.conf
[root@edu-provider-01 ~]# vi /etc/security/limits.d/90-nproc.conf
[root@edu-provider-01 ~]# cat /etc/security/limits.d/90-nproc.conf
# Default limit for number of user‘s processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
* soft nproc 12000
root soft nproc unlimited
[root@edu-provider-01 ~]#
計算方式:
default_nproc = total_memory/128K;
$ cat /proc/meminfo |grep MemTotal
$ echo "2941144/128"|bc
$ ulimit -u
ulimit -a # 顯示目前資源限制的設定
ulimit -u # 用戶最多可開啟的程序數目
重啟,使之生效:# reboot
只訂閱
(+) (#)
問題 為方便開發測試,經常會在線下共用一個所有服務可用的註冊中心,這時,如果一個正在開發中的服務提供者註冊,可能會影響消費者不能正常運行。 |
解決方案 可以讓服務提供者開發方,只訂閱服務(開發的服務可能依賴其它服務),而不註冊正在開發的服務,通過直連測試正在開發的服務。 |
禁用註冊配置:
< dubbo:registry address = "10.20.153.10:9090" register = "false" />
|
或者:
< dubbo:registry address = "10.20.153.10:9090?register=false" />
|
只訂閱配置測試
在註冊中心查看只訂閱的服務是否註冊上?
註意點:
1、“只訂閱”指的是需要做開發調試的服務提供者,只向註冊中心訂閱其所依賴的服務,但
不向註冊中心註冊其本身可以提供的服務。
2、“只訂閱”需要結合“直連提供者”配置來進行調用測試。(正在開發的本地服務只訂閱,本地消費端
直連正在開發的本地服務進行調試)
只註冊
(+) (#)
問題 如果有兩個鏡像環境,兩個註冊中心,有一個服務只在其中一個註冊中心有部署,另一個註冊中心還沒來得及部署,而兩個註冊中心的其它應用都需要依賴此服務,所以需要將服務同時註冊到兩個註冊中心,但卻不能讓此服務同時依賴兩個註冊中心的其它服務。 |
解決方案 可以讓服務提供者方,只註冊服務到另一註冊中心,而不從另一註冊中心訂閱服務。 |
禁用訂閱配置:
< dubbo:registry id = "hzRegistry" address = "10.20.153.10:9090" />
< dubbo:registry id = "qdRegistry" address = "10.20.141.150:9090" subscribe = "false" />
|
或者:
< dubbo:registry id = "hzRegistry" address = "10.20.153.10:9090" />
< dubbo:registry id = "qdRegistry" address = "10.20.141.150:9090?subscribe=false" />
|
Dubbo高級篇4