1. 程式人生 > >Dubbo深度詳解,及結合Zookeeper、SSM的RPC實戰

Dubbo深度詳解,及結合Zookeeper、SSM的RPC實戰

一、SOA

1.SOA概念

2.SOA定位

3.老的專案架構設計

3.1 企業專案不允許所有專案都訪問DB

3.2 開發時DB訪問層程式碼冗餘

4.使用SOA架構

4.1 專門訪問DB服務(專案)

4.2 開發時可以實現DB訪問層和程式碼複用

5.實現SOA的幾種常用服務

二、RPC

1.RPC概念

三、Dubbo

1.Dubbo簡介

2.Dubbo架構圖

3.執行原理

4.註冊中心

4.1 Zookeeper註冊中心

4.2 Redis註冊中心

4.3 Multicast註冊中心

4.4 Simple註冊中心

5.協議

5.1 Dubbo協議

5.2 Rmi協議

5.3 Hessian協議

6.Dubbo中Provider搭建

7.Consumer搭建

8.Admin管理介面


一、SOA

1.SOA概念

面向服務的架構(SOA Service Oriented Ambiguity )是一個元件模型,它將應用程式的不同功能單元(稱為服務)通過這些服務之間定義良好的介面和契約聯絡起來。介面是採用中立的方式進行定義的,它應該獨立於實現服務的硬體平臺、作業系統和程式語言。這使得構建在各種各樣的系統中的服務可以以一種統一和通用的方式進行互動。

1)有一個專門提供服務的單元

2)其他所有單元都呼叫這個服務

2.SOA定位

2.1 如何設計專案讓開發更有效率

2.2 SOA是一種思想

3.老的專案架構設計

3.1 企業專案不允許所有專案都訪問DB

3.2 開發時DB訪問層程式碼冗餘

 

 

4.使用SOA架構

4.1 專門訪問DB服務(專案)

4.2 開發時可以實現DB訪問層和程式碼複用

5.實現SOA的幾種常用服務

5.1 Dubbo

5.2 WebService

5.3 Dubbox

5.4 服務方(一個Web專案,呼叫Web專案的控制器)

二、RPC

1.RPC概念

RPC(Remote Procedure Call)—

遠端過程呼叫,它是一種通過網路從遠端計算機程式上請求服務,而不需要了解底層網路技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,為通訊程式之間攜帶資訊資料。在OSI網路通訊模型中,RPC跨越了傳輸層應用層。RPC使得開發包括網路分散式多程式在內的應用程式更加容易。

RPC採用客戶機/伺服器模式。請求程式就是一個客戶機,而服務提供程式就是一個伺服器。首先,客戶機呼叫程序傳送一個有程序引數的呼叫資訊到服務程序,然後等待應答資訊。在伺服器端,程序保持睡眠狀態直到呼叫資訊到達為止。當一個呼叫資訊到達,伺服器獲得程序引數,計算結果,傳送答覆資訊,然後等待下一個呼叫資訊,最後,客戶端呼叫程序接收答覆資訊,獲得程序結果,然後呼叫執行繼續進行。

有多種 RPC模式和執行。最初由 Sun 公司提出。IETF ONC 憲章重新修訂了 Sun 版本,使得 ONC RPC 協議成為 IETF 標準協議。現在使用最普遍的模式和執行是開放式軟體基礎的分散式計算環境(DCE)。

(備註:RPC最大的優點就是資料安全性)

三、Dubbo

1.Dubbo簡介

Dubbo是阿里巴巴公司開源的一個高效能優秀的服務框架,使得應用可通過高效能的 RPC 實現服務的輸出和輸入功能,可以和 Spring框架無縫整合。

1)Dubbo是一個分散式、高效能、透明化的RPC服務框架

2)作用:提供服務自動註冊、自動發現等高效服務治理方案

2.Dubbo架構圖

1)Provider: 提供者、服務釋出方

2)Consumer: 消費者,呼叫服務方

3)Container: Dubbo容器,依賴於Spring容器(與Spring強耦合)

4)Registry: 註冊中心,當Container啟動時把所有可以提供的服務在Registry中進行註冊

(備註:Registry的作用是告訴Consumer提供了什麼服務和服務方在哪裡)

5)Monitor: 監聽器(非必須)

(備註:以上5各部分可以在不同的伺服器上,所以必須遵守網路協議)

3.執行原理

1)啟動容器,相當於啟動Dubbo的Provider

2)Provider去註冊中心進行註冊,註冊所有可以提供的服務列表

3)Consumer去Registry中獲取服務列表和Provider的地址

4)根據獲取的Provider地址,真實呼叫Provider中的功能

(備註:當Provider修改後,註冊中心會把訊息推送給Consumer

Dubbo中的Registry和Consumer之間使用了觀察者設計模式

Dubbo中的Consumer用Provider的服務使用了代理設計模式,Consumer使用Provider的一 個動態代理物件,來實現保護Provider真實物件的作用)

5)Consumer和Provider消費/提供服務後向Monitor傳送統計資訊,包括:訪問次數、頻率

4.註冊中心

4.1 Zookeeper註冊中心

優點:支援基於網路的叢集方式,有廣泛周邊開源產品

缺點:穩定性受限於Zookeeper

1) Zookeeper 分散式協調元件(本身是一個軟體,用Java語言編寫的)

2) Zookeeper常用功能

  • 釋出訂閱功能,把Zookeeper當做註冊中心
  • 分散式管理功能

4.2 Redis註冊中心

優點:支援基於客戶端雙寫的叢集方式,效能高

缺點:要求伺服器時間同步,用於檢測心跳過期髒資料,對伺服器環境要求較高

4.3 Multicast註冊中心

優點:去中心化,不需要安裝註冊中心

缺點:依賴於網路拓撲和路由,跨機房有風險

4.4 Simple註冊中心

優點:Dogfooding,註冊中心本身也是標準的RPC服務

缺點:沒有叢集支援,可能單點故障(適用於測試環境,專案執行環境幾乎沒使用)

5.協議

5.1 Dubbo協議

優點:採用NIO複用單一長連線,並使用執行緒池併發處理請求,減少握手和加大併發效率,效能較好

缺點:在大檔案傳輸時,單一連線會成為瓶頸

5.2 Rmi協議

優點:可與原生RMI戶操作,基於TCP協議

缺點:偶爾會連線失敗,需重建Stub

5.3 Hessian協議

優點:可與原生Hessian互操作,基於HTTP協議

缺點:需要Hessian.jar支援,http短連線的開銷大

6.Dubbo中Provider搭建

  • 新建一個Maven Project,專案中只有介面(dubo-service)

(備註:Dubbo是一個RPC框架,不希望Consumer知道所需功能的具體實現,如果實現類和介面在同一個專案中,Consumer依賴此專案時,就會知道實現類的具體功能實現程式碼。)

  • 新建一個Maven project,寫介面的實現類(dubbo-service-imple)
  • 配置dubbo-service-impl專案的pom.xml
<?xml version="1.0" encoding="UTF-8"?>

<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.hcj</groupId>

<artifactId>dubbo-service-impl</artifactId>

<version>1.0-SNAPSHOT</version>

<dependencies>

<!--依賴介面專案-->

<dependency>

<groupId>com.hcj</groupId>

<artifactId>dubbo-service</artifactId>

<version>1.0.0</version>

</dependency>

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>dubbo</artifactId>

<version>2.5.3</version>

<!--防止專案依賴老版本的spring-->

<exclusions>

<exclusion>

<artifactId>spring</artifactId>

<groupId>org.springframework</groupId>

</exclusion>

</exclusions>

</dependency>

<!--dubbo所需的老版本spring-->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

<version>2.5.6</version>

</dependency>

<!--新版本spring-->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-webmvc</artifactId>

<version>4.3.18.RELEASE</version>

</dependency>

<!--zookeeper的jar包-->

<dependency>

<groupId>com.101tec</groupId>

<artifactId>zkclient</artifactId>

<version>0.10</version>

</dependency>

</dependencies>

</project>
  • 在專案的resources中新建META-INF/spring資料夾,在資料夾中新建dubbo-application-context.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:context="http://www.springframework.org/schema/context"

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://www.springframework.org/schema/context

http://www.springframework.org/schema/spring-context.xsd

http://code.alibabatech.com/schema/dubbo

http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

<!--給當前Provider自定義名稱,用於區別不同的Provider-->

<dubbo:application name="dubbo-service"/>

<!--配置註冊中心 address:zookeeper伺服器ip+埠 protocol:表明註冊中心使用的是zookeeper-->

<dubbo:registry address="192.168.1.11:2181" protocol="zookeeper"/>

<!--配置Provider服務的埠 name:所使用的協議 port:Consumer呼叫功能時所使用的埠號(port配置什麼埠,就會佔用啟動該服務的計算機的埠-->

<dubbo:protocol name="dubbo" port="20880" />

<!--註冊介面 ref:引用介面的實現類的bean id-->

<dubbo:service interface="com.hcj.service.DemoService" ref="demoServiceImpl"/>

<bean id="demoServiceImpl" class="com.hcj.service.impl.DemoServiceImpl"/>

<!--使用註解方式,可以省略<dubbo:service../>和<bean id.../>但是會和Spring 的宣告式事務產生衝突,不建議使用-->

<!--<dubbo:annotation package="com.hcj.service.impl"/>-->

</beans>
  • 使用dubbo提供的方式啟動容器
public static void main(String[] args) {

// 使用該方法啟動要求配置檔案必須放在/META-INF/spring/下

Main.main(args);

}

7.Consumer搭建

  • 建立一個標準的SSM專案,在pom.xml中新增Dubbo相關的三個依賴(介面、zkClient、Dubbo)
  • 修改web.xml中<context-param>標籤
<context-param>

<param-name>contextConfigLocation</param-name>

<!-- -*.xml可以匹配所有applicationContext-開頭的xml檔案,這樣可以載入spring和dubbo的配置檔案-->

<param-value>classpath:applicationContext-*.xml</param-value>

</context-param>
  • 在pom.xml中新增dubbo依賴
<!--Dubbo-->

<dependency>

<groupId>com.hcj</groupId>

<artifactId>dubbo-service</artifactId>

<version>1.0.0</version>

</dependency>

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>dubbo</artifactId>

<version>2.5.3</version>

<exclusions>

<exclusion>

<artifactId>spring</artifactId>

<groupId>org.springframework</groupId>

</exclusion>

</exclusions>

</dependency>

<!--zookeeper zkclient jar包-->

<dependency>

<groupId>com.101tec</groupId>

<artifactId>zkclient</artifactId>

<version>0.10</version>

</dependency>

(備註:因為pom.xml原本已有ssm框架所依賴的jar座標,因此不需要再新增spring-webmvc座標,否則會依賴衝突)

  • 在resources中新增dubbo配置檔案
<?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:context="http://www.springframework.org/schema/context"

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://www.springframework.org/schema/context

http://www.springframework.org/schema/spring-context.xsd

http://code.alibabatech.com/schema/dubbo

http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

<!--給當前Provider自定義名稱,用於區別不同的Provider-->

<dubbo:application name="dubbo-service"/>

<!--配置註冊中心 address:zookeeper伺服器ip+埠 protocol:表明註冊中心使用的是zookeeper-->

<dubbo:registry address="192.168.1.11:2181" protocol="zookeeper"/>

<!--用於掃描實現類中@Reference註解-->

<dubbo:annotation package="com.hcj.service.impl"/>

</beans>
  • 在業務實現類中新增RPC介面
//import com.alibaba.dubbo.config.annotation.Reference;

@Reference

private DemoService service;

(備註:

//相當於替代原本SSM框架中業務實現類的mapper

@Resource

private TestMapper mapper;)

  • 除了以上四個步驟,其餘部分和原本SSM框架搭建、使用方法一致

8.Admin管理介面

本質為一個web專案,用於獲取註冊中心內Provider註冊的資訊,再以web介面呈現。

  • 將dubbo-admin-2.6.0.war上傳至Tomcat伺服器的webapps中
  • 使用startup.sh啟動伺服器後再關閉Tomcat,刪除之前上傳的dubbo-admin-2.6.0.war

(備註:因為需要修改dubbo-admin-2.6.0中的檔案內容,不刪除war,下次啟動Tomat,伺服器啟動後會解壓war覆蓋原修改的dubbo-admin-2.6.0)

  • 開啟dubbo-admin-2.6.0的WEB-INF下的dubbo.properties,將內容修改為:
dubbo.registry.address=zookeeper://192.168.1.11:2181

dubbo.admin.root.password=root

dubbo.admin.guest.password=guest

(備註:第一行末尾為zookeeper的伺服器IP和埠,根據具體情況修改)

  • 啟動Tomcat伺服器
  • 啟動Dubbo,將Provider註冊到zookeeper中

(備註:顯示一下內容則說明Dubbo服務啟動成功

Dubbo service server started!)

  • 在瀏覽器中輸入http://[Tomcat伺服器IP]:8080/dubbo-admin-2.6.0
  • 使用使用者:root 密碼:root登入admin,可看到下圖介面

  • 在服務治理 -> 服務 中即可檢視到註冊中心的Provider

注意:如果Dubbo服務正常正常到zookeeper,客戶端也能正常呼叫Dubbo服務,但在admin中檢視不到註冊資訊,一般是因為dubbo-admin預設未配置分組資訊,解決方案如下:

修改dubbo-admin-2.6.0/WEB-INF/dubbo.properties檔案:

dubbo.registry.address=zookeeper://192.168.1.11:2181

dubbo.admin.root.password=root

dubbo.admin.guest.password=guest

dubbo.registry.group=dubbo

再修改dubbo-admin-2.6.0/WEB-INF/classes/META-INF/spring/dubbo-admin.xml檔案

找到:

<dubbo:registry address="${dubbo.registry.address}" check="false" file="false"/>

修改為

<dubbo:registry group="dubbo.registry.group" address="${dubbo.registry.address}" check="false" file="false"/>

再重啟Dubbo服務和Tomcat伺服器,登入到admin即可看見註冊的服務。


專案其餘參考:

Linux下安裝Tomcat8.5

Linux下部署Zookeeper

上述專案原始碼百度雲盤下載連結, 提取碼: 9nmj