Dubbo 分佈式服務框架簡介

一、分佈式服務框架

1.1 Dubbo 簡介

  • Dubbo 是一個分佈式服務框架,以及阿里巴巴內部的 SOA 服務化治理方案的核心框架。其功能主要包括:高性能 NIO 通信及多協議集成,服務動態尋址與路由,軟負載均衡與容錯,依賴分析與降級等。html

  • 說通俗點,就是首先將程序組件化成一個個相對獨立的服務,而後就能夠對服務進行分佈式;並且,它有註冊中心經過監聽,實時發現着新服務,並部署,還能夠推送給客戶端;它還集成了負載均衡的解決方案,利用隨機算法來將各個服務科學地分配到多臺服務器上;固然,它也集成了容錯機制,來提升集羣的穩定性。前端

  • 官網首頁: http://dubbo.io/
  • 官方用戶指南: http://dubbo.apache.org/zh-cn/docs/user/quick-start.html
  • 官方開發指南: http://dubbo.apache.org/zh-cn/docs/dev/build.htmljava

  • 噹噹網的擴展版本 dubbox : https://github.com/dangdangdotcom/dubbox
  • 京東的擴展版本 jd-hydra: http://www.oschina.net/p/jd-hydragit

1.2 SOA 簡介

  • SOA(Service Oriented Architecture):面向服務的架構。由服務治理、服務註冊和發現、RPC、監控中心、調度中心以及服務路由、負載均衡等功能模塊組成的資源調度和治理中心。

1.3 RPC 簡介

  • RPC 是指遠程過程調用,也就是說兩臺服務 A,B,一個應用部署在 A 服務器上,想要調用 B 服務器上應用提供的函數/方法,因爲不在一個內存空間,不能直接調用,須要經過網絡來表達調用的語義和傳達調用的數據。github

  • RPC 演進算法

  • 框架演進:ORM –> MVC –> RPC –> SOAapache

  • 架構演進:單一應用架構 –> 垂直應用架構 —> 分佈式服務架構 –> 流動計算架構緩存

    • 單一應用架構:網站流量小的時候,將全部功能集中到單一應用以減小成本。
    • 垂直應用架構:網站流量增大,橫向擴展帶來的效益愈來愈低,將應用拆分爲互不相干的幾個應用以提高效率。
    • 分佈式服務架構:當垂直應用愈來愈多,應用之間交互不可避免,將核心業務抽取出來,做爲獨立的服務,逐漸造成穩定的服務中心,使前端應用能更快速的響應多變的市場需求。此時,用於提升業務複用及整合的分佈式服務框架(RPC)是關鍵。
    • 彈性計算架構:當服務愈來愈多,容量的評估,小服務資源的浪費等問題逐漸顯現,此時需增長一個調度中心基於訪問壓力實時管理集羣容量,提升集羣利用率。此時,用於提升機器利用率的資源調度和治理中心(SOA)是關鍵。

二、Dubbo 架構簡介

  • Dubbo 架構圖服務器

  • 節點角色網絡

    • Provider:服務提供方,在啓動時向註冊中心註冊服務;
    • Consumer:服務消費方,向註冊中心請求服務提供方列表,在本地作負載均衡調用服務;
    • Register:註冊中心,提供服務註冊與發現(通常由 Zookeeper 擔當),經過長鏈接與 Provider 和 Consumer 保持鏈接,負責監控 Provider 的上下線並及時通知 Consumer;
    • Monitor:監控中心,負責統計服務的性能數據;
    • Container:服務運行容器。
  • 調用關係

    • 0.start:服務運行容器啓動、加載、運行服務提供方,通常由 Spring 容器啓動 Jar 運行;
    • 1.register: 服務提供方在啓動時,向註冊中心註冊本身的 IP、服務接口等信息;
    • 2.subscribe: 服務消費方向註冊中心訂閱本身感興趣的服務提供方;
    • 3.notify: 註冊中心在服務提供方發生變動時將基於長鏈接向消費方推送消息;
    • 4.invoke: 服務消費方在本地對服務列表作軟負載均衡算法,選擇最優的服務提供方進行 RPC 調用;
    • 5.count: 消費方和提供方向監控中心定時異步推送服務調用次數和時間,消費方的包括網絡耗時,提供方不包括網絡耗時。
  • 性能說明

    • 連通性:註冊中心經過長鏈接與 Provider 和 Consumer 進行通訊,Provider 和 Consumer 直接經過 PRC 直接調用,其只在啓動時向註冊中心註冊和訂閱,註冊中心不轉發請求,當註冊中心宕機,Consumer 依然能夠經過本地緩存的 Provider 的地址列表進行調用;Provider 和 Consumer 與監控中心定時地經過異步通訊方式進行服務調用信息上傳;
    • 健壯性:服務提供者無狀態,任意一臺宕掉後,不影響使用,服務提供者所有宕掉後,服務消費者應用將沒法使用,並沒有限次重連等待服務提供者恢復。
    • 伸縮性:註冊中心爲對等集羣,可動態增長機器部署實例,全部客戶端將自動發現新的註冊中心,服務提供者無狀態,可動態增長機器部署實例,註冊中心將推送新的服務提供者信息給消費者。
    • 擴展性:當服務集羣規模進一步擴大,帶動 IT 治理結構進一步升級,須要實現動態部署,進行彈性計算,現有分佈式服務架構不會帶來阻力。

三、Dubbo 使用簡介

  • Dubbo 採用全 Spring 配置方式,透明化接入應用,對應用沒有任何 API 侵入,其配置採用 XML 和註解的方式,使用 Spring 的 BeanFactory 加載 Bean,運行在 Spring 容器中。

  • 簡易步驟以下

    • 1)搭建 zookeeper 消息中心
    • 2)搭建 dubbo 服務端代碼
    • 3)搭建 dubbo 客戶端代碼

3.1 搭建服務提供方

  • 1)定義服務接口

    // DemoService.java
    
    package com.alibaba.dubbo.demo;
    
    public interface DemoService {
        String sayHello(String name);
    }
    • 打包成 Jar 包在服務提供方和消費者處使用,該工程裏除了接口定義之外,還有各類實體類和通用工具類
  • 2)實現服務接口

    // DemoServiceImpl.java
    
    package com.alibaba.dubbo.demo.provider;
    import com.alibaba.dubbo.demo.DemoService;
    
    public class DemoServiceImpl implements DemoService {
    
        public String sayHello(String name) {
            return "Hello " + name;
        }
    }
    • 採用 Maven 的多項目結構,將接口定義和服務實現定義在同一個父項目下。
  • 3)暴露服務

    • XML方式
    <beans>
        <!-- 省略 schema --!>
    
        <!-- 提供方應用信息,用於計算依賴關係 -->
        <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.alibaba.dubbo.demo.DemoService" ref="demoService" />
    
        <!-- 和本地 bean 同樣實現服務 -->
        <bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl" />
    </beans>
    • 註解方式
    // FooServiceImpl.java
    
    import com.alibaba.dubbo.config.annotation.Service;
    
    @Service(version="1.0.0")
    public class FooServiceImpl implements FooService {
    }
    // provider.xml
    
    <!-- 公共信息,也能夠用 dubbo.properties 配置 -->
    <dubbo:application name="annotation-provider" />
    <dubbo:registry address="127.0.0.1:4548" />
    
    <!-- 掃描註解包路徑,多個包用逗號分隔,不填 pacakge 表示掃描當前 ApplicationContext 中全部的類 -->
    <dubbo:annotation package="com.foo.bar.service" />
  • 4)啓動

    public static void main(String[] args) throws Exception {
    
        // 加載 xml 配置啓動 Spring 的 BeanFactory
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                new String[] {"http://10.20.160.198/wiki/display/dubbo/provider.xml"});
        context.start();
        System.in.read(); // 按任意鍵退出
    }
    • 服務啓動時,將向註冊中心註冊本服務的 IP、接口等信息。

3.2 搭建服務消費方

  • 1)引用遠程服務接口

    • xml 方式
    // consumer.xml
    
    <!-- 消費方應用名,用於計算依賴關係,不是匹配條件,不要與提供方同樣 -->
    <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" />
    • 註解方式
    @Component
    public class BarAction {
    
        @Reference(version="1.0.0")
        private FooService fooService;
    }
  • 2)調用服務

    public static void main(String[] args) throws Exception {
    
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                new String[] {"http://10.20.160.198/wiki/display/dubbo/consumer.xml"});
        context.start();
        DemoService demoService = (DemoService)context.getBean("demoService"); // 獲取遠程服務代理
    
        String hello = demoService.sayHello("world"); // 執行遠程方法
        System.out.println( hello );                  // 顯示調用結果
    }
相關文章
相關標籤/搜索