早就聽說了dubbo的好處,但是在項目中一直沒有使用的機會,所以一直不知道怎麼使用。今天晚上有空,簡單的學習一下 就當入個門,以後項目中遇到的話,那麼使用起來就比較簡單了,至於介紹的話,我就不總結了,其實就是很好的解決了分散式 管理的問題,並且操作起來非常的方便。 下麵這張圖是從官網上截圖的 節點角 ...
早就聽說了dubbo的好處,但是在項目中一直沒有使用的機會,所以一直不知道怎麼使用。今天晚上有空,簡單的學習一下
就當入個門,以後項目中遇到的話,那麼使用起來就比較簡單了,至於介紹的話,我就不總結了,其實就是很好的解決了分散式
管理的問題,並且操作起來非常的方便。
下麵這張圖是從官網上截圖的
節點角色說明:
- Provider: 暴露服務的服務提供方。
- Consumer: 調用遠程服務的服務消費方。
- Registry: 服務註冊與發現的註冊中心。
- Monitor: 統計服務的調用次調和調用時間的監控中心。
- Container: 服務運行容器。
調用關係說明:
- 0. 服務容器負責啟動,載入,運行服務提供者。
- 1. 服務提供者在啟動時,向註冊中心註冊自己提供的服務。
- 2. 服務消費者在啟動時,向註冊中心訂閱自己所需的服務。
- 3. 註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連接推送變更數據給消費者。
- 4. 服務消費者,從提供者地址列表中,基於軟負載均衡演算法,選一臺提供者進行調用,如果調用失敗,再選另一臺調用。
- 5. 服務消費者和提供者,在記憶體中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。
(1) 連通性:
- 註冊中心負責服務地址的註冊與查找,相當於目錄服務,服務提供者和消費者只在啟動時與註冊中心交互,註冊中心不轉發請求,壓力較小
- 監控中心負責統計各服務調用次數,調用時間等,統計先在記憶體彙總後每分鐘一次發送到監控中心伺服器,並以報表展示
- 服務提供者向註冊中心註冊其提供的服務,並彙報調用時間到監控中心,此時間不包含網路開銷
- 服務消費者向註冊中心獲取服務提供者地址列表,並根據負載演算法直接調用提供者,同時彙報調用時間到監控中心,此時間包含網路開銷
- 註冊中心,服務提供者,服務消費者三者之間均為長連接,監控中心除外
- 註冊中心通過長連接感知服務提供者的存在,服務提供者宕機,註冊中心將立即推送事件通知消費者
- 註冊中心和監控中心全部宕機,不影響已運行的提供者和消費者,消費者在本地緩存了提供者列表
- 註冊中心和監控中心都是可選的,服務消費者可以直連服務提供者
(2) 健狀性:
- 監控中心宕掉不影響使用,只是丟失部分採樣數據
- 資料庫宕掉後,註冊中心仍能通過緩存提供服務列表查詢,但不能註冊新服務
- 註冊中心對等集群,任意一臺宕掉後,將自動切換到另一臺
- 註冊中心全部宕掉後,服務提供者和服務消費者仍能通過本地緩存通訊
- 服務提供者無狀態,任意一臺宕掉後,不影響使用
- 服務提供者全部宕掉後,服務消費者應用將無法使用,並無限次重連等待服務提供者恢復
(3) 伸縮性:
- 註冊中心為對等集群,可動態增加機器部署實例,所有客戶端將自動發現新的註冊中心
- 服務提供者無狀態,可動態增加機器部署實例,註冊中心將推送新的服務提供者信息給消費者
(4) 升級性:
- 當服務集群規模進一步擴大,帶動IT治理結構進一步升級,需要實現動態部署,進行流動計算,現有分散式服務架構不會帶來阻力:
上面這些基本的概念看完,然後我們開始直接上代碼吧。
我們先編寫服務端代碼:
這是代碼結構
下麵是代碼:
DemoService.java
package com.hotusm.dubbo.provider; import java.util.List; public interface DemoService { String sayHello(); List<?> getAllUser(); }
DemoServiceImpl.java
package com.hotusm.dubbo.provider;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import com.hotusm.dubbo.model.entity.User;
public class DemoServiceImpl implements DemoService {
public String sayHello() {
return "hello dubbo";
}
public List<?> getAllUser() {
List<User> list=new ArrayList<User>();
Random r=new Random();
for(int i=0;i<10;i++){
list.add(new User(""+r.nextInt(100)));
}
return list;
}
}
服務提供者的配置文件:
<?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://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 具體的實現bean --> <bean id="demoService" class="com.hotusm.dubbo.provider.DemoServiceImpl" /> <!-- 提供方應用信息,用於計算依賴關係 --> <dubbo:application name="xixi_provider" /> <!-- 使用multicast廣播註冊中心暴露服務地址 <dubbo:registry address="multicast://224.5.6.7:1234" />--> <!-- 使用zookeeper註冊中心暴露服務地址 --> <dubbo:registry address="zookeeper://127.0.0.1:2182" /> <!-- 用dubbo協議在20880埠暴露服務 --> <dubbo:protocol name="dubbo" port="20880" /> <!-- 聲明需要暴露的服務介面 --> <dubbo:service interface="com.hotusm.dubbo.provider.DemoService" ref="demoService" /> </beans>
然後我們就可以寫一個測試類,將服務提供者給發佈。
package junit; import java.io.IOException; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Provider { public static void main(String[] args) { ClassPathXmlApplicationContext atx=new ClassPathXmlApplicationContext("spring-context.xml"); atx.start(); try { System.out.println("server start... press any key to quit"); System.in.read(); } catch (IOException e) { e.printStackTrace(); } } }
dubbo有一個客戶端,我們可以再客戶端中看到提供者和消費者的情況,但是這個客戶端需要自己安裝
我們可以看到這裡已經可以查看到服務提供者的信息了,點擊進去還可以看到更多詳細的信息,這裡就不演示了。
接下來我們再做一個消費者的例子,
註意這裡的包名,實體名稱,介面名稱還是需要一樣的,這點和webservice是一樣的。
最主要還是配置文件
<?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/beans 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="hehe_consumer" /> <!-- 使用zookeeper註冊中心暴露服務地址 --> <!-- <dubbo:registry address="multicast://224.5.6.7:1234" /> --> <dubbo:registry address="zookeeper://127.0.0.1:2182" /> <!-- 生成遠程服務代理,可以像使用本地bean一樣使用demoService --> <dubbo:reference id="demoService" interface="com.hotusm.dubbo.provider.DemoService" /> </beans>
測試代碼:
import java.io.IOException; import java.util.List; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.hotusm.dubbo.provider.DemoService; public class Consumer { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( new String[] { "spring-context-consumer.xml" }); context.start(); DemoService demo = (DemoService) context.getBean("demoService"); // System.out.println(demo.sayHello()); List<?> list = demo.getAllUser(); System.out.println(list); try { System.out.println("connection... press any key to quit "); System.in.read(); } catch (IOException e) { e.printStackTrace(); } } }
我們可以在控制台看到:
hello dubbo [User [name=37], User [name=95], User [name=68], User [name=59], User [name=14], User [name=51], User [name=44], User [name=62], User [name=71], User [name=94]] connection... press any key to quit
這樣我們的例子也就寫完了,dubbo也算是入門了吧。
下麵再講講dubbo的管理頁面怎麼配置。
dubbo管理控制台開源部分主要包含: 提供者 路由規則 動態配置 訪問控制 權重調節 負載均衡 負責人,等管理功能。
1、下載dubbo
我是測試安裝在windows上的,先刪除tomcat/webapps下自帶的ROOT文件夾內容(替換tomcat的啟動主頁),將下載的war包解壓到webapps/ROOT(可以先讓tomcat自動解壓 再把內容拷貝到root中去),如果是linux的話命令如下:
2、配置:
( windows 環境 解壓的war包中自帶有dubbo.properties 文件,直接修改就可以; linux上的話將dubbo.properties放在當前用戶目錄下,)修改zookeeper的地址
- vim webapps/ROOT/WEB-INF/dubbo.properties
3、配置信息如下:
dubbo.registry.address=zookeeper://localhost:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest
這邊使用的是zookeeper的註冊中心。
啟動tomcat:
說明:確定zookeeper啟動後再去啟動tomcat。
訪問:
http://localhost:8080/dubbo-admin-2.5.4-SNAPSHOT (這是我的tomcat的訪問路徑)
出現以下界面說明安裝配置成功,登錄密碼為root/root
附war包下載地址:http://pan.baidu.com/s/1jHQiesY 密碼:5eoq