學習目標:
- 瞭解應用架構演進過程
- 瞭解RPC技術
- 掌握Dubbo框架的架構
- 掌握Zookeeper註冊中心的基本使用
- 掌握Dubbo生產者和消費者的開發
- 瞭解Dubbo的管理控制檯的使用
- 瞭解Dubbo的相關配置
1. 應用架構的演進過程
單一應用架構
當網站流量很小時,只需一個應用,將所有功能都部署在一起,以減少部署節點和成本。此時,用於簡化增刪改查工作量的數據訪問框架(ORM)是關鍵。
垂直應用架構
當訪問量逐漸增大,單一應用增加機器帶來的加速度越來越小,將應用拆成互不相干的幾個應用,以提升效率。此時,用於加速前端頁面開發的Web框架(MVC)是關鍵。
分佈式服務架構
當垂直應用越來越多,應用之間交互不可避免,將核心業務抽取出來,作爲獨立的服務,逐漸形成穩定的服務中心,使前端應用能更快速的響應多變的市場需求。此時,用於提高業務複用及整合的分佈式服務框架(RPC)是關鍵。
流動計算架構
當服務越來越多,容量的評估,小服務資源的浪費等問題逐漸顯現,此時需增加一個調度中心基於訪問壓力實時管理集羣容量,提高集羣利用率。此時,用於提高機器利用率的資源調度和治理中心(SOA)是關鍵。
2. RPC(遠程過程調用)
RPC介紹
Remote Procedure Call 遠程過程調用,是分佈式架構的核心,按響應方式分如下兩種:
同步調用:客戶端調用服務方方法,等待直到服務方返回結果或者超時,再繼續自己的操作。
異步調用:客戶端把消息發送給中間件,不再等待服務端返回,直接繼續自己的操作。
- 是一種進程間的通信方式
- 它允許應用程序調用網絡上的另一個應用程序中的方法
- 對於服務的消費者而言,無需瞭解遠程調用的底層細節,是透明的
需要注意的是RPC並不是一個具體的技術,而是指整個網絡遠程調用過程。
RPC是一個泛化的概念,嚴格來說一切遠程過程調用手段都屬於RPC範疇。各種開發語言都有自己的RPC框架。Java中的RPC框架比較多,廣泛使用的有RMI、Hessian、Dubbo等。
RPC組件
簡單來說一個RPC架構裏包含如下4個組件:
1、 客戶端(Client):服務調用者
2、 客戶端存根(Client Stub):存放服務端地址信息,將客戶端的請求參數打包成網絡消息,再通過網絡發送給服務方
3、 服務端存根(Server Stub):接受客戶端發送過來的消息並解包,再調用本地服務
4、 服務端(Server):服務提供者。
RPC調用
1、 服務調用方(client)調用以本地調用方式調用服務;
2、 client stub接收到調用後負責將方法、參數等組裝成能夠進行網絡傳輸的消息體
在Java裏就是序列化的過程
3、 client stub找到服務地址,並將消息通過網絡發送到服務端;
4、 server stub收到消息後進行解碼,在Java裏就是反序列化的過程;
5、 server stub根據解碼結果調用本地的服務;
6、 本地服務執行處理邏輯;
7、 本地服務將結果返回給server stub;
8、 server stub將返回結果打包成消息,Java裏的序列化;
9、 server stub將打包後的消息通過網絡併發送至消費方;
10、 client stub接收到消息,並進行解碼, Java裏的反序列化;
11、 服務調用方(client)得到最終結果。
3. Apache Dubbo概述
Dubbo簡介
Apache Dubbo是一款高性能的Java RPC框架。其前身是阿里巴巴公司開源的一個高性能、輕量級的開源Java RPC框架,可以和Spring框架無縫集成。
Dubbo官網地址:http://dubbo.apache.org
Dubbo提供了三大核心能力:面向接口的遠程方法調用,智能容錯和負載均衡,以及服務自動註冊和發現。
Dubbo的架構
Dubbo架構圖(Dubbo官方提供)如下:
節點角色說明:
節點 | 角色名稱 |
---|---|
Provider | 暴露服務的服務提供方 |
Consumer | 調用遠程服務的服務消費方 |
Registry | 服務註冊與發現的註冊中心 |
Monitor | 統計服務的調用次數和調用時間的監控中心 |
Container | 服務運行容器 |
虛線都是異步訪問,實線都是同步訪問
藍色虛線:在啓動時完成的功能
紅色虛線(實線)都是程序運行過程中執行的功能
調用關係說明:
-
服務容器負責啓動,加載,運行服務提供者。
-
服務提供者在啓動時,向註冊中心註冊自己提供的服務。
-
服務消費者在啓動時,向註冊中心訂閱自己所需的服務。
-
註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連接推送變更數據給消費者。
-
服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,如果調用失敗,再選另一臺調用。
-
服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。
4. 服務註冊中心Zookeeper
通過前面的Dubbo架構圖可以看到,Registry(服務註冊中心)在其中起着至關重要的作用。Dubbo官方推薦使用Zookeeper作爲服務註冊中心。
Zookeeper介紹
Zookeeper 是 Apache Hadoop 的子項目,是一個樹型的目錄服務,支持變更推送,適合作爲 Dubbo 服務的註冊中心,工業強度較高,可用於生產環境,並推薦使用 。
爲了便於理解Zookeeper的樹型目錄服務,我們先來看一下我們電腦的文件系統(也是一個樹型目錄結構):
我的電腦可以分爲多個盤符(例如C、D、E等),每個盤符下可以創建多個目錄,每個目錄下面可以創建文件,也可以創建子目錄,最終構成了一個樹型結構。通過這種樹型結構的目錄,我們可以將文件分門別類的進行存放,方便我們後期查找。而且磁盤上的每個文件都有一個唯一的訪問路徑,例如:C:\Windows\itcast\hello.txt。
Zookeeper樹型目錄服務:
流程說明:
- 服務提供者(Provider)啓動時: 向
/dubbo/com.foo.BarService/providers
目錄下寫入自己的 URL 地址 - 服務消費者(Consumer)啓動時: 訂閱
/dubbo/com.foo.BarService/providers
目錄下的提供者 URL 地址。並向/dubbo/com.foo.BarService/consumers
目錄下寫入自己的 URL 地址 - 監控中心(Monitor)啓動時: 訂閱
/dubbo/com.foo.BarService
目錄下的所有提供者和消費者 URL 地址
支持以下功能:
- 當提供者出現斷電等異常停機時,註冊中心能自動刪除提供者信息
- 當註冊中心重啓時,能自動恢復註冊數據,以及訂閱請求
- 當會話過期時,能自動恢復註冊數據,以及訂閱請求
Zookeeper安裝
下載地址:http://archive.apache.org/dist/zookeeper/
本課程使用的Zookeeper版本爲3.4.6,下載完成後可以獲得名稱爲zookeeper-3.4.6.tar.gz的壓縮文件。既可以在window環境運行,也可以在Linux環境運行。
步驟:
第一步:把 zookeeper 的壓縮包(zookeeper-3.4.6.tar.gz)
第二步:解壓縮壓縮包,使用7-Zip解壓。
第三步:進入zookeeper-3.4.6目錄,創建data目錄
第四步:進入conf目錄 ,把zoo_sample.cfg 改名爲zoo.cfg
第五步:打開zoo.cfg文件, 修改data屬性:dataDir=…/data
第六步:進入Zookeeper的bin目錄,雙擊zkServer.cmd,啓動Zookeeper服務
實現過程:
-
把 zookeeper 的壓縮包(zookeeper-3.4.6.tar.gz),解壓縮壓縮包,使用7-Zip解壓。
-
進入zookeeper-3.4.6目錄,創建data目錄[外鏈圖片轉存失敗,源站可能有防盜鏈機制,
-
進入conf目錄 ,把zoo_sample.cfg 改名爲zoo.cfg
-
打開zoo.cfg文件, 修改data屬性:dataDir=…/
-
進入Zookeeper的bin目錄,雙擊zkServer.cmd,啓動Zookeeper服務
小節:
dataDir的目錄配置是不正確,啓動會失敗。
注意:確保安裝 jdk環境,因爲Zookeeper是Java語言開發
在window環境下,我們執行zkServer.cmd。Linux環境我們執行zkServer.sh。
Zookeeper客戶端命令
啓動客戶端,在安裝目錄下,直接雙擊zkCli.cmd文件
-
ls 節點路徑 --查看指定節點下的內容
輸入 ls / 可以查看根目錄下節點,如果使用過dubbo,肯定有 dubbo子節點,dubbo註冊過的服務都在/dubbo子節點下。
- ls2 節點路徑 --查看指定節點的詳細信息 查看所有子節點和當前節點的狀態
# 節點的狀態信息,也稱爲stat結構體
# 創建該znode的事務的zxid(ZooKeeper Transaction ID)
# 事務ID是ZooKeeper爲每次更新操作/事務操作分配一個全局唯一的id,表示zxid,值越小,表示越先執行
cZxid = 0x4454 # 0x0表示十六進制數0
ctime = Thu Jan 01 08:00:00 CST 1970 # 創建時間
mZxid = 0x4454 # 最後一次更新的zxid
mtime = Thu Jan 01 08:00:00 CST 1970 # 最後一次更新的時間
pZxid = 0x4454 # 最後更新的子節點的zxid
cversion = 5 # 子節點的變化號,表示子節點被修改的次數
dataVersion = 0 # 當前節點的變化號,0表示從未被修改過
aclVersion = 0 # 訪問控制列表的變化號 access control list
# 如果臨時節點,表示當前節點的擁有者的sessionId
ephemeralOwner = 0x0 # 如果不是臨時節點,則值爲0
dataLength = 13 # 數據長度
numChildren = 1 # 子節點數據
-
get 節點路徑 獲取節點中的值
內容就是上面紅框裏面的內容
-
delete 節點路徑 刪除節點 只能刪除空節點,即不能有子節點
-
rmr 節點路徑 遞歸刪除節點 remove recursion
-
stat 節點路徑 查看節點狀態
5. Dubbo快速開發
Dubbo作爲一個RPC框架,其最核心的功能就是要實現跨網絡的遠程調用,服務提供者、服務消費者會使用共同的接口,故本小節先創建一個父工程,父工程下有3個子模塊,一個是接口模塊,一個是服務提供者模塊,一個是服務消費者模塊。通過Dubbo來實現服務消費方遠程調用服務提供方的方法。
實現步驟:
1. 創建父工程,基於maven,不選擇任何骨架,工程名:study-dubbo
2. 創建接口子模塊,在父工程的基礎上,不選擇任何骨架,模塊名:dubbo-interface
3. 創建服務提供者子模塊,在父工程的基礎上,使用webapp骨架,模塊名:dubbo-provider
4. 創建消費者模子塊,在父工程的基礎上,使用webapp骨架,模塊名:dubbo-consumer
1. 創建父工程
父工程,不實現任何代碼,主要是添加工程需要的庫的依賴管理(DependencyManagement),依賴管理就是解決項目中多個模塊間公共依賴的版本號、scope的控制範圍。本項目需要使用spring-webmvc,使用dubbo(務必2.6.2以上版本)、zookeeper及其客戶端(curator-framework)依賴庫。
-
不選擇任何骨架
-
GroupID:com.itheima.study.dubbo
-
ArtifactId:study-dubbo
-
project name:studydubbo
- 創建完工程後,如圖所示:
- 父工程不實現任何代碼,刪除 src 目錄,如圖所示:
- 修改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.itheima.study.dubbo</groupId>
<artifactId>study-dubbo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<spring.version>5.0.5.RELEASE</spring.version>
<dubbo.version>2.6.2</dubbo.version>
<zookeeper.version>3.4.13</zookeeper.version>
<curator-framework.version>4.0.1</curator-framework.version>
</properties>
<dependencyManagement>
<dependencies>
<!--spring webmvc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!--dubbo-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<!--zookeeper-->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>${zookeeper.version}</version>
</dependency>
<!--zookeeper client-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>${curator-framework.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
依賴管理,僅僅配置依賴關係,不會導入具體的庫依賴包,只有子模塊具體需要時,纔會導入jar包。
如圖所示:
2. 創建接口模塊
此模塊,主要放業務接口的定義,它是服務消費者模塊和服務提供者模塊的公共依賴模塊。
- 在當前父工程的基礎上創建子模塊
- 不選擇任何骨架
- GroupID:com.itheima.study.dubbo
- ArtifactId:dubbo-interface
- moudule name:dubbo-interface
- 創建子模塊:
.png)]
-
修改pom.xml,增加打包方式
<packaging>jar</packaging>
如圖所示:
-
創建包com.itheima.study.dubbo.service
-
增加用戶業務接口
public interface UserSerivce {
/**
* 登錄方法
* @param username 用戶名
* @param password 密碼
* @return
*/
public boolean login(String username,String password);
}
如圖所示:
3. 服務提供者模塊
此模塊是服務提供者模塊,需要在容器啓動時,把服務註冊到zookeeper,故需要引入spring-webmvc,zookeeper及客戶端依賴。
實現步驟:
-
創建子模塊dubbo-provider,使用webapp骨架,導入依賴座標spring-webmvc、zookeeper及客戶端和編譯插件tomcat7
-
創建java源代碼目錄,並增加com.itheima.study.dubbo.service.impl包及創建UserServiceImpl實現類
業務實現類UserServiceImpl,需要實現UserService接口
-
創建resources資源目錄,並創建spring-dubbo-provider.xml 配置文件:
- 配置dubbo的應用名稱
- 配置dubbo註冊中心Zookeeper地址
- 配置dubbo協議名稱和服務端口
- 配置dubbo註解包掃描
- 配置spring自動掃描
- 配置需要暴露的業務接口及實例
-
將資料的log4j.properties配置文件拷貝到resources目錄下
-
在web.xml文件中,配置spring監聽器,指定spring配置文件加載位置
-
啓動服務提供者
實現過程:
1. 創建子模塊dubbo-provider
- 在當前父工程的基礎上創建子模塊
- 選擇webapp骨架
- GroupID:com.itheima.study.dubbo
- ArtifactId:dubbo-provider
- moudule name:dubbo-provider
工程創建完成後,如圖所示:
修改pom.xml文件,增加依賴庫,刪除build標籤中的pluginManagement,新增編譯插件tomcat7,端口6001
<?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">
<parent>
<artifactId>study-dubbo</artifactId>
<groupId>com.itheima.study.dubbo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dubbo-provider</artifactId>
<packaging>war</packaging>
<name>dubbo-provider</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.itheima.study.dubbo</groupId>
<artifactId>dubbo-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</dependency>
</dependencies>
<build>
<finalName>dubbo-provider</finalName>
<plugins>
<plugin>
<artifactId>tomcat7-maven-plugin</artifactId>
<groupId>org.apache.tomcat.maven</groupId>
<configuration>
<path>/</path>
<port>6001</port>
</configuration>
</plugin>
</plugins>
</build>
</project>
2. 初始化java資源目錄
在main下,創建子目錄java(刷新maven工程),增加com.itheima.study.dubbo.service.impl包及創建UserServiceImpl實現類
3. 初始化resources目錄
在main下,創建子目錄resources目錄,在resources目錄下創建spring-dubbo-provider.xml 配置文件和log4j的配置文件。
引用dubbo命名空間時,注意如圖所示:
- 配置dubbo的應用名稱
- 配置dubbo註冊中心Zookeeper地址
- 配置dubbo協議名稱和服務端口(僅服務提供者配置)
- 配置dubbo註解包掃描
- 配置spring自動掃包,後續使用Dao相關內容使用
- 配置需要暴露的業務接口及實例
最終spring-dubbo-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" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--spring自動掃包,後續Dao使用-->
<context:component-scan base-package="com.itheima.study"/>
<!-- dubbo基本配置-->
<dubbo:application name="dubbo-provider"/>
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<dubbo:protocol name="dubbo" port="8888"/>
<!-- dubbo自動掃包,註解時使用-->
<dubbo:annotation package="com.itheima.study.dubbo.service.impl"/>
<!--指定暴露的服務接口及實例-->
<dubbo:service interface="com.itheima.study.dubbo.service.UserSerivce" ref="userSerivce"/>
<!--配置業務類實例-->
<bean id="userSerivce" class="com.itheima.study.dubbo.service.impl.UserServiceImpl"/>
</beans>
將資料的log4j.properties配置文件拷貝到resources目錄下
4. 配置web.xml文件
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
5. 啓動服務提供者
需要在父工程整體clean、install後,在子模塊使用tomcat7插件運行
1、父工程clean、install
2、啓動當前應用,啓動後默認註冊服務到zookeeper註冊中心
3、檢查是否註冊到zookeeper
登錄zookeeper客戶端,直接查看ls /dubbo/com.itheima.study.dubbo.service.UserService節點
-
如果 /dubbo下面沒有這個節點,說明沒有註冊上,
-
如果有,內容是空,說明已經掉線
-
正常註冊並連接在線,如果所示:
注意:
- 消費者與提供者應用名稱不能相同
- 如果有多個服務提供者,名稱不能相同,通信端口也不能相同
- 只有服務提供者纔會配置服務發佈的協議
4. 服務消費者模塊
此模塊是服務消費者模塊,此模塊基於是Web應用,需要引入spring-webmvc,需要在容器啓動時,去zookeeper註冊中心訂閱服務,需要引入zookeeper及客戶端依賴。
實現步驟:
-
創建子模塊dubbo-consumer,使用webapp骨架,導入依賴座標spring-webmvc、zookeeper及客戶端和編譯插件tomcat7
-
創建java源代碼目錄,並增加com.itheima.study.dubbo.controller包及創建UserController類
控制器類UserController,提供web方法login
-
創建resources資源目錄,並創建spring-dubbo-consumer.xml 配置文件:
- 配置dubbo的應用名稱
- 配置dubbo註冊中心Zookeeper地址
- 配置dubbo協議名稱和服務端口
- 配置dubbo註解包掃描
- 配置spring自動掃描
- 配置需要訂閱的業務接口及引用
-
將資料的log4j.properties配置文件拷貝到resources目錄下
-
在web.xml文件中,配置SpringMVC
-
啓動服務消費者,並測試訪問
實現過程:
1. 創建子模塊dubbo-consumer
- 在當前父工程的基礎上創建子模塊
- 選擇webapp骨架
- GroupID:com.itheima.study.dubbo
- ArtifactId:dubbo-consumer
- moudule name:dubbo-consumer
工程創建完成後,如圖所示:
修改pom.xml文件,增加依賴庫,刪除build標籤中的pluginManagement,新增編譯插件tomcat7,端口6002
<?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">
<parent>
<artifactId>study-dubbo</artifactId>
<groupId>com.itheima.study.dubbo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dubbo-consumer</artifactId>
<packaging>war</packaging>
<name>dubbo-consumer</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.itheima.study.dubbo</groupId>
<artifactId>dubbo-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
</dependency>
</dependencies>
<build>
<finalName>dubbo-consumer</finalName>
<plugins>
<plugin>
<artifactId>tomcat7-maven-plugin</artifactId>
<groupId>org.apache.tomcat.maven</groupId>
<configuration>
<path>/</path>
<port>6002</port>
</configuration>
</plugin>
</plugins>
</build>
</project>
2. 初始化java資源目錄
在main下,創建子目錄java(刷新maven工程),增加com.itheima.study.dubbo.controller包及創建UserController控制類(通過配置文件初始化),該類調用遠程業務UserService實現登錄。
3. 初始化resources資源目錄
在main下,創建子目錄resources目錄,在resources目錄下創建spring-dubbo-consumer.xml 配置文件和log4j的配置文件。
引用dubbo命名空間時,注意如圖所示:
- 配置dubbo的應用名稱
- 配置dubbo註冊中心Zookeeper地址
- 配置dubbo註解包掃描,後續註解遠程Service時使用
- 配置spring自動掃包,後續註解控制器相關內容使用
- 配置需要暴露的業務接口及實例
最終spring-dubbo-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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--spring自動掃包,使用註解時使用-->
<context:component-scan base-package="com.itheima.study.dubbo.controller"/>
<!-- dubbo基本配置-->
<dubbo:application name="dubbo-consumer"/>
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<!--訂閱遠程服務對象-->
<dubbo:reference id="userService" interface="com.itheima.study.dubbo.service.UserSerivce"/>
<!-- dubbo自動掃包,註解遠程Service時使用-->
<dubbo:annotation package="com.itheima.study.dubbo.controller"/>
<!--初始化控制器,並把遠程service 注入到controller -->
<bean class="com.itheima.study.dubbo.controller.UserController" >
<property name="userService" ref="userService"/>
</bean>
</beans>
4. 配置web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
5. 啓動服務消費者並測試
在瀏覽器輸入http://localhost:6002/user/login.do?username=admin&password=123,查看瀏覽器輸出結果
6. Dubbo管理控制檯
我們在開發時,需要知道Zookeeper註冊中心都註冊了哪些服務,有哪些消費者來消費這些服務。我們可以通過部署一個管理中心來實現。其實管理中心就是一個web應用,部署到tomcat即可。
1. 安裝
安裝步驟:
(1)將資料中的dubbo-admin-2.6.0.war文件複製到tomcat的webapps目錄下
(2)啓動tomcat,此war文件會自動解壓
(3)修改WEB-INF下的dubbo.properties文件
# 注意dubbo.registry.address對應的值需要對應當前使用的Zookeeper的ip地址和端口號
dubbo.registry.address=zookeeper://localhost:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest
(4)重啓tomcat
2. 使用
操作步驟:
(1)訪問http://localhost:8080/dubbo-admin-2.6.0/,輸入用戶名(root)和密碼(root)
(2)啓動服務提供者工程和服務消費者工程,可以在查看到對應的信息
7. Dubbo相關配置說明
1. 包掃描
<dubbo:annotation package="com.itheima.study" />
服務提供者和服務消費者前面章節實現都是基於配置文件進行服務註冊與訂閱,如果使用包掃描,可以使用註解方式實現,推薦使用這種方式。
1.服務提供者,使用註解實現
- 把spring-dubbo-provider中的服務註冊配置註釋掉,如圖所示
- 在UserServiceImpl類中頭部,使用註解
2.服務消費者,使用註解實現
- 把spring-dubbo-consumer中的控制器初始化及服務訂閱配置註釋掉,如圖所示
-
採用註解初始化控制器
在控制器頭部加入@Controller,如圖所示:
-
採用註解訂閱遠程服務對象
把原來通過配置文件的實現註釋掉,然後在private UserService userService前面,使用@Reference,來訂閱遠程服務對象。
如圖所示:
3.重啓服務測試使用
-
重啓服務提供者模塊 dubbo-provider
-
重啓服務消費者模塊 dubbo-consumer
-
在瀏覽器輸入測試URL:
http://localhost:6002/user/login.do?username=admin&password=123,查看瀏覽器輸出結果。
2. 服務接口訪問協議
<dubbo:protocol name="dubbo" port="8888"/>
一般在服務提供者一方配置,可以指定使用的協議名稱和端口號。
其中Dubbo支持的協議有:dubbo、rmi、hessian、http、webservice、rest、redis等。
推薦使用的是dubbo協議。
dubbo 協議採用單一長連接和 NIO 異步通訊,適合於小數據量大併發的服務調用,以及服務消費者機器數遠大於服務提供者機器數的情況。不適合傳送大數據量的服務,比如傳文件,傳視頻等,除非請求量很低。
也可以在同一個工程中配置多個協議,不同服務可以使用不同的協議,例如:
<!-- 多協議配置 -->
<dubbo:protocol name="dubbo" port="8888" />
<dubbo:protocol name="rmi" port="1099" />
3. 負載均衡
負載均衡(Load Balance):其實就是將請求分攤到多個操作單元上進行執行,從而共同完成工作任務。
在集羣負載均衡時,Dubbo 提供了多種均衡策略(包括隨機random、輪詢roundrobin、最少活躍調用數leastactive),缺省爲random隨機調用。
配置負載均衡策略,既可以在服務提供者一方配置,也可以在服務消費者一方配置,兩者取一
- 如下服務提供者指定負載均衡策略:
@Service(loadbalance = "roundrobin")
public class UserServiceImpl implements UserSerivce {
@Override
public boolean login(String username, String password) {
System.out.println(" 8881 login,username:"+username+" password:"+password);
// 模擬用戶驗證登錄過程,正式開發時通過Dao來驗證
if ("admin".equals(username) && "123".equals(password)){
return true;
}
return false;
}
}
-
如下在服務消費者指定負載均衡策略
@Controller @RequestMapping("/user") public class UserController { @Reference(loadbalance = "roundrobin") private UserSerivce userService;
-
測試負載均衡效果
正式生產環境中,最終會把服務端部署到多臺機器上,故不需要修改任何代碼,只需要部署到不同機器即可測試。如果是單機測試,只能把服務提供者的程序通過修改dubbo協議端口和web服務端口來進行區分部署。
-
服務端不指定負載策略,啓動第1個實例
- 爲了看得調用效果,修改服務實現源碼,加入打印信息,比如【實際開發,無需此操作,謹記】
-
+ 修改 spring-dubbo-provider.xml,把dubbo通信端口改爲8881
【實際開發,如部署到多個機器,無需此操作】
+ 修改pom.xml,端口改爲8001
【實際開發,如部署到多個機器,無需此操作】
+ 啓動tomcat
-
服務端不指定負載策略,啓動第2個實例
- 修改服務實現源碼,加入打印信息,比如
+ 修改 spring-dubbo-provider.xml,把dubbo通信端口改爲8882
+ 修改pom.xml,端口改爲8002
+ 啓動tomcat7
參考上一章節,啓動方式
+ 查看dubbo控制檯
啓動了兩個服務實例
- 客戶端指定負載策略(輪詢策略)
-
訪問測試
啓動客戶端,在瀏覽器訪問多次,進行測試
第1次訪問,訪問的是8001端口的服務提供者
可以同時查看8001、8002控制檯的輸出,此時8881打印輸出結果,8882並沒有被調用
第2次訪問,訪問的是8002端口的服務提供者
可以同時查看8001、8002控制檯的輸出,此時8881沒有輸出結果,8882有打印輸出結果
第3次訪問,訪問的是8001端口的服務提供者
第4次訪問,訪問的是8002端口的服務提供者