Dubbo學習筆記(一) 入門

liudashuang2017發表於2018-04-13

Dubbo是什麼?他的核心功能是什麼?

dubbo 阿里開源的一個SOA服務治理框架,從目前來看把它稱作是一個RCP遠端呼叫框架更為貼切。單從RPC框架來說,功能較完善,支援多種傳輸和序列化方案。核心功能:就是遠端呼叫。

常用的遠端呼叫:RMI 、Web Service、Http

RMI :
JAVA 遠端方法呼叫、使用原生二進位制方式進行序列化 簡單易用、SDK支援,提高開發效率 不支援跨語言
Web Service
比較早系統呼叫解決方案 ,跨語言, 其基於WSDL 生成 SOAP 進行訊息的傳遞。 SDK支援、跨語言 實現較重,釋出繁瑣
Http 採用htpp +json 實現 簡單、輕量、跨語言 不支援SDK

dubbo為何而生?

先看一個分散式架構
這裡寫圖片描述
在一個分散式系統中,服務端有多臺,客戶端對服務端進行遠端呼叫.會有以下問題
1、負載均衡:這麼多個機器呼叫哪一臺?
2、容錯:如果呼叫其中一臺呼叫出錯了怎麼辦?
3、服務配置:服務端地址配置在哪裡?
4、健康檢測:服務關當機或恢復後怎麼辦?
一個良好的RPC 框架主要解決這些問題.dubbo就是如此.

RPC框架主要有哪些模組功能?

這裡寫圖片描述

  1. 註冊中心主要邏輯:
    服務端動態註冊服務提供者資訊
    客戶端從註冊中心接收服務提供者資訊,並儲存至本地快取
    註冊中心實時監聽提供者狀態,如果變更將即時通知客戶端
  2. 呼叫主要功能:
    負載均衡
    容錯,一臺不行換一臺.
    對服務呼叫者透明,呼叫多臺和一臺沒啥感知上的區別
  3. 傳輸模組:
    需要進行引數傳輸,介面傳遞. 主要通過 minal,servlet 容器、netty等實現
  4. 序列化模組:
    kryo、hessian、java、protobuf、JSON、XML

再看dubbo架構

這裡寫圖片描述

  1. Provider(提供者)繫結指定埠並啟動服務
  2. 提供者連線註冊中心,併發本機IP、埠、應用資訊和提供服務資訊傳送至註冊中心儲存
  3. Consumer(消費者),連線註冊中心 ,併傳送應用資訊、所求服務資訊至註冊中心
  4. 註冊中心根據 消費 者所求服務資訊匹配對應的提供者列表傳送至Consumer 應用快取。
  5. Consumer 在發起遠端呼叫時基於快取的消費者列表擇其一發起呼叫。
  6. Provider 狀態變更會實時通知註冊中心、在由註冊中心實時推送至Consumer
這麼設計的意義:
  1. Consumer 與Provider 解偶,雙方都可以橫向增減節點數。
  2. 註冊中心對本身可做對等叢集,可動態增減節點,並且任意一臺宕掉後,將自動切換到另一臺
  3. 去中心化,雙方不直接依懶註冊中心,即使註冊中心全部當機短時間內也不會影響服務的呼叫
  4. 服務提供者無狀態,任意一臺宕掉後,不影響使用

實戰入門 實現helloWorld


編寫服務端介面

package com.wow;

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

服務端實現類

package com.wow;


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

服務端配置檔案

<?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="demo-provider"/>

    <!--<dubbo:registry address="multicast://224.5.6.7:1234"/> -->
    <dubbo:registry protocol="redis" address="127.0.0.1:6379" check="true"/>
    <dubbo:protocol name="dubbo" port="20880"/>

    <dubbo:service interface="com.wow.DemoService" ref="demoService">
            <dubbo:method name="sayHello" timeout="2000"/>
    </dubbo:service>
    <bean id="demoService" class="com.wow.DemoServiceImpl"/>
</beans>

客戶端配置檔案

<?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="demo-consumer"/>
    <!--<dubbo:registry address="multicast://224.5.6.7:1234"/>-->
    <!-- 通過dubbo.xsd獲取dubbo的配置屬性-->
    <dubbo:registry protocol="redis" address="127.0.0.1:6379" check="true"/>
    <dubbo:reference  id="demoService"
                      timeout="2000"
                      interface="com.wow.DemoService"   />
</beans>

服務端啟動

package com.wow;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Provider {
    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-dubbo-provider.xml");
        context.start();
        System.out.println("啟動成功");
        System.in.read();
    }
}

客戶端呼叫

package com.wow;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Consumer {
    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                "spring-dubbo-consumer.xml");
        context.start();
        // 獲取服務代理
        DemoService demoService = (DemoService) context.getBean("demoService");
        // 服務執行
        String hello = demoService.sayHello("world");

        System.out.println(hello);
    }
}

結果:

資訊:  [DUBBO] Refer dubbo service com.wow.DemoService from url registry://127.0.0.1:6379/com.alibaba.dubbo.registry.RegistryService?application=demo-consumer&check=true&cluster=available&dubbo=2.5.3&pid=7284&refer=application%3Ddemo-consumer%26dubbo%3D2.5.3%26interface%3Dcom.wow.DemoService%26methods%3DsayHello%26pid%3D7284%26side%3Dconsumer%26timeout%3D2000%26timestamp%3D1523593380165&registry=redis&timestamp=1523593380249, dubbo version: 2.5.3, current host: 10.127.5.182
Hello world
四月 13, 2018 12:23:05 下午 com.alibaba.dubbo.common.logger.jcl.JclLogger info
資訊:  [DUBBO] Run shutdown hook now., dubbo version: 2.5.3, current host: 10.127.5.182

以上例子中以Redis作為註冊中心, 檢視Redis中的key 可以找到 相關的儲存資訊. 如下
這裡寫圖片描述

核心配置

檢視dubbo.xsd檔案可具體檢視dubbo的配置.
dubbo配置可以用如下圖來解釋,分為三種配置 提供者配置, 消費者配置, 和公共配置.
其他詳細的配置可以參考
http://dubbo.apache.org/books/dubbo-user-book/
這裡寫圖片描述
這裡寫圖片描述
這個圖是非常關鍵的,當你在進行配置的時候,可以參考,並且在我們使用API進行配置的時候也可以參考這個圖.通過對於的配置類,來進行配置.

配置的優先順序

以 timeout 為例,顯示了配置的查詢順序,其它 retries, loadbalance, actives 等類似:

方法級優先,介面級次之,全域性配置再次之。
如果級別一樣,則消費方優先,提供方次之。
其中,服務提供方配置,通過 URL 經由註冊中心傳遞給消費方

這裡寫圖片描述

Redis作為註冊中心時呼叫過程

  1. 服務提供方啟動時,向 Key:/dubbo/XXXServer/providers 下,新增當前提供者的地址
  2. 並向 Channel:/dubbo/com.wow.DemoService/providers 傳送 register 事件
  3. 服務消費方啟動時,從 Channel:/dubbo/com.wow.DemoService/providers 訂閱 register 和 unregister 事件
  4. 並向 Key:/dubbo/com.wow.DemoService/providers 下,新增當前消費者的地址
  5. 服務消費方收到 register 和 unregister 事件後,從 Key:/dubbo/com.wow.DemoService/providers 下獲取提供者地址列表

zookeeper作為註冊中心呼叫過程

說明:
• 服務提供者啟動時: 向 /dubbo/com.wow.DemoService/providers 目錄下寫入自己的 URL 地址
• 服務消費者啟動時: 訂閱 /dubbo/com.wow.DemoService/providers 目錄下的提供者 URL 地址。並向 /dubbo/com.wow.DemoService/consumers 目錄下寫入自己的 URL 地址
• 監控中心啟動時: 訂閱 /dubbo/com.wow.DemoService 目錄下的所有提供者和消費者 URL 地址
zookeeper作為註冊中心資料模型

本文所有程式碼均上傳Github:https://github.com/wowdouble/wowdouble/tree/master/dubbolearn

相關文章