前言
上文介紹了SOFA-RPC 的幾種調(diào)用方式,包括單向調(diào)用诗轻、同步調(diào)用、Future調(diào)用揭北、回調(diào)扳炬,引入了泛化調(diào)用和過濾器。本文將對(duì) SOFA-RPC 的高級(jí)功能搔体,包括參數(shù)配置恨樟、自定義線程池、預(yù)熱權(quán)重和自動(dòng)故障剔除等疚俱。
正文
1. 參數(shù)配置
SOFABoot RPC Starter
提供了方便的參數(shù)設(shè)置方式劝术。這些參數(shù)目前可以分為兩個(gè)部分。一部分是如端口呆奕,注冊(cè)中心地址等配置养晋,這類配置在 application.properties
中。另一部分是如超時(shí)時(shí)間等配置登馒,這類配置在 XML
中匙握。
XML 配置
- 調(diào)用超時(shí)時(shí)間
如下是設(shè)置超時(shí)時(shí)間的方式,單位為 ms 陈轿,如果調(diào)用超過了這個(gè)時(shí)間則會(huì)拋出異常圈纺。服務(wù)端和客戶端都可以設(shè)置秦忿,以客戶端的超時(shí)時(shí)間設(shè)置優(yōu)先。默認(rèn)客戶端為 3000 蛾娶,目前對(duì) bolt灯谣,rest,dubbo 生效蛔琅。
<sofa:binding.bolt>
<sofa:global-attrs timeout="5000"/>
</sofa:binding.bolt>
- 獲取地址等待時(shí)間
如下是設(shè)置獲取地址等待時(shí)間胎许,單位為ms。在啟動(dòng)時(shí)如果服務(wù)引用方等待超過了這個(gè)時(shí)間則不會(huì)再等待地址罗售,會(huì)繼續(xù)啟動(dòng)辜窑。客戶端設(shè)置寨躁,默認(rèn)為-1穆碎,表示會(huì)一直等待到地址為止。目前對(duì) bolt职恳,rest 生效所禀。
<sofa:binding.bolt>
<sofa:global-attrs address-wait-time="30000"/>
</sofa:binding.bolt>
- 建立連接超時(shí)時(shí)間
如下是設(shè)置建立連接超時(shí)時(shí)間,單位為 ms 放钦。在建立連接時(shí)如果耗時(shí)超過了這個(gè)時(shí)間則會(huì)拋出異常色徘。客戶端設(shè)操禀,默認(rèn)為 5000褂策。目前對(duì) bolt,rest 生效床蜘。
<sofa:binding.bolt>
<sofa:global-attrs connect.timeout="30000"
</sofa:binding.bolt>
- 權(quán)重
如下是設(shè)置權(quán)重辙培。客戶端在發(fā)起調(diào)用時(shí)邢锯,如果采用的算法是隨機(jī)調(diào)用扬蕊,則會(huì)根據(jù)該權(quán)重來進(jìn)行隨機(jī)。服務(wù)端設(shè)置丹擎,默認(rèn)為 100尾抑。目前對(duì) bolt 生效。
<sofa:binding.bolt>
<sofa:global-attrs weight="200"/>
</sofa:binding.bolt>
- lazy 連接
默認(rèn)情況下客戶端在注冊(cè)中心推送地址到客戶端時(shí)蒂培,就立即建立好連接再愈,這個(gè)過程通常是在第一次調(diào)用之前進(jìn)行的。如果設(shè)置服務(wù)引用的屬性 lazy 為 true护戳,客戶端在第一次調(diào)用時(shí)才和所要調(diào)用的遠(yuǎn)程地址建立連接翎冲。默認(rèn)為 false。
如下設(shè)置 lazy 連接方式媳荒,將 lazy 屬性設(shè)為 true抗悍。目前支持 bolt 和 dubbo 協(xié)議驹饺。
<sofa:reference id="lazyServiceReferenceBolt" interface="com.ostenant.sofa.rpc.example.lazy.LazyService">
<sofa:binding.bolt>
<sofa:global-attrs lazy="true"/>
</sofa:binding.bolt>
</sofa:reference>
- check 屬性
默認(rèn)情況下客戶端在啟動(dòng)時(shí),服務(wù)引用不要求存在可用的地址和連接缴渊。如果設(shè)置服務(wù)引用的屬性 check 為 true赏壹,客戶端在啟動(dòng)時(shí),服務(wù)引用會(huì)檢查是否存在對(duì)應(yīng)的地址和連接衔沼,如果不存在會(huì)拋出異常蝌借。默認(rèn)為 false。
如下設(shè)置 check 連接方式指蚁,將 check 屬性設(shè)為 true菩佑。目前支持 bolt 和 dubbo 協(xié)議。
<sofa:reference id="checkServiceReferenceBolt" interface="com.ostenant.sofa.rpc.example.check.CheckService">
<sofa:binding.bolt>
<sofa:global-attrs check="true"/>
</sofa:binding.bolt>
</sofa:reference>
- 重試次數(shù)
重試次數(shù)欣舵,即在第一次調(diào)用失敗后重試的最大次數(shù)擎鸠,如果重試成功則不再繼續(xù)重試。默認(rèn)為 0缘圈。如下設(shè)置調(diào)用次數(shù),利用 retries 屬性指定重試次數(shù)袜蚕。目前支持 bolt 和 dubbo 協(xié)議糟把。
<sofa:reference id="retriesServiceReferenceBolt" interface="com.ostenant.sofa.rpc.example.retries.RetriesService">
<sofa:binding.bolt>
<sofa:global-attrs retries="2"/>
</sofa:binding.bolt>
</sofa:reference>
- 負(fù)載均衡
如下選擇負(fù)載均衡的方式,利用 loadBalancer 屬性指定調(diào)用時(shí)候使用的負(fù)載均衡策略牲剃,默認(rèn)為 random遣疯。
目前支持 random,localPref凿傅,roundRobin缠犀,consistentHash,weightRoundRobin 五種負(fù)載均衡策略聪舒,具體可見 SOFARPC 負(fù)載均衡相關(guān)介紹辨液。目前支持bolt協(xié)議。
<sofa:reference id="loadBalancerServiceReference" interface="com.ostenant.sofa.rpc.example.loadBalancer.LoadBalancerService">
<sofa:binding.bolt>
<sofa:global-attrs loadBalancer="random"/>
</sofa:binding.bolt>
</sofa:reference>
- 方法級(jí)別配置
如下箱残,sofa:method 元素是方法級(jí)別的配置滔迈。方法級(jí)別的配置優(yōu)先級(jí)比服務(wù)級(jí)別的更高。name 屬性指定了方法的名字被辑。支持調(diào)用超時(shí)時(shí)間燎悍,調(diào)用方式,回調(diào)類的設(shè)置盼理。方法級(jí)別的配置與服務(wù)級(jí)別的配置所生效的協(xié)議一樣谈山。
<sofa:binding.bolt>
<sofa:method name="sayMethod" timeout="3000" type="sync" callback-ref="xxx"/>
</sofa:binding.bolt>
Properties 配置
屬性 | 描述 | 默認(rèn)值 | |
---|---|---|---|
spring.application.name | 應(yīng)用名 | ||
logging.path | 日志路徑 | ||
logging.level.com.alipay.sofa.rpc.boot | sofa-rpc-boot-start的日志級(jí)別(starter自身的日志) | info | |
logging.level.com.alipay.sofa.rpc | sofa-rpc的日志級(jí)別(sofa-rpc核心日志基本在這里) | info | |
com.alipay.sofa.rpc.bolt.port | bolt 端口 | 22000 | |
com.alipay.sofa.rpc.bolt.io.thread.count | bolt 的 io 線程數(shù) | ||
com.alipay.sofa.rpc.bolt.executor.thread.count | bolt 的業(yè)務(wù)線程最大值 | 200 | |
com.alipay.sofa.rpc.bolt.accepts.count | bolt 能夠支持的最大長(zhǎng)連接數(shù) | 100000 | |
com.alipay.sofa.rpc.rest.hostname | rest 的 hostname | ||
com.alipay.sofa.rpc.rest.port | rest 端口 | 8341 | |
com.alipay.sofa.rpc.rest.io.thread.count | rest 的 io 線程數(shù) | cpu 核數(shù) * 2 | |
com.alipay.sofa.rpc.rest.executor.thread.count | rest 的業(yè)務(wù)線程數(shù) | 200 | |
com.alipay.sofa.rpc.rest.max.request.size | rest 的最大 byte 請(qǐng)求長(zhǎng)度 | 1024 * 1024 * 10 | |
com.alipay.sofa.rpc.rest.telnet | rest 是否支持 telnet | true | |
com.alipay.sofa.rpc.rest.daemon | rest 是否支持 daemon | true | |
com.alipay.sofa.rpc.dubbo.port | dubbo 的端口 | 20880 | |
com.alipay.sofa.rpc.dubbo.io.thread.count | dubbo 的 io 線程數(shù) | cpu 核數(shù) + 1 | |
com.alipay.sofa.rpc.dubbo.executor.thread.count | dubbo 的業(yè)務(wù)線程數(shù) | 100 | |
com.alipay.sofa.rpc.dubbo.accepts.count | dubbo能夠支持的最大長(zhǎng)連接數(shù) | 0,表示不限制 |
2. 自定義線程池
SOFA-RPC 支持自定義業(yè)務(wù)線程池宏怔∽嗦罚可以為指定服務(wù)設(shè)置一個(gè)獨(dú)立的業(yè)務(wù)線程池畴椰,和 SOFA-RPC 自身的業(yè)務(wù)線程池是隔離的,多個(gè)服務(wù)可以共用一個(gè)獨(dú)立的線程池思劳。目前支持 bolt 協(xié)議迅矛。
在 SOFA-Boot 環(huán)境中可以為一個(gè)服務(wù)設(shè)置一個(gè)自定義線程池,配置如下:
- 聲明自定義線程池
如下聲明一個(gè)自定義線程池潜叛,class
必須為 com.alipay.sofa.rpc.server.UserThreadPool
秽褒,這是 SOFA-RPC
提供的類,init-method="init"
也必須聲明以進(jìn)行初始化威兜。
<bean id="customerThreadPool" class="com.alipay.sofa.rpc.server.UserThreadPool" init-method="init">
<property name="corePoolSize" value="10"/>
<property name="maximumPoolSize" value="10"/>
<property name="queueSize" value="5"/>
<property name="threadPoolName" value="customerThreadPool_name"/>
</bean>
- 為服務(wù)設(shè)置自定義線程池
如下通過 sofa:global-attrs
元素的 thread-pool-ref
屬性為該服務(wù)設(shè)置自定義線程池销斟。customerThreadPool
是上面自定義線程池的 bean id
。
<bean id="threadPoolServiceImpl" class="com.ostenant.sofa.rpc.example.threadpool.ThreadPoolServiceImpl"/>
<sofa:service ref="threadPoolServiceImpl" interface="com.alipay.sofa.rpc.samples.threadpool.ThreadPoolService">
<sofa:binding.bolt>
<sofa:global-attrs thread-pool-ref="customerThreadPool"/>
</sofa:binding.bolt>
</sofa:service>
3. 預(yù)熱權(quán)重
SOFA-RPC 提供了預(yù)熱權(quán)重功能讓客戶端機(jī)器能夠根據(jù)服務(wù)端的相應(yīng)權(quán)重進(jìn)行流量的分發(fā)椒舵。目前支持 bolt 協(xié)議蚂踊。
SOFA-Boot 中提供了一系列參數(shù)屬性,對(duì)指定服務(wù)進(jìn)行預(yù)熱配置笔宿±缰樱客戶端機(jī)器能夠自動(dòng)解析這些參數(shù),并按權(quán)重進(jìn)行流量分發(fā)泼橘。
- warm-up-time: 服務(wù)的預(yù)熱時(shí)間
- warm-up-weight: 服務(wù)設(shè)置預(yù)熱期間權(quán)重
- weight: 服務(wù)設(shè)置預(yù)熱完后的權(quán)重
<sofa:reference id="sampleRestFacadeReferenceBolt" interface="com.alipay.sofa.endpoint.facade.SampleFacade">
<sofa:binding.bolt>
<sofa:global-attrs warm-up-time="10000" warm-up-weight="10" weight="100"/>
</sofa:binding.bolt>
</sofa:reference>
上述配置中涝动,該服務(wù)的預(yù)熱期為10s,在預(yù)熱期內(nèi)權(quán)重為10炬灭,預(yù)熱期結(jié)束后的正常權(quán)重為100醋粟。
如果該服務(wù)一共發(fā)布到A,B兩個(gè)機(jī)器上重归。A機(jī)器正處于預(yù)熱期內(nèi)米愿,使用上述配置;B已經(jīng)完成預(yù)熱鼻吮,正常權(quán)重為200育苟。那么客戶端在調(diào)用的時(shí)候,此時(shí)流量分發(fā)的比重為10:200狈网;A機(jī)器預(yù)熱結(jié)束后宙搬,流量分發(fā)比重為100:200。
4. 自動(dòng)故障剔除
自動(dòng)故障剔除會(huì)自動(dòng)監(jiān)控 RPC 調(diào)用的情況拓哺,對(duì)故障節(jié)點(diǎn)進(jìn)行權(quán)重降級(jí)勇垛,并在節(jié)點(diǎn)恢復(fù)健康時(shí)進(jìn)行權(quán)重恢復(fù)。目前支持 bolt 協(xié)議士鸥。
在 SOFA-Boot 中闲孤,只需要將自動(dòng)故障剔除的參數(shù)配置到 application.properties
即可。只配置自己關(guān)心的參數(shù),其余參數(shù)會(huì)取默認(rèn)值讼积。需要注意的是肥照,rpc.aft.regulation.effective
是該功能的全局開關(guān),如果關(guān)閉則該功能不會(huì)運(yùn)行勤众,其他參數(shù)也都不生效舆绎。
- 自動(dòng)故障剔除的配置參數(shù)意義
屬性 | 描述 | 默認(rèn)值 | ||
---|---|---|---|---|
com.alipay.sofa.rpc.aft.time.window | 時(shí)間窗口大小:對(duì)統(tǒng)計(jì)信息計(jì)算的周期们颜。 | 10s | ||
com.alipay.sofa.rpc.aft.least.window.count | 時(shí)間窗口內(nèi)最少調(diào)用數(shù):只有在時(shí)間窗口內(nèi)達(dá)到了該最低值的數(shù)據(jù)才會(huì)被加入到計(jì)算和調(diào)控中吕朵。 | 10次 | ||
com.alipay.sofa.rpc.aft.least.window.exception.rate.multiple | 時(shí)間窗口內(nèi)異常率與服務(wù)平均異常率的降級(jí)比值:在對(duì)統(tǒng)計(jì)信息進(jìn)行計(jì)算的時(shí)候,會(huì)計(jì)算出該服務(wù)所有有效調(diào)用ip的平均異常率窥突,如果某個(gè)ip的異常率大于等于了這個(gè)最低比值努溃,則會(huì)被降級(jí)。 | 6倍 | ||
com.alipay.sofa.rpc.aft.weight.degrade.rate | 降級(jí)比率:地址在進(jìn)行權(quán)重降級(jí)時(shí)的降級(jí)比率阻问。 | 1/20 | ||
com.alipay.sofa.rpc.aft.weight.recover.rate | 恢復(fù)比率:地址在進(jìn)行權(quán)重恢復(fù)時(shí)的恢復(fù)比率梧税。 | 2倍 | ||
com.alipay.sofa.rpc.aft.degrade.effective | 降級(jí)開關(guān):如果應(yīng)用打開了這個(gè)開關(guān),則會(huì)對(duì)符合降級(jí)的地址進(jìn)行降級(jí)称近,否則只會(huì)進(jìn)行日志打印第队。 | false(關(guān)閉) | ||
com.alipay.sofa.rpc.aft.degrade.least.weight | 降級(jí)最小權(quán)重:地址權(quán)重被降級(jí)后的值如果小于這個(gè)最小權(quán)重,則會(huì)以該最小權(quán)重作為降級(jí)后的值刨秆。 | 0 | ||
com.alipay.sofa.rpc.aft.degrade.max.ip.count | 降級(jí)的最大ip數(shù):同一個(gè)服務(wù)被降級(jí)的ip數(shù)不能超過該值斥铺。 | 2 | ||
com.alipay.sofa.rpc.aft.regulation.effective | 全局開關(guān):如果應(yīng)用打開了這個(gè)開關(guān),則會(huì)開啟整個(gè)單點(diǎn)故障自動(dòng)剔除摘除功能坛善,否則完全不進(jìn)入該功能的邏輯。 | false(關(guān)閉) |
- 配置示例
com.alipay.sofa.rpc.aft.time.window=20
com.alipay.sofa.rpc.aft.least.window.count=30
com.alipay.sofa.rpc.aft.least.window.exception.rate.multiple=6
com.alipay.sofa.rpc.aft.weight.degrade.rate=0.5
com.alipay.sofa.rpc.aft.weight.recover.rate=1.2
com.alipay.sofa.rpc.aft.degrade.effective=ture
com.alipay.sofa.rpc.aft.degrade.least.weight=1
com.alipay.sofa.rpc.aft.degrade.max.ip.count=2
com.alipay.sofa.rpc.aft.regulation.effective=true
上述配置中邻眷,默認(rèn)打開了自動(dòng)故障剔除功能和降級(jí)開關(guān)眠屎。當(dāng)節(jié)點(diǎn)出現(xiàn)故障時(shí)會(huì)被進(jìn)行權(quán)重降級(jí),在恢復(fù)時(shí)會(huì)被進(jìn)行權(quán)重恢復(fù)肆饶。
每隔 20s 進(jìn)行一次節(jié)點(diǎn)健康狀態(tài)的度量改衩,20s 內(nèi)調(diào)用次數(shù)超過 30 次的節(jié)點(diǎn)才被作為計(jì)算數(shù)據(jù)。
如果單個(gè)節(jié)點(diǎn)的異常率超過了所有節(jié)點(diǎn)的平均異常率的 6 倍驯镊,則對(duì)該節(jié)點(diǎn)進(jìn)行權(quán)重降級(jí)葫督,降級(jí)的比率為 0.5。權(quán)重最小降級(jí)到 1板惑。如果單個(gè)節(jié)點(diǎn)的異常率低于了平均異常率的 6 倍橄镜,則對(duì)該節(jié)點(diǎn)進(jìn)行權(quán)重恢復(fù),恢復(fù)的比率為1.2冯乘。單個(gè)服務(wù)最多降級(jí) 2 個(gè) IP洽胶。
小結(jié)
本文介紹了 SOFA-RPC
的高級(jí)功能,包括參數(shù)配置裆馒,自定義線程池姊氓,服務(wù)預(yù)熱和自動(dòng)降級(jí)與權(quán)重恢復(fù)等用法丐怯。對(duì)于 SOFA-RPC
提供的基本功能,以及整合 SOFA-Boot
的配置和用法就介紹完了翔横。對(duì)此有了初步的認(rèn)識(shí)后读跷,有利于后續(xù)深入實(shí)現(xiàn)原理和剖析源碼。
歡迎關(guān)注技術(shù)公眾號(hào): 零壹技術(shù)棧
本帳號(hào)將持續(xù)分享后端技術(shù)干貨禾唁,包括虛擬機(jī)基礎(chǔ)效览,多線程編程,高性能框架蟀俊,異步钦铺、緩存和消息中間件,分布式和微服務(wù)肢预,架構(gòu)學(xué)習(xí)和進(jìn)階等學(xué)習(xí)資料和文章矛洞。