架構實戰項目心得(八):dubbo知識的整理

1 Dubbo啓動時檢查、集羣容錯、負載均衡、線程模型的設置以及選項:
    啓動時檢查
(1)Dubbo默認會在啓動的時候檢查依賴的服務是否可用,不可用時會拋出異常。阻止Spring初始化完成。以便上線時能及早發現問題。
(2)默認check="true"dubbo.properties可以直接配置:dubbo.reference.check=false,強制改變所有reference的check值,就算配置中有聲明,也會被覆蓋。

    集羣容錯

在集羣調用失敗時,Dubbo提供了多鍾容錯方案,默認爲failover重試。
(1)Failover Cluster: 失敗自動切換,當出現失敗,重試其他服務器。通常用於讀操作,但重試會帶來更長延遲。可通過retries="2" 來設置重試次數(不包含第一次) 
(2)Failfast Cluster: 快速失敗,只發起一次調用,失敗立即報錯。通常用於非冪等寫的操作,比如新增記錄。 
(3)Failsafe Cluster: 失敗安全,出現異常時,直接忽略,通常用於寫入審計日誌等操作。 
(4)Failback Cluster: 失敗自動恢復,後臺記錄失敗請求,定時重發,通常用於消息通知操作。 
(5)Forking Cluster: 並行調用多個服務器,只要一個成功即返回,通常用於實時性要求較高的讀操作,但是要浪費更多的服務資源。可通過forks="2" 來設置最大並行數。 
(6)Broadcast Cluster: 廣播調用所有提供者,這個調用,任意一臺報錯即報錯,通常用於通知所有提供者更新緩存日誌等本地資源信息。 
 
    負載均衡
在集羣負載均衡時,Dubbo提供了多種均衡策略,默認爲random隨機調用。 
(1)Random Loadbalance:隨機,按權重設置隨機概率,在一個截面上碰撞的概率高,但調用量越大分佈越均勻,而且按概率使用權重後也比較均勻,有利於動態調整提供者權重 
(2)RoundRobin Loadbalance:輪詢,按公約後的權重設置輪詢比例。存在慢的提供者累積請求的問題,比如:第二臺機器很慢,但沒掛,當請求調到第二臺時就卡那,久而久之,所有請求都會卡在調到第二臺上。 
(3)LeastActive Loadbalance:最少活躍調用數,相同活躍數的隨機,活躍數是指調用前後計數差,慢的提供者收到更少請求,因爲越慢的提供者調用前後計數差會越大 
(4)ConsistentHash Loadbalance: 一致性Hash,相同參數的請求總是發到同一提供者,當某一臺提供者掛時,原本發往該提供者的請求,基於虛擬節點,平攤到其他提供者,不會引起劇烈變動。 

    線程模型
如果事件處理的邏輯能迅速完成,並且不會發起新的IO請求,比如只是在內存中記一個標識,則直接在IO線程上處理更快,因爲減少了線程池調度。 
但如果事件處理邏輯較慢,或者需要發起新的IO請求,比如需要查詢數據庫,則必須派發到線程池,否則IO線程阻塞,將導致不能接收其它請求。 
Dispatcher
(1)all 所有消息都派發到線程池,包括請求,響應,連接事件,斷開事件,心跳等。 
(2)direct 所有消息都不派發到線程池,全部在IO線程上直接執行。
(3)message 只有請求響應消息派發到線程池,其它連接斷開事件、心跳等消息,直接在IO線程上執行。
(4)execution 只請求消息派發到線程池,不含響應,響應和其它連接斷開事件、心跳等消息,直接在IO線程上執行。 
(5)connection 在IO線程上,將連接斷開事件放入隊列,有序逐個執行,其它消息派發到線程池。
ThreadPool 
(1)fixed 固定大小線程池,啓動時建立線程,不關閉,一直持有。(默認) 
(2)cached 緩存線程池,空閒一分鐘自動刪除,需要時重連。 
(3)limited 可伸縮線程池,但池中的線程數只會增長不會收縮。只增長不收縮的目的是爲了避免收縮時突然來了大流量引起的性能問題。 配置方式如下: 
<dubbo:protocol name="test" contextpath="xxx-web-service" port="8080" server="servlet" dispatcher="all" threads="100" />
2 Dubbo直連、只訂閱、只註冊:
直連
    在開發及測試環境下,經常需要繞過註冊中心,只測試指定的服務提供者,這時候可能需要點對點直連,點對點直連方式,將以服務接口爲單位,忽略註冊中心的提供者列表,A接口配置點對點,不影響B接口從註冊中心獲取列表。
    如果是線上需求需要點對點,可在<dubbo:reference>中配置url指向提供者,將繞過註冊中心,多個地址用分號隔開,配置如下:
<dubbo:reference interface="com.laowang.service.IUserService" id="userService" timeout="10000" check="false" url="dubbo://localhost:2181" />
只訂閱
<dubbo:registry address="zookeeper://localhost:2181" registry="false" />
只註冊
    如果有兩個鏡像環境,兩個註冊中心,有一個服務只在其中一個註冊中心有部署,另一個註冊中心還沒來得及部署,而兩個註冊中心的其他應用都需要依賴此服務。這個時候,可以讓服務提供方只註冊服務到另一個註冊中心,而不從另一註冊中心訂閱服務。
<dubbo:registry id="hzRegistry" address="zookeeper://192.168.1.131:2181" />
<dubbo:registry id="qdRegistry" address="zookeeper://192.168.1.130:2181" subscribe="false" />
3 協議選擇:

    dubbo://

   默認協議採用單一長連和NIO異步通訊,適合於小數據量大併發的服務調用,以及服務消費機器數遠大於服務提供者機器數的情況。  dubbo 默認協議不適合傳大數據量的服務,比如傳文件,傳視頻等,除非請求量很低。

<dubbo:protocol name="dubbo" port="20884" />
連接個數:單連接
連接方式:長連接
傳輸協議:TCP
傳輸方式:NIO異步傳輸
序列化:Hessian二進制序列化
適用範圍:傳入傳出參數數據包較小(建議小於100k),消費者比提供者個數多,單一消費者無法壓滿提供者,儘量不要用dubbo協議傳輸大文件或超大字符。
適用場景:常規遠程服務方法調用

    rmi://

    RMI協議採用JDK標準的java.rmi.*實現,採用阻塞式短連接和JDK標準序列化方式。
 
<dubbo:protocol name="rmi" port="1099" />			
連接個數:多連接
連接方式:短連接
傳輸協議:TCP
傳輸方式:同步傳輸
序列化:JAVA標準二進制序列化
適用範圍:傳入傳出參數數據包大小混合,消費者與提供者個數差不多,可傳文件。
適用場景:常規遠程服務方法調用,與原生RMI服務互操作
    Hessian://

    Hessian協議用於集成Hessian服務,Hessian底層採用Http通訊,採用Servlet暴露服務,Dubbo默認內嵌Jetty作爲服務器實現。

<dubbo:protocol name="Hessian" port="8080" server="jetty" />
連接個數:多連接
連接方式:短連接
傳輸協議:HTTP
傳輸方式:同步傳輸
序列化:Hessian二進制序列化
適用範圍:傳入傳出參數數據包較大,提供者比消費者個數多,提供者壓力較大,可傳文件。
適用場景:頁面傳輸,文件傳輸,或與原生Hessian服務互操作。
    依賴:
<dependency>
	<groupId>com.caucho</groupId>
	<artifactId>hessian</artifactId>
	<version>4.0.7</version>
</dependency>
    傳統SpringMVC項目中的web.xml配置:
<servlet>
	<servlet-name>dubbo</servlet-name>
	<servlet-class>com.alibaba.dubbo.remoting.http.servlet.DispatcherServlet</servlet-class>
	<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
	<servlet-name>dubbo</servlet-name>
	<url-pattern>/*<url-pattern>
</servlet-mapping>
    http://
採用Spring的HttpInvoker實現
<dubbo:protocol name="http" port="8080"/>
連接個數:多連接
連接方式:短連接
傳輸協議:HTTP
傳輸方式:同步傳輸
序列化:表單序列化
適用範圍:傳入傳出參數數據包大小混合,提供者比消費者個數多,可用表單或URL傳入參數,暫不支持傳文件。
適用場景:需同時給應用程序和瀏覽器JS使用的服務。
    webservice://
    2.3.0以上版本支持,基於CXF的frontend-simple和transports-http實現。 
<dubbo:protocol name="webservice" port="8080" server="jetty" />
依賴
<dependency>
	<groupId>org.apache.cxf</groupId>
	<artifactId>cxf-rt-frontend-simple</artifactId>
	<version>2.6.1</version>
</dependency>
<dependency>
	<groupId>org.apache.cxf</groupId>
	<artifactId>cxf-rt-transports-http</artifactId>
	<version>2.6.1</version>		
</dependency>	
連接個數:多連接
連接方式:短連接
傳輸協議:HTTP
傳輸方式:同步傳輸
序列化:SOAP文本序列化
適用場景:系統集成,跨語言調用。
    thrift://

    thrift說明:thrift是Facebook捐給Apache的一個RPC框架

     依賴:

<dependency>
    <groupId>org.apache.thrift</groupId>
    <artifactId>libthrift</artifactId>
    <version>0.8.0</version>
</dependency>
<dubbo:protocol name="thrift" port="3030" />
    memcached://
    memcached說明:memcached是一個高效的KV緩存服務器
    redis://
    redis說明:redis是一個高效的KV存儲服務器。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章