Dubbo入門—搭建一個最簡單的Demo框架


一.Dubbo背景和簡介

1.電商系統的演進

  Dubbo開始於電商系統,因此在這里先從電商系統的演變講起。

a.單一應用框架(ORM)
  當網站流量很小時,只需一個應用,將所有功能如下單支付等都部署在一起,以減少部署節點和成本。
  缺點:單一的系統架構,使得在開發過程中,占用的資源越來越多,而且隨着流量的增加越來越難以維護。

b.垂直應用框架(MVC)
  垂直應用架構解決了單一應用架構所面臨的擴容問題,流量能夠分散到各個子系統當中,且系統的體積可控,一定程度上降低了開發人員之間協同以及維護的成本,提升了開發效率。
  缺點:但是在垂直架構中相同邏輯代碼需要不斷的復制,不能復用。

c.分布式應用架構(RPC) 

  當垂直應用越來越多,應用之間交互不可避免,將核心業務抽取出來,作為獨立的服務,逐漸形成穩定的服務中心。

d.流動計算架構(SOA)
  隨着服務化的進一步發展,服務越來越多,服務之間的調用和依賴關系也越來越復雜,誕生了面向服務的架構體系(SOA),也因此衍生出了一系列相應的技術,如對服務提供、服務調用、連接處理、通信協議、序列化方式、服務發現、服務路由、日志輸出等行為進行封裝的服務框架。

  從以上是電商系統的演變可以看出架構演變的過程: 從以上是電商系統的演變可以看出架構演變的過程: 

a.單一應用架構
  當網站流量很小時,只需一個應用,將所有功能都部署在一起,以減少部署節點和成本。
  此時,用於簡化增刪改查工作量的 數據訪問框架(ORM) 是關鍵。

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

c.分布式服務架構
  當垂直應用越來越多,應用之間交互不可避免,將核心業務抽取出來,作為獨立的服務,逐漸形成穩定的服務中心,使前端應用能更快速的響應多變的市場需求。
  此時,用於提高業務復用及整合的 分布式服務框架(RPC) 是關鍵。

d.流動計算架構
  當服務越來越多,容量的評估,小服務資源的浪費等問題逐漸顯現,此時需增加一個調度中心基於訪問壓力實時管理集群容量,提高集群利用率。
  此時,用於提高機器利用率的 資源調度和治理中心(SOA) 是關鍵。

2.RPC簡介

a.RPC(Remote Procedure Call Protocol):遠程過程調用
  兩台服務器A、B,分別部署不同的應用a,b。當A服務器想要調用B服務器上應用b提供的函數或方法的時候,由於不在一個內存空間,不能直接調用,需要通過網絡來表達調用的語義傳達調用的數據。
  說白了,就是你在你的機器上寫了一個程序,我這邊是無法直接調用的,這個時候就出現了一個遠程服務調用的概念。
  RPC是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,為通信程序之間攜帶信息數據。在OSI網絡通信模型中,RPC跨越了傳輸層和應用層。RPC使得開發包括網絡分布式多程序在內的應用程序更加容易。
  RPC采用客戶機/服務器模式。請求程序就是一個客戶機,而服務提供程序就是一個服務器。首先,客戶機調用進程發送一個有進程參數的調用信息到服務進程,然后等待應答信息。在服務器端,進程保持睡眠狀態直到調用信息到達為止。當一個調用信息到達,服務器獲得進程參數,計算結果,發送答復信息,然后等待下一個調用信息,最后,客戶端調用進程接收答復信息,獲得進程結果,然后調用執行繼續進行。

b.RPC需要解決的問題
  通訊問題 : 主要是通過在客戶端和服務器之間建立TCP連接,遠程過程調用的所有交換的數據都在這個連接里傳輸。連接可以是按需連接,調用結束后就斷掉,也可以是長連接,多個遠程過程調用共享同一個連接。
  尋址問題 : A服務器上的應用怎么告訴底層的RPC框架,如何連接到B服務器(如主機或IP地址)以及特定的端口,方法的名稱名稱是什么,這樣才能完成調用。比如基於Web服務協議棧的RPC,就要提供一個endpoint URI,或者是從UDDI服務上查找。如果是RMI調用的話,還需要一個RMI Registry來注冊服務的地址。
  序列化與反序列化 : 當A服務器上的應用發起遠程過程調用時,方法的參數需要通過底層的網絡協議如TCP傳遞到B服務器,由於網絡協議是基於二進制的,內存中的參數的值要序列化成二進制的形式,也就是序列化(Serialize)或編組(marshal),通過尋址和傳輸將序列化的二進制發送給B服務器。 同理,B服務器接收參數要將參數反序列化。B服務器應用調用自己的方法處理后返回的結果也要序列化給A服務器,A服務器接收也要經過反序列化的過程。

 

二.Dubbo是什么

  Dubbo是一款分布式服務框架、高性能和透明化的RPC遠程服務調用方案、SOA服務治理方案。
  每天為2千多個服務提供大於30億次訪問量支持,並被廣泛應用於阿里巴巴集團的各成員站點以及別的公司的業務中。

 

三.Dubbo架構

Provider: 暴露服務的服務提供方。
Consumer: 調用遠程服務的服務消費方。
Registry: 服務注冊與發現的注冊中心。
Monitor: 統計服務的調用次數和調用時間的監控中心。

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

 

四.Dubbo注冊中心

  對於服務提供方,它需要發布服務,而且由於應用系統的復雜性,服務的數量、類型也不斷膨脹;
  對於服務消費方,它最關心如何獲取到它所需要的服務,而面對復雜的應用系統,需要管理大量的服務調用。
  而且,對於服務提供方和服務消費方來說,他們還有可能兼具這兩種角色,即既需要提供服務,有需要消費服務。

  通過將服務統一管理起來,可以有效地優化內部應用對服務發布/使用的流程和管理。服務注冊中心可以通過特定協議來完成服務對外的統一。

  Dubbo提供的注冊中心有如下幾種類型可供選擇:

  a.Multicast注冊中心
  b.Zookeeper注冊中心
  c.Redis注冊中心
  d.Simple注冊中心

 

五.Dubbo優缺點

優點:

1.透明化的遠程方法調用
  像調用本地方法一樣調用遠程方法;只需簡單配置,沒有任何API侵入。
2.軟負載均衡及容錯機制
  可在內網替代nginx lvs等硬件負載均衡器。
3.服務注冊中心自動注冊 & 配置管理
  不需要寫死服務提供者地址,注冊中心基於接口名自動查詢提供者ip。
  使用類似zookeeper等分布式協調服務作為服務注冊中心,可以將絕大部分項目配置移入zookeeper集群。
4.服務接口監控與治理
  Dubbo-admin與Dubbo-monitor提供了完善的服務接口管理與監控功能,針對不同應用的不同接口,可以進行 多版本,多協議,多注冊中心管理。
缺點:

  只支持JAVA語言

 

六.Dubbo入門Demo

  了解了Dubbo以后,自然要搭建一個簡單的Demo實現。本文采用Dubbo與Zookeeper、Spring框架的整合。

  主要是以下幾個步驟:
a. 安裝Zookeeper,啟動;
b. 創建MAVEN項目,構建Dubbo+Zookeeper+Spring實現的簡單Demo;
c. 安裝Dubbo-admin,實現監控。

1.Zookeeper介紹與安裝

  本Demo中的Dubbo注冊中心采用的是Zookeeper。為什么采用Zookeeper呢?

  Zookeeper是一個分布式的服務框架,是樹型的目錄服務的數據存儲,能做到集群管理數據 ,這里能很好的作為Dubbo服務的注冊中心。
  Dubbo能與Zookeeper做到集群部署,當提供者出現斷電等異常停機時,Zookeeper注冊中心能自動刪除提供者信息,當提供者重啟時,能自動恢復注冊數據,以及訂閱請求。

  具體的安裝方法在此不一一敘述,可參考博文: http://www.cnblogs.com/flyingeagle/p/8907037.html
  安裝完成后,進入到bin目錄,並且啟動zkServer.cmd,這個腳本中會啟動一個java進程: 

  (注:需要先啟動zookeeper后,后續dubbo demo代碼運行才能使用zookeeper注冊中心的功能)

2.導入MAVEN項目

  詳細的導入過程請參考《Eclipse導入Maven工程並運行》。

  項目結構:


  主要分三大模塊:
  dubbo-api : 存放公共接口;
  dubbo-consumer :調用遠程服務;
  dubbo-provider : 提供遠程服務。

 下面將詳細敘述代碼構建過程。 

1) 首先構建MAVEN項目,導入所需要的jar包依賴
  需要導入的有spring, dubbo, zookeeper等jar包。
2)創建dubbo-api的MAVEN項目(有獨立的pom.xml,用來打包供提供者消費者使用)

  在項目中定義服務接口:該接口需單獨打包,在服務提供方和消費方共享。

package com.alibaba.dubbo.demo;

import java.util.List;

public interface DemoService {
    List<String> getPermissions(Long id);
}

3)創建dubbo-provider的MAVEN項目(有獨立的pom.xml,用來打包供消費者使用)
  實現公共接口,此實現對消費者隱藏:

package com.alibaba.dubbo.demo.impl;

import com.alibaba.dubbo.demo.DemoService;

import java.util.ArrayList;
import java.util.List;

public class DemoServiceImpl implements DemoService {
    public List<String> getPermissions(Long id) {
        List<String> demo = new ArrayList<String>();
        demo.add(String.format("Permission_%d", id - 1));
        demo.add(String.format("Permission_%d", id));
        demo.add(String.format("Permission_%d", id + 1));
        return demo;
    }
}

  需加入公共接口所在的依賴 

<dependencies>
    <dependency>
        <groupId>DubboDemo</groupId>
        <artifactId>dubbo-api</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>

  用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-admin 或 dubbo-monitor 會顯示這個名字,方便辨識-->
    <dubbo:application name="demotest-provider" owner="programmer" organization="dubbox"/>
    <!--使用 zookeeper 注冊中心暴露服務,注意要先開啟 zookeeper-->
    <dubbo:registry address="zookeeper://localhost:2181"/>
    <!-- 用dubbo協議在20880端口暴露服務 -->
    <dubbo:protocol name="dubbo" port="20880" />
    <!--使用 dubbo 協議實現定義好的 api.PermissionService 接口-->
    <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" protocol="dubbo" />
    <!--具體實現該接口的 bean-->
    <bean id="demoService" class="com.alibaba.dubbo.demo.impl.DemoServiceImpl"/>
</beans>

  啟動遠程服務:

package com.alibaba.dubbo.demo.impl;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.io.IOException;

public class Provider {
    public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                "provider.xml");
        System.out.println(context.getDisplayName() + ": here");
        context.start();
        System.out.println("服務已經啟動...");
        System.in.read();
    }
}

4)創建dubbo-consumer的MAVEN項目(可以有多個consumer,但是需要配置好) 
  調用所需要的遠程服務,通過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="demotest-consumer" owner="programmer" organization="dubbox"/>
    <!--向 zookeeper 訂閱 provider 的地址,由 zookeeper 定時推送-->
    <dubbo:registry address="zookeeper://localhost:2181"/>
    <!--使用 dubbo 協議調用定義好的 api.PermissionService 接口-->
    <dubbo:reference id="permissionService" interface="com.alibaba.dubbo.demo.DemoService"/>
</beans>

  啟動Consumer,調用遠程服務:

package com.alibaba.dubbo.consumer;

import com.alibaba.dubbo.demo.DemoService;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Consumer {
    public static void main(String[] args) {
        //測試常規服務
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("consumer.xml");
        context.start();
        System.out.println("consumer start");
        DemoService demoService = context.getBean(DemoService.class);
        System.out.println("consumer");
        System.out.println(demoService.getPermissions(1L));
    }
}

5)運行項目,先確保provider已被運行后再啟動consumer模塊 
運行提供者:

消費者成功調用提供者所提供的遠程服務: 

  當然,這只是一個模擬的項目,實際中有多提供者多消費者情況,比這要復雜的多,當然只有這樣才能體現dubbo的特性。

 

七.Dubbo管理控制台介紹

1.管理控制台功能

  路由規則,動態配置,服務降級
  訪問控制,權重調整
  負載均衡

 

2.下載dubbo-admin

  但是找開官網https://github.com/apache/incubator-dubbo,發現沒有dubbo-admin了?[這個還請熟悉知道的賜教]

  后從https://github.com/muarine/dubbo/blob/master/dubbo-admin-2.5.4-SNAPSHOT.war下載,下載后將dubbo-admin-2.5.4-SNAPSHOT.war包放至apache-tomcat-8.0.35\webapps下,再啟動tomcat。

  啟動成功后,輸入用戶名密碼root后,即可進入控制台首頁,進而查看消費者、提供者情況: 

查看提供者:

查看消費者: 

  當然,Dubbo現在已移交給apache維護,同時市場上也出現了很多更新的Dubbo,比如當當網的Dubbox。

 

文章來源:https://blog.csdn.net/noaman_wgs/article/details/70214612,原作者的源代碼地址:https://github.com/nomico271/DatatablesDemo

實例代碼:http://bijian1013.iteye.com/blog/2419726

dubbo開發者手冊:http://dubbo.apache.org/books/dubbo-dev-book/

dubbo用戶手冊:http://dubbo.apache.org/books/dubbo-user-book/

dubbo官網:https://github.com/apache/incubator-dubbo


免責聲明!

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



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