一. RPC(遠(yuǎn)程過程調(diào)用)?RPC并不是一個(gè)具體的技術(shù),而是指整個(gè)網(wǎng)絡(luò)遠(yuǎn)程調(diào)用過程
RPC是一個(gè)泛化的概念,嚴(yán)格來說一切遠(yuǎn)程過程調(diào)用手段都屬于RPC范疇。各種開發(fā)語言都有自己的RPC框架。Java中的RPC框架比較多,廣泛使用的有RMI、Hessian、Dubbo等。
RPC的組件:? 1.客戶端Client(服務(wù)調(diào)用者)? 2.客戶端存根Stub: 存放服務(wù)端地址信息,將客戶端的請求參數(shù)打包成網(wǎng)絡(luò)消息,再通過網(wǎng)絡(luò)發(fā)送給服務(wù)方? ?3.服務(wù)端存根Stub: 接受客戶端發(fā)送過來的消息并解包,再調(diào)用本地服務(wù)? ?4.服務(wù)端Server: 服務(wù)提供者


二.? Apache Dubbo概述
Dubbo提供了三大核心能力:面向接口的遠(yuǎn)程方法調(diào)用,智能容錯(cuò)和負(fù)載均衡,以及服務(wù)自動注冊和發(fā)現(xiàn)。

Provider 是服務(wù)的提供方 / Consumer 調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費(fèi)方 /
Registry 服務(wù)注冊與發(fā)現(xiàn)的注冊中心? /? Monitor??統(tǒng)計(jì)服務(wù)的調(diào)用次數(shù)和調(diào)用時(shí)間的監(jiān)控中心
1. 服務(wù)容器Container負(fù)責(zé)啟動,加載,運(yùn)行服務(wù)提供者
2. 服務(wù)提供者在啟動時(shí),向注冊中心注冊自己提供的服務(wù)。
3. 服務(wù)消費(fèi)者在啟動時(shí),向注冊中心訂閱自己所需的服務(wù)。
4. 注冊中心返回服務(wù)提供者地址列表給消費(fèi)者,如果有變更,注冊中心將基于長連接推送變更數(shù)據(jù)給消費(fèi)者。
5. 服務(wù)消費(fèi)者,從提供者地址列表中,基于軟負(fù)載均衡算法,選一臺提供者進(jìn)行調(diào)用,如果調(diào)用失敗,再選另一臺調(diào)用。
6. 服務(wù)消費(fèi)者和提供者,在內(nèi)存中累計(jì)調(diào)用次數(shù)和調(diào)用時(shí)間,定時(shí)每分鐘發(fā)送一次統(tǒng)計(jì)數(shù)據(jù)到監(jiān)控中心。
三. 服務(wù)注冊中心 Zookeeper (支持變更推送)

zkServer.cmd 開啟服務(wù)? zkCli.cmd 命令
get 節(jié)點(diǎn)路徑 獲取節(jié)點(diǎn)中的值? /? delete 節(jié)點(diǎn)路徑 刪除節(jié)點(diǎn) 只能刪除空節(jié)點(diǎn),即不能有子節(jié)點(diǎn)
rmr 節(jié)點(diǎn)路徑 遞歸刪除節(jié)點(diǎn) remove recursion? /? ?stat 節(jié)點(diǎn)路徑 查看節(jié)點(diǎn)狀態(tài)
四. Dubbo快速開發(fā)(Dubbo作為RPC的框架 核心功能就是遠(yuǎn)程調(diào)用)

1. 創(chuàng)建父工程(沒有代碼,主要添加工程需要的庫的依賴管理)DependencyManagement
1.1 創(chuàng)建不選擇骨架??GroupID:com.itheima.study.dubbo??ArtifactId:study-dubbo
1.2? 因?yàn)椴粚?shí)現(xiàn)代碼 所以刪除src目錄
1.3? 修改pom.xml文件? 抽取版本、增加賴庫依賴管理? (注意dubbo版本必須2.6.2以上)
(spring webmvc / dubbo / zookeeper / zookeeper client)?
2. 創(chuàng)建接口模塊( 主要放業(yè)務(wù)接口的定義,服務(wù)消費(fèi)者模塊和服務(wù)提供者模塊公共依賴模塊)
2.1? 在父工程的基礎(chǔ)上創(chuàng)建子模塊,不選擇任何骨架 (創(chuàng)建到父工程下面)
2.2 修改pom.xml 增加打包方式
2.3 創(chuàng)建接口 寫入方法
3. 服務(wù)提供者模塊( 需要在容器啟動時(shí),把服務(wù)注冊到zookeeper中)
3.1? 使用webapp骨架創(chuàng)建模塊,導(dǎo)入依賴?spring-webmvc、zookeeper及客戶端和<build>編譯插件tomcat7
3.2?創(chuàng)建java源代碼目錄,并增加業(yè)務(wù)實(shí)現(xiàn)類UserServiceImpl,需要實(shí)現(xiàn)UserService接口
3.3?創(chuàng)建resources資源目錄,并創(chuàng)建spring-dubbo-provider.xml 配置文件:
配置dubbo的應(yīng)用名稱 /? 配置dubbo注冊中心Zookeeper地址 /? 配置dubbo協(xié)議名稱和服務(wù)端口
配置dubbo注解包掃描? /? 配置spring自動掃描 /? 配置需要暴露的業(yè)務(wù)接口及實(shí)例
3.4??將資料的log4j.properties配置文件拷貝到resources目錄下
3.5??在web.xml文件中,配置spring監(jiān)聽器,指定spring配置文件加載位置
3.6??啟動服務(wù)提供者 注意 :?消費(fèi)者與提供者應(yīng)用名稱不能相同 /
如果有多個(gè)服務(wù)提供者,名稱不能相同,通信端口也不能相同 /
只有服務(wù)提供者才會配置服務(wù)發(fā)布的協(xié)議
4. 服務(wù)消費(fèi)者模塊
模塊基于是Web應(yīng)用,需要引入spring-webmvc,需要在容器啟動時(shí),去zookeeper注冊中心訂閱服務(wù),需要引入zookeeper及客戶端依賴。
4.1? 使用webapp 骨架創(chuàng)建,導(dǎo)入依賴坐標(biāo)spring-webmvc、zookeeper及客戶端和編譯插件tomcat7
4.2? 創(chuàng)建java源代碼目錄,并添加 UserController類 (控制器類UserController,提供web方法login)
4.3??創(chuàng)建resources資源目錄,并創(chuàng)建spring-dubbo-consumer.xml 配置文件:
配置dubbo的應(yīng)用名稱 /? 配置dubbo注冊中心Zookeeper地址 /? 配置dubbo協(xié)議名稱和服務(wù)端口
配置dubbo注解包掃描 /? 配置spring自動掃描 /? 配置需要訂閱的業(yè)務(wù)接口及引用
4.4??將資料的log4j.properties配置文件拷貝到resources目錄下
4.5??在web.xml文件中,配置SpringMVC
4.6??啟動服務(wù)消費(fèi)者,并測試訪問
五.? Dubbo 管理控制臺
因?yàn)槲覀冃枰?zookeeper注冊中心都注冊了哪些服務(wù),有哪些消費(fèi)者類消費(fèi)這些服務(wù)
1. 安裝:? 將dubbo-admin-2.6.0.war文件復(fù)制到tomcat的webapps目錄下 /
啟動tomcat,此war文件會自動解壓? /??修改WEB-INF下的dubbo.properties文件 /重啟tomcat

2.? 使用 :? 訪問http://localhost:8080/dubbo-admin-2.6.0/,輸入用戶名(root)和密碼(root) /?
啟動服務(wù)提供者工程和服務(wù)消費(fèi)者工程,可以在查看到對應(yīng)的信息 /?

六. Dubbo 相關(guān)配置說明
服務(wù)提供者和服務(wù)消費(fèi)者前面章節(jié)實(shí)現(xiàn)都是基于配置文件進(jìn)行服務(wù)注冊與訂閱,如果使用包掃描,可以使用注解方式實(shí)現(xiàn)

1. 把spring-dubbo-provider中的服務(wù)注冊配置注釋掉,如圖所示

2.??在UserServiceImpl類中頭部,使用注解? @Service
3.把spring-dubbo-consumer中的控制器初始化及服務(wù)訂閱配置注釋掉,如圖所示

4.? ?采用注解初始化控制器,在控制器頭部加入@Controller