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</