Dubbo是什么


讀音 |ˈdʌbəʊ| !不是[dubəʊ]! 

(重點:調用步驟)

 

Dubbo是什么

Dubbo是一個分布式服務框架,致力於提供高性能和透明化的RPC遠程服務調用方案,以及SOA服務治理方案。其核心部分包括:

  • 遠程通訊:提供對多種基於長連接的NIO框架抽象封裝,包括多種線程模型、序列化、"請求-響應"模式的信息交換方案
  • 集群容錯:提供基於借口方法的透明遠程過程調用,包括多協議支持、軟負載均衡、失敗容錯、地址路由、動態配置等集群支持
  • 自動發現:基於注冊中心目錄服務,使服務消費方能動態地查找服務提供方,使地址透明,使服務提供方可以平滑增加或減少機器

 

Dubbo能做什么

Dubbo功能強大,總結下來,它大致可以做以下幾件事:

  • 透明化的遠程方法調用,就像調用本地方法一樣調用遠程方法,只需要簡單配置,沒有任何API侵入
  • 軟負載均衡及容錯機制,可在內網替代F5等硬件負載均衡器,降低成本、減少多拿點
  • 服務自動注冊與發現,不再需要寫死服務提供方地址,注冊中心基於接口名查詢服務提供者的IP地址,並且能夠平滑添加或刪除服務提供者

 

Dubbo架構圖

這是最重要的,理解Dubbo的架構圖是理解Dubbo的第一步,我從Dubbo官網手冊上截了一下Dubbo架構圖:

 

在接下來的講解之前,說明一個概念:所謂SOA也好,分布式服務框架也好,不是服務消費者從中間件(一般都是Zookeeper)上去拿數據,而是服務消費者從中間件上拿到可用的服務生產者的集群地址(生產者地址列表),再從集群地址中選出一個進行直連

接下來認識一下圖中的結點:

  • Provider:暴露服務的服務提供方,或者直白點說就是服務生產者
  • Consumer:調用遠程服務的服務消費方,也就是服務消費者
  • Registry:服務注冊與發現的注冊中心
  • Monitor:統計服務的調用次數和調用時間的監控中心
  • Container:服務(生產者)運行容器

調用步驟

(阿里:SOA怎么提供服務的,調用服務的。答:調用步驟->負載均衡->一致性hash算法)

圖中已經有了調用步驟了,接着對步驟進行說明:

  • 0:服務容器負責啟動、加載、運行服務提供者(生產者)
  • 1:服務提供者(生產者)在啟動時,向注冊中心注冊自己提供的服務
  • 2:服務消費者在啟動時,向注冊中心訂閱自己所需的服務
  • 3:注冊中心返回服務提供者地址列表給消費者,如果有變更,注冊中心將基於長連接推送變更數據給消費者
  • 4:服務消費者從服務生產者地址列表中,基於負載均衡算法,選擇一台提供者(生產者)進行調用,如果調用失敗,再選另一台調用
  • 5:服務消費者和提供者(生產者),在內存中累計調用次數和調用時間,定時每分鍾發送一次統計數據到監控中心

 

Dubbo用法

Dubbo采用全Spring配置方式,透明化接入應用,對應用沒有任何API侵入(這句話的意思是應用程序不會、不需要手動調用Dubbo的任何類和任何接口),只需用Spring加載Dubbo的配置即可(意思是對Dubbo的使用只需要寫Spring配置文件或注解),Dubbo基於Spring的Schema擴展進行加載。

如果不想使用Spring配置,而希望通過API的方式進行調用,可以自己看一下官方手冊Dubbo API配置,但是,這種做法十分不推薦。

下面簡單說明一下Dubbo的用法,首先要定義服務生產者的接口及其實現,那么定義一個接口(該接口需要單獨打包,在生產者和消費者之間共享):

package com.xrq.dubbo.demo;

public interface DemoService
{
    String sayHello(String name);    
}

在服務生產者處實現接口(對服務消費者隱藏接口實現細節):

復制代碼
package com.xrq.dubbo.demo.provider;

import com.xrq.dubbo.demo.DemoService;

public class DemoServiceImpl implements DemoService
{
    public String sayHello(String name)
    {
        return "Hello " + name;
    }
}
復制代碼

寫一個provider.xml,在服務生產者使用Spring暴露服務:

復制代碼
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans        
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://code.alibabatech.com/schema/dubbo
    http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 提供方應用信息,用於計算依賴關系 --> <dubbo:application name="hello-world-app" /> <!-- 使用multicast廣播注冊中心暴露服務地址 --> <dubbo:registry address="multicast://224.5.6.7:1234" /> <!-- 用dubbo協議在20880端口暴露服務 --> <dubbo:protocol name="dubbo" port="20880" /> <!-- 聲明需要暴露的服務接口 --> <dubbo:service interface="com.xrq.dubbo.demo.DemoService" ref="demoService" /> <!-- 和本地bean一樣實現服務 --> <bean id="demoService" class="com.xrq.dubbo.demo.provider.DemoServiceImpl" /> </beans>
復制代碼

在服務消費者處寫一個consumer.xml引用遠程服務:

復制代碼
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans        
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://code.alibabatech.com/schema/dubbo
    http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 消費方應用名,用於計算依賴關系,不是匹配條件,不要與提供方一樣 --> <dubbo:application name="consumer-of-helloworld-app" /> <!-- 使用multicast廣播注冊中心暴露發現服務地址 --> <dubbo:registry address="multicast://224.5.6.7:1234" /> <!-- 生成遠程服務代理,可以和本地bean一樣使用demoService --> <dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" /> </beans>
復制代碼

服務消費者處只要通過Spring拿到demoService,即可像使用本地接口一樣使用DemoService這個接口里面的方法:

復制代碼
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.xrq.dubbo.demo.DemoService;
 
public class Consumer 
{
    public static void main(String[] args) throws Exception    
    {
        ClassPathXmlApplicationContext context = 
new ClassPathXmlApplicationContext(new String[] {"http://aaa.bbb.ccc:dddd/eee/fff/consumer.xml"}); context.start(); DemoService demoService = (DemoService)context.getBean("demoService"); // 獲取遠程服務代理 String hello = demoService.sayHello("world"); // 執行遠程方法 System.out.println(hello); // 顯示調用結果 } }
復制代碼

看到整個過程中:

1、沒有任何Dubbo的代碼,使用Dubbo的時候全部都是Spring配置,這就是前面提到的Dubbo對應用沒有任何API侵入

2、不需要考慮底層線程模型、序列化、反序列化、url解析等問題,這些都是Dubbo底層做好的


免責聲明!

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



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