dubbox介紹、流程、原理、soa治理、集群


遠程服務調用的分布式框架,高性能透明化PRC 遠程服務調用。SOA服務治理。

特征
1、透明化遠程方法調用:像調用本地方法一樣調用遠程方法,只需簡單的配置,沒有任何API侵入。
2、軟負載均衡和容錯機制。
3、服務自動注冊於發現,不需要寫死服務提供方的地址。

dubbox工作流程
節點角色
provider:暴露服務的服務提供方 Service
Consumer:調用遠程服務的服務消費方:controller
Registry:服務注冊和發現中心
  zookeeper(官方推薦)、redis、廣播機制、Simple
Monitor:統計服務的調用次數和調用事件的監控中心。dubbox提供監控中心的war包。
Container:服務運行容器
  service:spring容器
  controller:SpringMVC容器

調用關系說明:
  0. 服務容器負責啟動,加載,運行服務提供者。
  1. 服務提供者在啟動時,向注冊中心注冊自己提供的服務。
  2. 服務消費者在啟動時,向注冊中心訂閱自己所需的服務。
  3. 注冊中心返回服務提供者地址列表給消費者,如果有變更,注冊中心將基於長連接推
   送變更數據給消費者。
  4. 服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一台提供者進行調用,
   如果調用失敗,再選另一台調用。
  5. 服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鍾發送一次統計
   數據到監控中心。
Dubbox默認請求時間是1000ms,請求三次.所以在需要較多業務加載的情況下,可以設置請求超時時間.

dubbox的工作原理

說明:dubbox底層分為10層,每層作用如下  
第一層:service層,接口層,給服務提供者和消費者來實現的  
第二層:config層,配置層,主要是對dubbo進行各種配置的  
第三層:proxy層,服務代理層,透明生成客戶端的stub和服務單的skeleton  
第四層:registry層,服務注冊層,負責服務的注冊與發現  
第五層:cluster層,集群層,封裝多個服務提供者的路由以及負載均衡,將多個實例組合成一個服務  
第六層:monitor層,監控層,對rpc接口的調用次數和調用時間進行監控  
第七層:protocol層,遠程調用層,封裝rpc調用  
第八層:exchange層,信息交換層,封裝請求響應模式,同步轉異步  
第九層:transport層,網絡傳輸層,抽象mina和netty為統一接口  
第十層:serialize層,數據序列化層


dubbox負載均和策略和集群容錯策略、動態代理策略
dubbo負載均衡策略:
- random loadbalance:默認情況下,dubbo是random load balance隨機調用實現負載均衡,可以對provider不同實例設置不同的權重,會按照權重來負載均衡,權重越大分配流量越高,一般就用這個默認的就可以了。
- roundrobin loadbalance:還有roundrobin loadbalance,這個的話默認就是均勻地將流量打到各個機器上去,但是如果各個機器的性能不一樣,容易導致性能差的機器負載過高。所以此時需要調整權重,讓性能差的機器承載權重小一些,流量少一些。
- leastactive loadbalance:這個就是自動感知一下,如果某個機器性能越差,那么接收的請求越少,越不活躍,此時就會給不活躍的性能差的機器更少的請求
- consistanthash loadbalance:一致性Hash算法,相同參數的請求一定分發到一個provider上去,provider掛掉的時候,會基於虛擬節點均勻分配剩余的流量,抖動不會太大。如果你需要的不是隨機負載均衡,是要一類請求都到一個節點,那就走這個一致性hash策略。

dubbo動態代理策略:
- 默認使用javassist動態字節碼生成,創建代理類但是可以通過spi擴展機制配置自己的動態代理策略


dubbox的服務治理、降級、重試
服務降級:
比如說服務A調用服務B,結果服務B掛掉了,服務A重試幾次調用服務B,還是不行,直接降級,走一個備用的邏輯,給用戶返回響應。

public interface HelloService {
    void sayHello();
}
public class HelloServiceImpl implements HelloService {
    public void sayHello() {
        System.out.println("hello world......");
    }
}

在provider中配置

<dubbo:reference id="fooService" interface="com.test.service.FooService" timeout="10000" check="false" mock="true">

將mock修改為true,然后在跟接口同一個路徑下實現一個Mock類,命名規則是接口名稱加Mock后綴。然后在Mock類里實現自己的降級邏輯。

public class HelloServiceMock implements HelloService {
    public void sayHello() {
        // 降級邏輯
    }
}


失敗重試和超時重試
失敗重試,就是consumer調用provider要是失敗了,比如拋異常了,此時應該是可以重試的,或者調用超時了也可以重試。Dubbox默認請求時間是1000ms,請求三次.可以通過timeout設置超時時間,以及設置retries重試次數。
zookeeper注冊中心如果掛掉了可以繼續通信嗎?
  可以。因為在剛開始初始化的時候,消費者會將提供者的地址等系拉取到本地緩存中,所以注冊中心掛掉了,可以繼續通信。

dubbox 如何保證服務的安全?
通過令牌驗證在注冊中心控制權限,以決定要不要下發令牌給消費者,可以防止消費者繞過注冊中心訪問提供者,另外通過注冊中心可靈活改變授權方式,而不需修改或升級提供者。
  https://yq.aliyun.com/articles/284281
大部分的服務都是部署在內網的,基本很少外網開放,但是zookeeper 的用戶權限認證好像起不了什么作用。


dubbox 的服務集群
集群的目的:實現高可用,容錯功能,集群的服務器不要放在一台物理機上,要分散節點,才能實現高可用,高容錯性。如果一台提供者掛了,還有其他的提供者,保證系統正常穩定的運行。
  用戶服務:pay-service-user
  交易服務:pay-service-trade
在 121、122的服務器上同時啟動這兩個服務。
在DubboxAdmin 管理控制台中可以看待兩個機器都注冊了服務。


Dubbo服務容錯配置--集群容錯模式
1、failover cluster
失敗自動切換,當出現失敗,重試其他服務器(缺省),通常用於讀操作,但重試會帶來更長的延時,可通過retries=“2”來設置重試次數(不含第一次)

<dubbo:service retries="2">
或者
<dubbo:reference retries="2">
或者
<dubbo:reference>
  <dubbo:method name="findFoo" retries=2>
<dubbo:reference/>

2、failfast cluster
快速失效,只發起一次調用,失敗立即報錯。通常用於非冪等性寫操作,比如說新增記錄

<dubbo:service cluster="failfast">
或者
<dubbo:reference cluster="failfast"

3、failsaft cluster
失敗安全,出現異常時,直接忽略,通常用於寫入審計日志等操作

<dubbo:service cluster="failsafe">
或者
<dubbo:reference cluster="failsafe">

4、failback cluster
失敗自動恢復,后台記錄失敗請求,定時重發,通常用於消息通知操作

<dubbo:service cluster="failback">
或者
<dubbo:reference cluster="failback">

5、forking cluster
並行調用多個服務器,只要一個成功即返回。通常用於實時性要求較高的讀操作,但需要浪費更多的服務器資源。可通過forks=“2”來設置最大並行數。

<dubbo:service cluster="forking">
或者
<dubbo:reference cluster="forking">




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM