1. 程式人生 > >dubbo入門--原理、應用、例項

dubbo入門--原理、應用、例項

最近想學習一下dubbo,看了很多前輩們的文章和資料,現對自己的理解做個總結:

要說dubbo就先了解一下RPC:

概念:

RPC(Remote Procedure Call):遠端過程呼叫,是一種通過網路從遠端計算機程式上請求服務,而不需要了解底層網路技術的協議。它使得在本地呼叫遠端的程式就好像是在呼叫本地的程式一樣。

RPC協議假定某些傳輸協議是存在的,如TCP或UDP,為通訊程式之間攜帶資訊資料。在OSI網路通訊模型(七層模型)中,RPC跨越了傳輸層和應用層。RPC使得開發包括網路分散式多程式在內的應用程式更加容易。

RPC呼叫過程:

  • 客戶端以本地服務方式呼叫服務
  • client stub作為代理,然後處理呼叫與呼叫的引數
  • client stub傳送呼叫到遠端的系統,通過TCP或UDP
  • server stub處理client stub發過來的呼叫與引數
  • server stub呼叫真正提供的服務
  • server stub處理回覆,然後傳送給客戶端

Dubbo

1、什麼是dubbo :Dubbo是阿里巴巴SOA服務化治理方案的核心框架,是一個分散式服務框架,致力於提供高效能和透明化的RPC遠端服務呼叫方案,以及SOA服務治理方案。

   soa:“面向服務架構”,它提供的是一種架構風格和理念,而並非是一種技術或者產品。SOA提倡將不同應用程式的業務功能封裝成“服務”並宿主起來,通常以介面和契約的形式暴露並提供給外界應用訪問(通過交換訊息),達到不同系統可重用的目的。

 2、Dubbo的技術架構圖如下:

我們解釋一下這個架構圖:

a、Consumer服務消費者(花錢的),Provider服務提供者(給錢的),Container服務容器(領錢的地方)。

b、服務提供者先啟動,然後註冊服務(registry)。

c、Monitor這是一個監控,圖中虛線表明Consumer 和Provider通過非同步的方式傳送訊息至Monitor,Consumer和Provider會將資訊存放在本地磁碟,平均1min會發送一次資訊。Monitor在整個架構中是可選的。

d、Monitor功能需要單獨配置,不配置或者配置以後,Monitor掛掉並不會影響服務的呼叫。

3、Dubbo服務消費者呼叫過程

 

上圖是服務消費的主過程:

首先通過 ReferenceConfig 類的 private void init() 方法會先檢查初始化所有的配置資訊後,呼叫 private T createProxy(Map map) 建立代理,消費者最終得到的是服務的代理, 在 createProxy 接著呼叫 Protocol 介面實現的 Invoker refer(Class type, URL url) 方法生成 Invoker 例項(如上圖中的紅色部分),這是服務消費的關鍵。接下來把 Invoker 通過 ProxyFactory 代理工廠轉換為客戶端需要的介面(如: HelloWorld ),建立服務代理並返回。

消費端的初始化過程

1、把服務引用的資訊封裝成URL並註冊到zk註冊中心;

2、監聽註冊中心的服務的上下線;

3、連線服務提供端,建立NettyClient物件;

4、將這些資訊包裝成DubboInvoker消費端的呼叫鏈,建立消費端Invoker例項的服務代理並返回;

消費端的服務引用過程

1、經過負載均衡策略,呼叫提供者;

2、選擇其中一個服務的URL與提供者netty建立連線,使用ProxyFactory 建立遠端通訊,或者本地通訊的,Invoker發到netty服務端;

3、伺服器端接收到該Invoker資訊後,找到對應的本地Invoker,處理Invocation請求;

4、獲取非同步,或同步處理結果;

  • 非同步 不需要返回值:直接呼叫ExchangeClient.send()方法;
  • 同步 需要返回值:使用ExchangeClient.request()方法,返回一個ResponseFuture,一直阻塞到服務端返回響應結果;

 4、最簡單的dubbo例項

1. 服務提供方和消費方都需要的包(這裡我新建的maven工程為pom工程,將共同的專案依賴寫到pom.xml中)

  • 總的專案結構為 這裡寫圖片描述

  • pom.xml檔案內容為

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.test</groupId>
  <artifactId>dubbo-demo</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>

   <properties>
        <motan.version>0.3.0</motan.version>
        <!-- 在阿里巴巴內部廣泛使用的GA版本為:2.4.9,強烈推薦此版本 -->
        <dubbo.version>2.5.3</dubbo.version>
        <dubbox.version>2.8.4</dubbox.version>
        <spring.version>4.3.6.RELEASE</spring.version>
        <java.version>1.7</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
      <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.3</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
        <!-- spring相關 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${spring.version}</