螞蟻金服SOFA-Boot整合SOFA-RPC(下篇)

零壹技術棧發表於2018-08-30

前言

上文介紹了SOFA-RPC 的幾種呼叫方式,包括單向呼叫、同步呼叫、Future呼叫、回撥,引入了泛化呼叫和過濾器。本文將對 SOFA-RPC 的高階功能,包括引數配置、自定義執行緒池、預熱權重和自動故障剔除等。

螞蟻金服SOFA-Boot整合SOFA-RPC(下篇)

其他文章

正文

1. 引數配置

SOFABoot RPC Starter 提供了方便的引數設定方式。這些引數目前可以分為兩個部分。一部分是如埠,註冊中心地址等配置,這類配置在 application.properties 中。另一部分是如超時時間等配置,這類配置在 XML 中。

XML 配置

  • 呼叫超時時間

如下是設定超時時間的方式,單位為 ms ,如果呼叫超過了這個時間則會丟擲異常。服務端和客戶端都可以設定,以客戶端的超時時間設定優先。預設客戶端為 3000 ,目前對 bolt,rest,dubbo 生效。

<sofa:binding.bolt>
    <sofa:global-attrs timeout="5000"/>
</sofa:binding.bolt>
複製程式碼
  • 獲取地址等待時間

如下是設定獲取地址等待時間,單位為ms。在啟動時如果服務引用方等待超過了這個時間則不會再等待地址,會繼續啟動。客戶端設定,預設為-1,表示會一直等待到地址為止。目前對 bolt,rest 生效。

<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 連線

預設情況下客戶端在註冊中心推送地址到客戶端時,就立即建立好連線,這個過程通常是在第一次呼叫之前進行的。如果設定服務引用的屬性 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 屬性

預設情況下客戶端在啟動時,服務引用不要求存在可用的地址和連線。如果設定服務引用的屬性 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>
複製程式碼

Properties 配置

屬性 描述 預設值
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,表示不限制

2. 自定義執行緒池

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>
複製程式碼

3. 預熱權重

SOFA-RPC 提供了預熱權重功能讓客戶端機器能夠根據服務端的相應權重進行流量的分發。目前支援 bolt 協議。

SOFA-Boot 中提供了一系列引數屬性,對指定服務進行預熱配置。客戶端機器能夠自動解析這些引數,並按權重進行流量分發。

  • warm-up-time: 服務的預熱時間
  • warm-up-weight: 服務設定預熱期間權重
  • weight: 服務設定預熱完後的權重
<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。

4. 自動故障剔除

自動故障剔除會自動監控 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 的配置和用法就介紹完了。對此有了初步的認識後,有利於後續深入實現原理和剖析原始碼。


歡迎關注技術公眾號: 零壹技術棧

image

本帳號將持續分享後端技術乾貨,包括虛擬機器基礎,多執行緒程式設計,高效能框架,非同步、快取和訊息中介軟體,分散式和微服務,架構學習和進階等學習資料和文章。

相關文章