互聯網開發3--Dubbo框架

產生背景

互聯網系統,隨着業務的擴展會需要開發各種服務。在多服務的情況下,通常做法是配置服務的URL,然後遠程調用。
當服務很多時,URL的管理就變得越來越困難;服務之間的依賴關係變得錯綜複雜,架構師整理各個服務之間的依賴關係也越來越困難;訪問量的日益增長,服務的承受能力也需要進一步優化;
Dubbo可以解決以上問題,但不止這些問題哈。

Dubbo簡介

Dubbo是一個分佈式服務框架,組成如下:
提供者Provider: 暴露服務的服務提供方。
消費者Consumer: 調用遠程服務的服務消費方。
註冊中心Registry: 服務註冊與發現的註冊中心。
監控中心Monitor: 統計服務的調用次調和調用時間的監控中心。
服務容器Container: 服務運行容器。
工作流程:
1. 服務容器負責啓動,加載,運行服務提供者。
2. 服務提供者配置註冊中心URL地址,服務提供者在啓動時向註冊中心註冊自己提供的服務。
3. 服務消費者配置註冊中心URL地址,在啓動時向註冊中心訂閱自己所需的服務。
4. 註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連接推送變更數據給消費者。
5. 服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,如果調用失敗,再選另一臺調用。
6. 服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。

使用示例

以springMVC集成Dubbo爲例子哈。

1. 安裝zookeeper註冊中心

下載zookeeper安裝文件,啓動bat命令即可完成zookeeper的啓動。啓動之前需要改zoo.cfg文件裏的幾個配置:
tickTime=2000;這個時間是作爲 Zookeeper 服務器之間或客戶端與服務器之間維持心跳的時間間隔(單位毫秒),也就是每個 tickTime 時間就會發送一個心跳。
dataDir=../data;顧名思義就是 Zookeeper 保存數據的目錄,默認情況下,Zookeeper 將寫數據的日誌文件也保存在這個目錄裏。
clientPort=2181;這個端口就是客戶端連接 Zookeeper 服務器的端口,Zookeeper 會監聽這個端口,接受客戶端的訪問請求。

2. 安裝啓動Dubbo-admin管理工具

下載dubbo-admin-2.4.1.war包然後進行解壓,清理tomcat/webapps/ROOT目錄裏的東西,然後將解壓後的文件複製到ROOT目錄裏。打開dubbo.properties文件,配置註冊中心的地址和管理員的賬號、密碼。啓動tomcat,瀏覽器地址訪問:http://ip:端口,出現賬號密碼頁面,輸入dubbo.properties文件裏配置的即可,dubbo管理頁面如下:
這裏寫圖片描述
到此,dubbo管理頁面配置完事。

3. 配置服務提供者

以springMVC框架爲例。
(1)保存dubbo.xsd到項目。這個文件裏面定義了dubbo配置的一些標籤,該文件可以在網上下載到。導入後如下圖:
這裏寫圖片描述
(2)定義dubbo對應的spring文件,比如文件叫spring-remote.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/beans
     http://www.springframework.org/schema/beans/spring-beans.xsd
     http://code.alibabatech.com/schema/dubbo
     classpath:dubbo.xsd">

  <dubbo:application name="susong51-service"/>

  <dubbo:registry address="zookeeper://172.18.40.12:2181"/>
  <dubbo:protocol name="dubbo" port="20886" payload="52428800" />
  <dubbo:service interface="com.thunisoft.susong51.platform.service.message.IMessageService" ref="messageService" timeout="30000" />
  <dubbo:service interface="com.thunisoft.susong51.platform.service.task.ITaskService" ref="taskService" timeout="30000" />

</beans>
  • 文件裏引入dubbo.xsd,才能用dubbo的配置標籤;
  • dubbo:application標籤,用來定義註冊中心zookeeper裏顯示的應用名字;不同服務可以重名,應用的名字沒啥大用,僅僅是用來在dubbo-admin頁面查詢服務而已。如下圖:
    這裏寫圖片描述

登錄dubbo-admin管理頁面,【服務治理】–【應用】就能看到註冊的應用有哪些。

  • dubbo:registry標籤用來定義zookeeper中心的訪問地址,比如訪問地址如下:zookeeper://172.18.40.12:2181。

  • dubbo:protocol標籤用來指定dubbo的註冊協議,端口等信息;特別說明:zookeeper保存服務的URL格式是【服務所在的ip+dubbo註冊端口+服務完整包名】。如下圖:
    這裏寫圖片描述
    標籤裏定義的註冊端口是20886,所以服務的URL裏端口也是20886.

  • dubbo:service標籤用來定義註冊的服務。interface屬性指定服務的接口,ref屬性指定該服務的某個具體實現類,值就用spring定義的那個bean名字。註冊某接口實現類爲服務提供者,並不影響這個bean的正常使用,其他模塊仍然可以照常使用這個bean。

4. 配置服務消費者

定義dubbo的spring文件,比如該文件叫spring-remote.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/beans
     http://www.springframework.org/schema/beans/spring-beans.xsd
     http://code.alibabatech.com/schema/dubbo
     classpath:dubbo.xsd">

  <dubbo:application name="susong51-platform"/>

  <dubbo:registry address="zookeeper://172.18.40.12:2181"/>
  <dubbo:reference id="myMessageService" interface="com.thunisoft.susong51.platform.service.message.IMessageService" check="false"/>
  <dubbo:reference id="myTaskService" interface="com.thunisoft.susong51.platform.service.task.ITaskService" check="false"/>

</beans>

給應用取個名,不取的話,zookeeper貌似會自己給應用取個名;
配置zookeeper的訪問地址;
配置調用的遠程接口服務們。dubbo:reference標籤裏的id屬性,指定該服務bean名字。這樣,系統的各個業務模塊就可以像引用其他spring的bean那樣,引用這個服務了。

Dubbo總結

(1) Dubbo的註冊中心通常選用Zookeeper。Dubbo原先是基於數據庫的註冊中心,沒采用Zookeeper。Zookeeper是一個分佈式的服務框架,採用樹型的目錄結構數據存儲,能做到集羣管理數據 ,因此能很好的作爲Dubbo服務的註冊中心。Dubbo能與Zookeeper做到集羣部署,當提供者出現斷電等異常停機時,Zookeeper註冊中心能自動刪除提供者信息,當提供者重啓時,能自動恢復註冊數據,以及訂閱請求。
(2)zookeeper保存服務提供者的URL路徑爲:服務所在的ip+dubbo註冊端口+服務完整包名。對於互聯網項目,可能會一臺機器部署多個這個項目的war包,這時,如果不配置

<dubbo:protocol name="dubbo" port="20886" payload="52428800" />

端口port加以區分的話,註冊服務時會衝突。指定不同的註冊端口,就不會了。比如,在同一臺機器部署了多個susong51-service項目,這個項目是服務的提供者。每個項目配置不同的dubbo註冊端口20885和20886,在dubbo-admin管理頁面查看如下:
應用:
這裏寫圖片描述

服務:
這裏寫圖片描述

位於不同的註冊端口上:
這裏寫圖片描述
只要保證註冊的端口不同就可以,就不會衝突了。
(3)同一個系統,如何配置多個zookeeper註冊中心,用來獲得不同系統提供的對外服務?
在這種情況下,多個不同的系統可以使用同一個zookeeper註冊中心註冊服務,只要配置的dubbo端口不要衝突就行了,服務消費方配置一個zookeeper中心地址就行了。當同一個ip下的不同端口,註冊了同一個接口作爲提供者,dubbo頁面會給出warning提示,有相同的服務註冊了;
(4)同一個服務接口,有不同的實現類要作爲服務提供者暴漏給消費者們,該如何配置註冊呢?
(5)spring框架定義dubbo消費者,默認是懶加載的。使用遠程服務的bean時,消費者纔會註冊到zokeeper裏。如果只是在配置文件裏配置消費者服務,但是並沒有其他的bean去使用這個服務的話,是先不會創建實例的,這時在dubbo-admin頁面是看不到消費者的。
(6)暴漏的接口服務裏,有一個絕對路徑比如“d:/data”,那麼這個路徑是在zookeeper上還是在提供者服務上,還是在消費者服務上?
如下圖:
這裏寫圖片描述

服務提供者zsfy-service,服務的代碼裏有“d:/data”的絕對路徑,比如用來存放上傳的材料等文件。
服務消費者zsfy遠程調用zookeeper裏的服務,實現上傳功能。那麼實際上傳的材料是存在了機器1,還是機器2,還是機器3,4,5呢?
通過本地驗證,存在了機器1裏。所以,通常服務提供者不要部署多個,部署一個就好。這樣就不會發生上傳的材料會物理隔離,以及重複註冊服務的問題了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章