Dubbo是阿里的一個產品。是一個分佈式、高性能、透明化的RPC服務框架,提供服務自動註冊、自動發現等高效服務治理方案。
Dubbo是實現SOA架構時常用的服務之一,除了Dubbo外還有如下可供選擇
製作兼容JDK1.8的dubbo-admin
實現SOA架構時常用的服務
- Dubbo作爲服務
- WebService作爲服務(比較老了)
- Dubbox作爲服務(噹噹網開發的)
- 服務方就是web項目,調用web項目的控制器(HttpClient)
RPC(遠程過程調用協議)
客戶端通過互聯網調用遠程服務器,不知道遠程服務器的具體代碼實現,只知道遠程服務器提供了什麼功能。
優點:安全
Dubbo架構
首先來看一下架構圖
架構圖解析
- 虛線都是異步訪問,實線都是同步訪問
- 紫色虛線表示是在啓動時完成的
- 綠色虛線(實線)都是程序運行過程中執行的功能
- 所有的角色都可以在部署在單獨的服務器上,但是必須遵守特定的協議
節點說明
- Provider
服務提供者,發佈方 - Consumer
服務消費者,調用方 - Container
Dubbo容器,依賴於Spring容器 - Registry
註冊中心(當Container啓動時會把當前服務中所有可以提供的服務列表拿到Registry中進行註冊),主要作用就是告訴Consumer提供了什麼服務和服務方在哪裏,以及服務放放生變化後及時通知Consumer - Monitor
監聽器,負責統計服務調用次數和調用時間等
除了Monitor之外,所有節點必不可少!
Dubbo支持的註冊中心
- Zookeeper
1.1 優點:支持網絡集羣
1.2 缺點:穩定性受限於Zookeeper - Redis
2.1 優點:性能高.
2.2 缺點:對服務器環境要求較高. - Multicast
3.1 優點:面中心化,不需要額外安裝軟件.
3.2 缺點:建議同機房(局域網)內使用 - Simple
4.1 適用於測試環境.不支持集羣
Dubbo支持的協議
- Dubbo
1.1 Dubbo官方推薦的協議.
1.2 本質:使用NIO和線程池進行處理.
1.3 缺點:大文件傳輸時可能出現文件傳輸失敗問題. - RMI
2.1 JDK提供的協議,遠程方法調用協議.
2.2 缺點:偶爾連接失敗.
2.3 優點:JDK原生,不需要進行額外配置(導入jar) - Hession
3.1 優點:基於http協議,http請求支持.
3.2 缺點:需要額外導入jar,並在短連接時性能低
Dubbo開發步驟
配置Provider
引入dubbo依賴
注意去掉老版本spring的依賴,因爲在Dubbo2.x以前Spring所有的jar包是一個,之後依賴zookeeper客戶端工具zkClient
<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>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>
<!-- 訪問zookeeper的客戶端jar -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
開發Provider常用的配置標籤
1.<dubbo:application/> :給provider起名
主要是爲了在monitor或管理工具中區別是哪個服務提供者【provider】
2.<dubbo:registry/> :配置註冊中心
- address:註冊中心的ip和端口
- protocol:使用哪種註冊中心
3.<dubbo:protocol/>:配置協議
- name:使用什麼協議
- port:consumer invoke provider時的端口號
4.<dubbo:service/> 註冊接口
- ref:引用接口實現類<bean>的id值
<?xml version="1.0" encoding="UTF-8"?>
<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"
xmlns="http://www.springframework.org/schema/beans"
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/context/spring-context.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 給當前Provider自定義個名字 -->
<dubbo:application name="dubbo-service"/>
<!-- 配置註冊中心 -->
<dubbo:registry address="192.168.154.128:2181" protocol="zookeeper"></dubbo:registry>
<!-- 配置端口,注意此標籤表示,服務消費方和提供方連接採用dubbo協議 -->
<!--消費方訪問提供方的請求端口是此配置的端口-->
<dubbo:protocol name="dubbo" port="20888"></dubbo:protocol>
<!-- 註冊功能 -->
<dubbo:service interface="com.chenfu.dubbo.service.DemoService" ref="demoServiceImpl"></dubbo:service>
<bean id="demoServiceImpl" class="com.chenfu.dubbo.service.impl.DemoServiceImpl"></bean>
</beans>
啓動容器
- 通過spring方式啓動
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext-dubbo.xml");
ac.start();
System.out.println("啓動成功");
System.in.read();
- 使用dubbo提供的方式啓動
要求applicationContext-dubbo.xml必須放入類路徑下/META-INF/spring/*.xml
Main.main(args);
Dubbo的Consumer配置
引入依賴
在pom.xml中添加dubbo相關3個依賴(接口,dubbo.jar,zkClient)
配置Consumer時常用的標籤
<!-- 給當前Provider自定義個名字 -->
<dubbo:application name="dubbo-consumer"/>
<!-- 配置註冊中心 -->
<dubbo:registry address="192.168.154.128:2181" protocol="zookeeper"></dubbo:registry>
<!-- 配置註解掃描 -->
<dubbo:annotation package="com.chenfu.service.impl"/>
Admin管理界面
其本質是一個web項目,主要作用就是獲取註冊中心內Provider註冊的信息然後用頁面呈現出來。
使用指南
- 把dubbo-admin-2.5.3.war上傳到服務器tomcat中。
- 啓動tomcat完成後關閉tomcat,刪除上傳的dubbo-admin-2.5.3.war
- 進入dubbo-admin-2.5.3/WEB-INF/dubbo.properties,修改第一行爲zookeeper的ip和端口
- 修改管理界面的用戶名和密碼【第二行和第三行】
- 啓動tomcat,在瀏覽器地址欄訪問tomcat中dubbo項目
注意:dubbo-admin-2.5.3.war和jdk1.7兼容,但是與jdk1.8不兼容。網上有很多解決方案。可以直接百度參考。