上文介紹了SOFA-RPC 的幾種調用方式,包括單向調用、同步調用、Future調用、回調,引入了泛化調用和過濾器。本文將對 SOFA-RPC 的高級功能,包括參數配置、自定義線程池、預熱權重和自動故障剔除等。算法
螞蟻金服RPC框架SOFA-RPC初體驗 spring
SOFABoot RPC Starter
提供了方便的參數設置方式。這些參數目前能夠分爲兩個部分。一部分是如端口,註冊中心地址等配置,這類配置在 application.properties
中。另外一部分是如超時時間等配置,這類配置在 XML
中。多線程
以下是設置超時時間的方式,單位爲 ms ,若是調用超過了這個時間則會拋出異常。服務端和客戶端均可以設置,以客戶端的超時時間設置優先。默認客戶端爲 3000 ,目前對 bolt,rest,dubbo 生效。架構
<sofa:binding.bolt>
<sofa:global-attrs timeout="5000"/>
</sofa:binding.bolt>
複製代碼
以下是設置獲取地址等待時間,單位爲ms。在啓動時若是服務引用方等待超過了這個時間則不會再等待地址,會繼續啓動。客戶端設置,默認爲-1,表示會一直等待到地址爲止。目前對 bolt,rest 生效。app
<sofa:binding.bolt>
<sofa:global-attrs address-wait-time="30000"/>
</sofa:binding.bolt>
複製代碼
以下是設置創建鏈接超時時間,單位爲 ms 。在創建鏈接時若是耗時超過了這個時間則會拋出異常。客戶端設,默認爲 5000。目前對 bolt,rest 生效。負載均衡
<sofa:binding.bolt>
<sofa:global-attrs connect.timeout="30000"
</sofa:binding.bolt>
複製代碼
以下是設置權重。客戶端在發起調用時,若是採用的算法是隨機調用,則會根據該權重來進行隨機。服務端設置,默認爲 100。目前對 bolt 生效。框架
<sofa:binding.bolt>
<sofa:global-attrs weight="200"/>
</sofa:binding.bolt>
複製代碼
默認狀況下客戶端在註冊中心推送地址到客戶端時,就當即創建好鏈接,這個過程一般是在第一次調用以前進行的。若是設置服務引用的屬性 lazy 爲 true,客戶端在第一次調用時才和所要調用的遠程地址創建鏈接。默認爲 false。
以下設置 lazy 鏈接方式,將 lazy 屬性設爲 true。目前支持 bolt 和 dubbo 協議。
<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 爲 true,客戶端在啓動時,服務引用會檢查是否存在對應的地址和鏈接,若是不存在會拋出異常。默認爲 false。
以下設置 check 鏈接方式,將 check 屬性設爲 true。目前支持 bolt 和 dubbo 協議。
<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>
複製代碼
重試次數,即在第一次調用失敗後重試的最大次數,若是重試成功則再也不繼續重試。默認爲 0。以下設置調用次數,利用 retries 屬性指定重試次數。目前支持 bolt 和 dubbo 協議。
<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>
複製代碼
以下選擇負載均衡的方式,利用 loadBalancer 屬性指定調用時候使用的負載均衡策略,默認爲 random。
目前支持 random,localPref,roundRobin,consistentHash,weightRoundRobin 五種負載均衡策略,具體可見 SOFARPC 負載均衡相關介紹。目前支持bolt協議。
<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>
複製代碼
以下,sofa:method 元素是方法級別的配置。方法級別的配置優先級比服務級別的更高。name 屬性指定了方法的名字。支持調用超時時間,調用方式,回調類的設置。方法級別的配置與服務級別的配置所生效的協議同樣。
<sofa:binding.bolt>
<sofa:method name="sayMethod" timeout="3000" type="sync" callback-ref="xxx"/>
</sofa:binding.bolt>
複製代碼
屬性 | 描述 | 默認值 |
---|---|---|
spring.application.name | 應用名 | |
logging.path | 日誌路徑 | |
logging.level.com.alipay.sofa.rpc.boot | sofa-rpc-boot-start的日誌級別(starter自身的日誌) | info |
logging.level.com.alipay.sofa.rpc | sofa-rpc的日誌級別(sofa-rpc核心日誌基本在這裏) | info |
com.alipay.sofa.rpc.bolt.port | bolt 端口 | 22000 |
com.alipay.sofa.rpc.bolt.io.thread.count | bolt 的 io 線程數 | |
com.alipay.sofa.rpc.bolt.executor.thread.count | bolt 的業務線程最大值 | 200 |
com.alipay.sofa.rpc.bolt.accepts.count | bolt 可以支持的最大長鏈接數 | 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 線程數 | cpu 核數 * 2 |
com.alipay.sofa.rpc.rest.executor.thread.count | rest 的業務線程數 | 200 |
com.alipay.sofa.rpc.rest.max.request.size | rest 的最大 byte 請求長度 | 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 線程數 | cpu 核數 + 1 |
com.alipay.sofa.rpc.dubbo.executor.thread.count | dubbo 的業務線程數 | 100 |
com.alipay.sofa.rpc.dubbo.accepts.count | dubbo可以支持的最大長鏈接數 | 0,表示不限制 |
SOFA-RPC 支持自定義業務線程池。能夠爲指定服務設置一個獨立的業務線程池,和 SOFA-RPC 自身的業務線程池是隔離的,多個服務能夠共用一個獨立的線程池。目前支持 bolt 協議。
在 SOFA-Boot 環境中能夠爲一個服務設置一個自定義線程池,配置以下:
以下聲明一個自定義線程池,class
必須爲 com.alipay.sofa.rpc.server.UserThreadPool
,這是 SOFA-RPC
提供的類,init-method="init"
也必須聲明以進行初始化。
<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>
複製代碼
以下經過 sofa:global-attrs
元素的 thread-pool-ref
屬性爲該服務設置自定義線程池。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>
複製代碼
SOFA-RPC 提供了預熱權重功能讓客戶端機器可以根據服務端的相應權重進行流量的分發。目前支持 bolt 協議。
SOFA-Boot 中提供了一系列參數屬性,對指定服務進行預熱配置。客戶端機器可以自動解析這些參數,並按權重進行流量分發。
<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>
複製代碼
上述配置中,該服務的預熱期爲10s,在預熱期內權重爲10,預熱期結束後的正常權重爲100。
若是該服務一共發佈到A,B兩個機器上。A機器正處於預熱期內,使用上述配置;B已經完成預熱,正常權重爲200。那麼客戶端在調用的時候,此時流量分發的比重爲10:200;A機器預熱結束後,流量分發比重爲100:200。
自動故障剔除會自動監控 RPC 調用的狀況,對故障節點進行權重降級,並在節點恢復健康時進行權重恢復。目前支持 bolt 協議。
在 SOFA-Boot 中,只須要將自動故障剔除的參數配置到 application.properties
便可。只配置本身關心的參數,其他參數會取默認值。須要注意的是,rpc.aft.regulation.effective
是該功能的全局開關,若是關閉則該功能不會運行,其餘參數也都不生效。
屬性 | 描述 | 默認值 |
---|---|---|
com.alipay.sofa.rpc.aft.time.window | 時間窗口大小:對統計信息計算的週期。 | 10s |
com.alipay.sofa.rpc.aft.least.window.count | 時間窗口內最少調用數:只有在時間窗口內達到了該最低值的數據纔會被加入到計算和調控中。 | 10次 |
com.alipay.sofa.rpc.aft.least.window.exception.rate.multiple | 時間窗口內異常率與服務平均異常率的降級比值:在對統計信息進行計算的時候,會計算出該服務全部有效調用ip的平均異常率,若是某個ip的異常率大於等於了這個最低比值,則會被降級。 | 6倍 |
com.alipay.sofa.rpc.aft.weight.degrade.rate | 降級比率:地址在進行權重降級時的降級比率。 | 1/20 |
com.alipay.sofa.rpc.aft.weight.recover.rate | 恢復比率:地址在進行權重恢復時的恢復比率。 | 2倍 |
com.alipay.sofa.rpc.aft.degrade.effective | 降級開關:若是應用打開了這個開關,則會對符合降級的地址進行降級,不然只會進行日誌打印。 | false(關閉) |
com.alipay.sofa.rpc.aft.degrade.least.weight | 降級最小權重:地址權重被降級後的值若是小於這個最小權重,則會以該最小權重做爲降級後的值。 | 0 |
com.alipay.sofa.rpc.aft.degrade.max.ip.count | 降級的最大ip數:同一個服務被降級的ip數不能超過該值。 | 2 |
com.alipay.sofa.rpc.aft.regulation.effective | 全局開關:若是應用打開了這個開關,則會開啓整個單點故障自動剔除摘除功能,不然徹底不進入該功能的邏輯。 | false(關閉) |
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
複製代碼
上述配置中,默認打開了自動故障剔除功能和降級開關。當節點出現故障時會被進行權重降級,在恢復時會被進行權重恢復。
每隔 20s 進行一次節點健康狀態的度量,20s 內調用次數超過 30 次的節點才被做爲計算數據。
若是單個節點的異常率超過了全部節點的平均異常率的 6 倍,則對該節點進行權重降級,降級的比率爲 0.5。權重最小降級到 1。若是單個節點的異常率低於了平均異常率的 6 倍,則對該節點進行權重恢復,恢復的比率爲1.2。單個服務最多降級 2 個 IP。
本文介紹了 SOFA-RPC
的高級功能,包括參數配置,自定義線程池,服務預熱和自動降級與權重恢復等用法。對於 SOFA-RPC
提供的基本功能,以及整合 SOFA-Boot
的配置和用法就介紹完了。對此有了初步的認識後,有利於後續深刻實現原理和剖析源碼。
歡迎關注技術公衆號: 零壹技術棧
本賬號將持續分享後端技術乾貨,包括虛擬機基礎,多線程編程,高性能框架,異步、緩存和消息中間件,分佈式和微服務,架構學習和進階等學習資料和文章。