深度學習Dubbo系列(入門開篇)

此文檔爲系列學習文檔前端

這系列文檔詳細講解了dubbo的使用,基本涵蓋dubbo的全部功能特性。在接下來的文章裏會詳細介紹。java

若是你正依賴dubbo做爲你業務工程的RPC通訊框架,這裏能夠做爲你的參考手冊 算法

1、背景

隨着互聯網的發展,網站應用的規模不斷擴大,常規的垂直應用架構已沒法應對,分佈式服務架構以及流動計算架構勢在必行,亟需一個治理系統確保架構有條不紊的演進。spring

單一應用架構數據庫

當網站流量很小時,只需一個應用,將全部功能都部署在一塊兒,以減小部署節點和成本。此時,用於簡化增刪改查工做量的數據訪問框架(ORM)是關鍵。apache

垂直應用架構

當訪問量逐漸增大,單一應用增長機器帶來的加速度愈來愈小,將應用拆成互不相干的幾個應用,以提高效率。此時,用於加速前端頁面開發的Web框架(MVC)是關鍵。緩存

分佈式服務架構

當垂直應用愈來愈多,應用之間交互不可避免,將核心業務抽取出來,做爲獨立的服務,逐漸造成穩定的服務中心,使前端應用能更快速的響應多變的市場需求。此時,用於提升業務複用及整合的分佈式服務框架(RPC)是關鍵。服務器

流動計算架構

當服務愈來愈多,容量的評估,小服務資源的浪費等問題逐漸顯現,此時需增長一個調度中心基於訪問壓力實時管理集羣容量,提升集羣利用率。此時,用於提升機器利用率的資源調度和治理中心(SOA)是關鍵。微信

2、架構

節點角色說明網絡

節點 角色說明
Provider 暴露服務的服務提供方
Consumer 調用遠程服務的服務消費方
Registry 服務註冊與發現的註冊中心
Monitor 統計服務的調用次數和調用時間的監控中心
Container 服務運行容器

調用關係說明

  1. 服務容器負責啓動,加載,運行服務提供者。

  2. 服務提供者在啓動時,向註冊中心註冊本身提供的服務。

  3. 服務消費者在啓動時,向註冊中心訂閱本身所需的服務。

  4. 註冊中心返回服務提供者地址列表給消費者,若是有變動,註冊中心將基於長鏈接推送變動數據給消費者。

  5. 服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,若是調用失敗,再選另外一臺調用。

  6. 服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。

Dubbo 架構具備如下幾個特色,分別是連通性、健壯性、伸縮性、以及向將來架構的升級性。

連通性

  • 註冊中心負責服務地址的註冊與查找,至關於目錄服務,服務提供者和消費者只在啓動時與註冊中心交互,註冊中心不轉發請求,壓力較小

  • 監控中心負責統計各服務調用次數,調用時間等,統計先在內存彙總後每分鐘一次發送到監控中心服務器,並以報表展現

  • 服務提供者向註冊中心註冊其提供的服務,並彙報調用時間到監控中心,此時間不包含網絡開銷

  • 服務消費者向註冊中心獲取服務提供者地址列表,並根據負載算法直接調用提供者,同時彙報調用時間到監控中心,此時間包含網絡開銷

  • 註冊中心,服務提供者,服務消費者三者之間均爲長鏈接,監控中心除外

  • 註冊中心經過長鏈接感知服務提供者的存在,服務提供者宕機,註冊中心將當即推送事件通知消費者

  • 註冊中心和監控中心所有宕機,不影響已運行的提供者和消費者,消費者在本地緩存了提供者列表

  • 註冊中心和監控中心都是可選的,服務消費者能夠直連服務提供者

健壯性

  • 監控中心宕掉不影響使用,只是丟失部分採樣數據

  • 數據庫宕掉後,註冊中心仍能經過緩存提供服務列表查詢,但不能註冊新服務

  • 註冊中心對等集羣,任意一臺宕掉後,將自動切換到另外一臺

  • 註冊中心所有宕掉後,服務提供者和服務消費者仍能經過本地緩存通信

  • 服務提供者無狀態,任意一臺宕掉後,不影響使用

  • 服務提供者所有宕掉後,服務消費者應用將沒法使用,並沒有限次重連等待服務提供者恢復

伸縮性

  • 註冊中心爲對等集羣,可動態增長機器部署實例,全部客戶端將自動發現新的註冊中心

  • 服務提供者無狀態,可動態增長機器部署實例,註冊中心將推送新的服務提供者信息給消費者

升級性

當服務集羣規模進一步擴大,帶動IT治理結構進一步升級,須要實現動態部署,進行流動計算,現有分佈式服務架構不會帶來阻力。下圖是將來可能的一種架構:

節點角色說明

節點 角色說明
Deployer 自動部署服務的本地代理
Repository 倉庫用於存儲服務應用發佈包
Scheduler 調度中心基於訪問壓力自動增減服務提供者
Admin 統一管理控制檯
Registry 服務註冊與發現的註冊中心
Monitor 統計服務的調用次數和調用時間的監控中心

3、需求

在大規模服務化以前,應用可能只是經過 RMI 或 Hessian 等工具,簡單的暴露和引用遠程服務,經過配置服務的URL地址進行調用,經過 F5 等硬件進行負載均衡。

當服務愈來愈多時,服務 URL 配置管理變得很是困難,F5 硬件負載均衡器的單點壓力也愈來愈大。此時須要一個服務註冊中心,動態的註冊和發現服務,使服務的位置透明。並經過在消費方獲取服務提供方地址列表,實現軟負載均衡和 Failover,下降對 F5 硬件負載均衡器的依賴,也能減小部分紅本。

當進一步發展,服務間依賴關係變得錯蹤複雜,甚至分不清哪一個應用要在哪一個應用以前啓動,架構師都不能完整的描述應用的架構關係。 這時,須要自動畫出應用間的依賴關係圖,以幫助架構師理清理關係。

接着,服務的調用量愈來愈大,服務的容量問題就暴露出來,這個服務須要多少機器支撐?何時該加機器? 爲了解決這些問題,第一步,要將服務如今天天的調用量,響應時間,都統計出來,做爲容量規劃的參考指標。其次,要能夠動態調整權重,在線上,將某臺機器的權重一直加大,並在加大的過程當中記錄響應時間的變化,直到響應時間到達閥值,記錄此時的訪問量,再以此訪問量乘以機器數反推總容量。

以上是 Dubbo 最基本的幾個需求。

4、用法

本地服務 Spring 配置

local.xml:

<bean id=「xxxService」 class=「com.xxx.XxxServiceImpl」 />
<bean id=「xxxAction」 class=「com.xxx.XxxAction」>
    <property name=「xxxService」 ref=「xxxService」 />
</bean>

遠程服務 Spring 配置

在本地服務的基礎上,只需作簡單配置,便可完成遠程化:

  • 將上面的 local.xml 配置拆分紅兩份,將服務定義部分放在服務提供方 remote-provider.xml,將服務引用部分放在服務消費方 remote-consumer.xml

  • 並在提供方增長暴露服務配置 <dubbo:service>,在消費方增長引用服務配置<dubbo:reference>

remote-provider.xml:

<!-- 和本地服務同樣實現遠程服務 -->
<bean id=「xxxService」 class=「com.xxx.XxxServiceImpl」 /> 
<!-- 增長暴露遠程服務配置 -->
<dubbo:service interface=「com.xxx.XxxService」 ref=「xxxService」 />

remote-consumer.xml:

<!-- 增長引用遠程服務配置 -->
<dubbo:reference id=「xxxService」 interface=「com.xxx.XxxService」 />
<!-- 和本地服務同樣使用遠程服務 -->
<bean id=「xxxAction」 class=「com.xxx.XxxAction」> 
    <property name=「xxxService」 ref=「xxxService」 />
</bean>

 

5、快速啓動

Dubbo 採用全 Spring 配置方式,透明化接入應用,對應用沒有任何 API 侵入,只需用 Spring 加載 Dubbo 的配置便可,Dubbo 基於 Spring 的 Schema 擴展進行加載。

若是不想使用 Spring 配置,能夠經過 API 的方式 進行調用。

服務提供者

完整安裝步驟,請參見:示例提供者安裝

定義服務接口

DemoService.java 1:

package com.alibaba.dubbo.demo;
public interface DemoService {    String sayHello(String name);
}

在服務提供方實現接口

DemoServiceImpl.java 2:

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;
    }
}

用 Spring 配置聲明暴露服務

provider.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://dubbo.apache.org/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd        http://dubbo.apache.org/schema/dubbo        http://dubbo.apache.org/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.alibaba.dubbo.demo.DemoService" ref="demoService" />

    <!-- 和本地bean同樣實現服務 -->
    <bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl" />
</beans>

加載 Spring 配置

Provider.java:

import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Provider {
    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"http://10.20.160.198/wiki/display/dubbo/provider.xml"});
        context.start();
        System.in.read(); // 按任意鍵退出
    }
}

服務消費者

完整安裝步驟,請參見:示例消費者安裝

經過 Spring 配置引用遠程服務

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://dubbo.apache.org/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd        http://dubbo.apache.org/schema/dubbo        http://dubbo.apache.org/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配置,並調用遠程服務

Consumer.java 3:

import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.alibaba.dubbo.demo.DemoService;
public class Consumer {
    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 ); // 顯示調用結果
    }
}
1. 該接口需單獨打包,在服務提供方和消費方共享 ↩
2. 對服務消費方隱藏實現 ↩
3. 也可使用 IoC 注入 ↩
4.若是對此類文檔感興趣的能夠加羣619881427一塊兒交流學習架構技術,羣內已經有小夥伴整理好了學習資料能夠免費獲取。

下章預告:依賴---》成熟度

關注微信公衆號:「Java架構師學習」

一個專一分享架構乾貨的微信公衆號

相關文章
相關標籤/搜索