dubbo的初探

1.RPC  基本概念
1.1 RPC  協議(Remote Procedure Call Protocol)
遠程過程調用協議,它是一種經過網絡從遠程計算機程序上請求服務,而不須要了解底層網絡技術的協議。RPC 協議假定某些傳輸協議的存在,如 TCP 或 UDP,爲通訊程序之間攜
帶信息數據。在 OSI 網絡通訊模型中,RPC 跨越了傳輸層和應用層。RPC 使得開發包括網絡分佈式程序在內的應用程序更加容易。
RPC 採用客戶機/服務器模式。請求程序就是一個客戶機,而服務提供程序就是一個務器。首先,客戶機調用進程發送一個有進程參數的調用信息到服務進程,而後等待應答信息。在服務器端,進程保持睡眠狀態直到調用信息到達爲止。當一個調用信息到達,服務器得到進程參數,計算結果,發送答覆信息,而後等待下一個調用信息,最後,客戶端調用進
程接收答覆信息,得到進程結果,而後調用執行繼續進行。html

1.2 RPC  框架
在單機時代一臺電腦運行多個進程,進程之間沒法通信,顯然這會浪費不少資源,所以後來出現 IPC(Inter-process communication: 單機中運行的進程之間的相互通訊 ),這樣就
能容許進程之間進行通信,好比在一臺計算機中的 A 進程寫了一個吃飯的方法,那在之前若是在 B 進程中也要有一個吃飯的方法,必需要在 B 進程中進行建立,但有了 RPC 後 B 只需
要調用 A 進程的程序便可完成,再到後來網絡時代的出現, 你們電腦都連起來,這時可不能夠調用其餘電腦上的進程呢,固然能夠,這樣 RPC 框架就出現了。嚴格意義上來說:Uni的生態系統中 RPC 能夠在同一臺電腦上不一樣進程進行,也能夠在不一樣電腦上進行;而在windows 裏面同一臺電腦上不一樣進程間的通信還能夠採用 LPC(本地訪問)。綜上:RPC 或 LPC
是上層建築,IPC 是底層基礎。RPC 框架有不少:好比 Thrift、dubbo、grpc 等。linux

1.3 RPC 與 與 HTTP 、TCP 、UDP 、Socket  的區別
TCP/UDP: 都是傳輸協議,主要區別是 tcp 協議鏈接須要 3 次握手,斷開須要四次揮手,是經過流來傳輸的,就是肯定鏈接後,一直髮送信息,傳完後斷開。udp 不須要進行鏈接,
直接把信息封裝成多個報文,直接發送。因此 udp 的速度更快寫,可是不保證數據的完整性。
Http:超文本傳輸協議是一種應用層協議,創建在 TCP 協議之上Socket:是在應用程序層面上對 TCP/IP 協議的封裝和應用。實際上是一個調用接口,方便程序員使用 TCP/IP 協議棧而已。程序員經過 socket 來使用 tcp/ip 協議。可是 socket 並非必定要使用 tcp/ip 協議,Socket 編程接口在設計的時候,就但願也能適應其餘的網絡協議。
小結:咱們把網絡傳輸類比於一條公路,那 TCP/UDP 就是貨車,HTTP 就是貨物,而 socket就是發動機。
RPC 是一種經過網絡從遠程計算機程序上請求服務,而不須要了解底層網絡技術的協議。因此 RPC 的實現能夠經過不一樣的協議去實現好比可使 http、RMI 等。git

1.4 RPC  的運行流程
首先,要解決通信的問題,主要是經過在客戶端和服務器之間創建 TCP 鏈接,遠程過程調用的全部交換的數據都在這個鏈接裏傳輸。鏈接能夠是按需鏈接,調用結束後就斷掉,也
能夠是長鏈接,多個遠程過程調用共享同一個鏈接。程序員

第二,要解決尋址的問題,也就是說,A 服務器上的應用怎麼告訴底層的 RPC 框架,如何鏈接到 B 服務器(如主機或 IP 地址)以及特定的端口,方法的名稱名稱是什麼,這樣才能完成調用。好比基於Web服務協議棧的RPC,就要提供一個endpoint URI,或者是從UDDI(一種目錄服務,經過該目錄服務進行服務註冊與搜索)服務上查找。若是是 RMI 調用的話,還須要一個 RMI Registry 來註冊服務的地址。
第三,當 A 服務器上的應用發起遠程過程調用時,方法的參數須要經過底層的網絡協議如 TCP 傳遞到 B 服務器,因爲網絡協議是基於二進制的,內存中的參數的值要序列化成二
進制的形式,也就是序列化(Serialize)或編組(marshal),經過尋址和傳輸將序列化的二進制發送給 B 服務器。github


第四,B 服務器收到請求後,須要對參數進行反序列化(序列化的逆操做),恢復爲內存中的表達方式,而後找到對應的方法(尋址的一部分)進行本地調用,而後獲得返回值spring


第五,返回值還要發送回服務器 A 上的應用,也要通過序列化的方式發送,服務器 A 接到後,再反序列化,恢復爲內存中的表達方式,交給 A 服務器上的應用apache

JAVAEE 裏面的 stub 是爲屏蔽客戶調用遠程主機上的對象,必須提供某種方式來模擬本地對象,這種本地對象稱爲存根(stub),存根負責接收本地方法調用,並將它們委派給各自的具
體實現對象
Skeleton:服務器的骨架編程

1.5 RPC  基於 RMI 的 的 簡單實現windows

2.Dubbo
2.1  框架基本概念
api

Dubbo 是由阿里巴巴開源的一個高性能、基於 Java 開源的遠程調用框架。正如在許多RPC 系統中同樣,dubbo 是基於定義服務的概念,指定能夠經過參數和返回類型遠程調用的方法。在服務器端,服務器實現這個接口,並運行一個 dubbo 服務器來處理客戶端調用。在客戶端,客戶機有一個存根,它提供與服務器相同的方法。

Dubbo 提供三個核心功能:基於接口的遠程調用、容錯和負載均衡,以及服務的自動註冊與發現。Dubbo 框架普遍的在阿里巴巴內部使用,以及京東、噹噹、去哪兒、考拉等都在
使用。

2.2 Dubbo  快速入門
2.2.1  系統要求
jdk1.6 以上和 maven3.0 以上,採用 maven 分模塊構建 api 模塊,provider
模塊以及 consumer 模塊
2.2.2  導包 Dubbo的座標

2.2.3  定義服務接口
因爲服務的生產者和消費者都會依賴這個接口,所以強烈建議把這個接口定義在一個獨立的模塊,而後由生產者模塊和消費者模塊各自依賴便可

2.3.4

2.3.5  配置 生產者
將服務接口進行發佈 dubbo-demo-provider.xml 服務接口的發佈,推薦使用spring 集成配置

<?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://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/bea
ns http://www.springframework.org/schema/beans/spring-
beans.xsd http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="demo-provider"/>
<dubbo:registry address="multicast://224.5.6.7:1234"/>
<dubbo:protocol name="dubbo" port="20880"/>
<dubbo:service interface="com.shsxt.service.DemoService"
ref="demoService"/>
<bean id="demoService" class="
com.shsxt.impl.DemoServiceImpl"/>
</beans>

2.3.6  啓動服務提供程序

public class Provider {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new
ClassPathXmlApplicationContext(
new String[] {"classpath:dubbo-demo-
provider.xml"});
context.start();
System.in.read(); // press any key to exit
}
}

2.3.7配置服務的消費端

消費端配置 dubbo-demo-consumer.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://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/bea
ns http://www.springframework.org/schema/beans/spring-
beans.xsd http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="demo-consumer"/>
<dubbo:registry address="multicast://224.5.6.7:1234"/>
<dubbo:reference id="demoService" interface="
com.shsxt.service.DemoService"/>
</beans>

2.3.8  啓動服務消費 端 進行消費

public class Consumer {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new
ClassPathXmlApplicationContext(
new String[]{"classpath:dubbo-demo-
consumer.xml"});
context.start();
DemoService demoService = (DemoService)
context.getBean("demoService"); // obtain proxy object for
remote invocation
String hello = demoService.sayHello("world"); //
execute remote invocation

System.out.println(hello); // show the result
}
}

3.Dubbo schema配置

https://dubbo.gitbooks.io/dubbo-user-book/configuration/xml.html

Dubbo  配置項說明

dubbo:application

應⽤信息配置。對應的配置類:com.alibaba.dubbo.config.ApplicationConfig

 

 dubbo:registry

註冊中⼼配置。對應的配置類: com.alibaba.dubbo.config.RegistryConfig。同時若是有多
個不 同的註冊 中⼼, 能夠聲 明多個 <dubbo:registry> 標籤 ,並在 <dubbo:service> 或
<dubbo:reference> 的 registry 屬性指定使⽤的註冊中⼼

dubbo:protocol

服務提供者協議配置。對應的配置類:com.alibaba.dubbo.config.ProtocolConfig,同時, 如
果須要⽀持多協議, 能夠聲明多個 <dubbo:protocol> 標籤, 並在 <dubbo:service> 中經過
protocol 屬性指定使⽤的協議

dubbo:service

服務提供者暴露服務配置。對應的配置類:com.alibaba.dubbo.config.ServiceConfig

dubbo:reference

服務消費者引⽤服務配置。對應的配置類: com.alibaba.dubbo.config.ReferenceConfig

dubbo:monitor

dubbo:module
模塊信息配置。 對應的配置類 com.alibaba.dubbo.config.ModuleConfig

dubbo:provider

服務提供者缺省值配置。 對應的配置類: com.alibaba.dubbo.config.ProviderConfig 。 同時
該標籤爲 <dubbo:service>和 <dubbo:protocol> 標籤的缺省值設置。

dubbo:consumer服務消費者缺省值配置。

配置類: com.alibaba.dubbo.config.ConsumerConfig 。 同時
該標籤爲 <dubbo:reference> 標籤的缺省值設置。

dubbo:method

⽅法級配置。 對應的配置類: com.alibaba.dubbo.config.MethodConfig 。 同時該標籤
爲 <dubbo:service> 或<dubbo:reference> 的⼦標籤, ⽤於控制到⽅法級。

Multicast  註冊中心

配置

 zookeeper註冊中心

Zookeeper 是 Apacahe Hadoop 的子項目,是一個樹型的目錄服務,支持變動推送,適合做
爲 Dubbo 服務的註冊中心,工業強度較高,可用於生產環境,並推薦使用。

流程說明:
• 服務提供者啓動時: 向 /dubbo/com.foo.BarService/providers 目錄下寫入本身
的 URL 地址
• 服務消費者啓動時: 訂閱 /dubbo/com.foo.BarService/providers 目錄下的提供
者 URL 地址。並向 /dubbo/com.foo.BarService/consumers 目錄下寫入本身的
URL 地址
• 監控中心啓動時: 訂閱 /dubbo/com.foo.BarService 目錄下的全部提供者和消費
者 URL 地址

 

支持如下功能:
• 當提供者出現斷電等異常停機時,註冊中心能自動刪除提供者信息
• 當註冊中心重啓時,能自動恢復註冊數據,以及訂閱請求
• 當會話過時時,能自動恢復註冊數據,以及訂閱請求
• 當設置 <dubbo:registry check="false" /> 時,記錄失敗註冊和訂閱請求,後臺
定時重試
• 可 通 過 <dubbo:registry username="admin" password="1234" /> 設 置
zookeeper 登陸信息
• 可經過 <dubbo:registry group="dubbo" /> 設置 zookeeper 的根節點,不設置將
使用無根樹
• 支持 * 號通配符 <dubbo:reference group="*" version="*" /> ,可訂閱服務的
全部分組和全部版本的提供者

在 provider 和 consumer 中增長 zookeeper 客戶端 jar 包依賴

Dubbo 支持 zkclient 和 curator 兩種 Zookeeper 客戶端實現

使用 curator 

zookeeper 單機配置(provider和consumer都須要配置),通常來講,provider四個dubbo的標籤,consumer三個dubbo的標籤

Zookeeper  集羣配置

同一 Zookeeper,分紅多組註冊中心

zookeeper 安裝
安裝方式參見: Zookeeper 安裝手冊,只需搭一個原生的 Zookeeper 服務器,並將 Quick
Start 中 Provider 和 Consumer 裏 的 conf/dubbo.properties 中
的 dubbo.registry.addrss 的值改成 zookeeper://127.0.0.1:2181 便可使用。

 修改配置文件

下載zookeeper以後

1,將zoo_sample.cfg重命名爲zoo.cfg

2,修改zoo.cfg

dataDir=F:\data
dataLogDir=F:\log

3,打開bin目錄,啓動

 

provider的配置

consumer的配置

 

linux環境下大體同window

Linux 下Zookeeper 配置與啓動
1.下載並解壓
http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz
2.準備zoo.cfg
添加
dataDir=/home/software/zkp/data
dataLogDir=/home/software/zkp/log
3.啓動服務器
cd bin
./zkServer.sh start|stop|restart
客戶端鏈接
cd bin
./zkCli.sh
4.節點查看命令
ls /
ls /dubbo/com.shsxt.api.IUserService
Dubbo 應用配置
provider 和 consumer
<dubbo:registry address="zookeeper://192.168.132.10:2181"></dubbo:registry>
座標添加
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.3.3</version>
</dependency>


<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>

 

ssm與dubbo的集成

 https://github.com/liuqingfeng123456789/ssm_dubbo

相關文章
相關標籤/搜索