Dubbo 入門
目前,阿里的dubbo已轉交給apache繼續維護及更新,github地址:
https://github.com/apache/incubator-dubbo
Dubbo是什麼
Dubbo是:
- 一款分散式服務框架
- 高效能和透明化的RPC遠端服務呼叫方案
- SOA服務治理方案
每天為2千多個服務提供大於30億次訪問量支援,並被廣泛應用於阿里巴巴集團的各成員站點以及別的公司的業務中。
Provider: 暴露服務的服務提供方。
Consumer: 呼叫遠端服務的服務消費方。
Registry: 服務註冊與發現的註冊中心。
Monitor: 統計服務的呼叫次數和呼叫時間的監控中心。
呼叫流程
0.服務容器負責啟動,載入,執行服務提供者。
1.服務提供者在啟動時,向註冊中心註冊自己提供的服務。
2.服務消費者在啟動時,向註冊中心訂閱自己所需的服務。
3.註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連線推送變更資料給消費者。
4.服務消費者,從提供者地址列表中,基於軟負載均衡演算法,選一臺提供者進行呼叫,如果呼叫失敗,再選另一臺呼叫。
5.服務消費者和提供者,在記憶體中累計呼叫次數和呼叫時間,定時每分鐘傳送一次統計資料到監控中心
Dubbo註冊中心
對於服務提供方,它需要釋出服務,而且由於應用系統的複雜性,服務的數量、型別也不斷膨脹;
對於服務消費方,它最關心如何獲取到它所需要的服務,而面對複雜的應用系統,需要管理大量的服務呼叫。
而且,對於服務提供方和服務消費方來說,他們還有可能兼具這兩種角色,即既需要提供服務,有需要消費服務。
通過將服務統一管理起來,可以有效地優化內部應用對服務釋出/使用的流程和管理。服務註冊中心可以通過特定協議來完成服務對外的統一。
Dubbo提供的註冊中心有如下幾種型別可供選擇:
Multicast註冊中心
Zookeeper註冊中心
Redis註冊中心
Simple註冊中心
Dubbo優缺點
優點:
透明化的遠端方法呼叫
- 像呼叫本地方法一樣呼叫遠端方法;只需簡單配置,沒有任何API侵入。
軟負載均衡及容錯機制
可在內網替代nginx lvs等硬體負載均衡器。
服務註冊中心自動註冊 & 配置管理
-不需要寫死服務提供者地址,註冊中心基於介面名自動查詢提供者ip。
使用類似zookeeper等分散式協調服務作為服務註冊中心,可以將絕大部分專案配置移入zookeeper叢集。
服務介面監控與治理
-Dubbo-admin與Dubbo-monitor提供了完善的服務介面管理與監控功能,針對不同應用的不同介面,可以進行 多版本,多協議,多註冊中心管理。
缺點:
只支援JAVA語言
Dubbo入門Demo
瞭解了Dubbo以後,自然要搭建一個簡單的Demo實現。本文采用Dubbo與Zookeeper、Spring框架的整合。
主要是以下幾個步驟:
1. 安裝Zookeeper,啟動;
2. 建立MAVEN專案,構建Dubbo+Zookeeper+Spring實現的簡單Demo;
3. 安裝Dubbo-admin,實現監控。
1 Zookeeper介紹與安裝
本Demo中的Dubbo註冊中心採用的是Zookeeper。為什麼採用Zookeeper呢?
Zookeeper是一個分散式的服務框架,是樹型的目錄服務的資料儲存,能做到叢集管理資料 ,這裡能很好的作為Dubbo服務的註冊中心。
Dubbo能與Zookeeper做到叢集部署,當提供者出現斷電等異常停機時,Zookeeper註冊中心能自動刪除提供者資訊,當提供者重啟時,能自動恢復註冊資料,以及訂閱請求
具體的安裝方法在此不一一敘述,可參考博文:
http://blog.csdn.net/tlk20071/article/details/52028945
安裝完成後,進入到bin目錄,並且啟動zkServer.cmd,這個指令碼中會啟動一個java程序:
(注:需要先啟動zookeeper後,後續dubbo demo程式碼執行才能使用zookeeper註冊中心的功能)
2 建立MAVEN專案
專案結構:
主要分三大模組:
dubbo-api : 存放公共介面;
dubbo-consumer : 呼叫遠端服務;
dubbo-provider : 提供遠端服務。
下面將詳細敘述程式碼構建過程。
1) 首先構建MAVEN專案,匯入所需要的jar包依賴。
需要匯入的有spring, dubbo, zookeeper等jar包。
(詳情參看後面提供的專案程式碼)
2)建立dubbo-api的MAVEN專案(有獨立的pom.xml,用來打包供提供者消費者使用)。
在專案中定義服務介面:該介面需單獨打包,在服務提供方和消費方共享。
package com.alibaba.dubbo.demo; import java.util.List; public interface DemoService { List<String> getPermissions(Long id); }
3)建立dubbo-provider的MAVEN專案(有獨立的pom.xml,用來打包供消費者使用)。
實現公共介面,此實現對消費者隱藏:
package com.alibaba.dubbo.demo.impl; import com.alibaba.dubbo.demo.DemoService; import java.util.ArrayList; import java.util.List; public class DemoServiceImpl implements DemoService { public List<String> getPermissions(Long id) { List<String> demo = new ArrayList<String>(); demo.add(String.format("Permission_%d", id - 1)); demo.add(String.format("Permission_%d", id)); demo.add(String.format("Permission_%d", id + 1)); return demo; } }
需加入公共介面所在的依賴
用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/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-admin 或 dubbo-monitor 會顯示這個名字,方便辨識--> <dubbo:application name="demotest-provider" owner="programmer" organization="dubbox"/> <!--使用 zookeeper 註冊中心暴露服務,注意要先開啟 zookeeper--> <dubbo:registry address="zookeeper://localhost:2181"/> <!-- 用dubbo協議在20880埠暴露服務 --> <dubbo:protocol name="dubbo" port="20880" /> <!--使用 dubbo 協議實現定義好的 api.PermissionService 介面--> <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" protocol="dubbo" /> <!--具體實現該介面的 bean--> <bean id="demoService" class="com.alibaba.dubbo.demo.impl.DemoServiceImpl"/> </beans>
啟動遠端服務:
package com.alibaba.dubbo.demo.impl; import org.springframework.context.support.ClassPathXmlApplicationContext; import java.io.IOException; public class Provider { public static void main(String[] args) throws IOException { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("provider.xml"); System.out.println(context.getDisplayName() + ": here"); context.start(); System.out.println("服務已經啟動..."); System.in.read(); } }
4)建立dubbo-consumer的MAVEN專案(可以有多個consumer,但是需要配置好)。
呼叫所需要的遠端服務:
通過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/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="demotest-consumer" owner="programmer" organization="dubbox"/> <!--向 zookeeper 訂閱 provider 的地址,由 zookeeper 定時推送--> <dubbo:registry address="zookeeper://localhost:2181"/> <!--使用 dubbo 協議呼叫定義好的 api.PermissionService 介面--> <dubbo:reference id="permissionService" interface="com.alibaba.dubbo.demo.DemoService"/> </beans>
啟動Consumer,呼叫遠端服務:
package com.alibaba.dubbo.consumer; import com.alibaba.dubbo.demo.DemoService; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Consumer { public static void main(String[] args) { //測試常規服務 ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("consumer.xml"); context.start(); System.out.println("consumer start"); DemoService demoService = context.getBean(DemoService.class); System.out.println("consumer"); System.out.println(demoService.getPermissions(1L)); } }
5)執行專案,先確保provider已被執行後再啟動consumer模組:
執行提供者:
消費者成功呼叫提供者所提供的遠端服務:
當然,這只是一個模擬的專案,實際中有多提供者多消費者情況,比這要複雜的多,當然只有這樣才能體現dubbo的特性。
Dubbo管理控制檯介紹
管理控制檯功能
路由規則,動態配置,服務降級
訪問控制,權重調整
負載均衡
下載dubbo-admin,可自行根據網上介紹安裝。大致做法就是將dubbo-admin中 的某個資料夾內容替換到tomcat的conf中,再執行tomcat即可。但我在實際操作中發現JDK8無法執行,後來找到一個JDK8可以實現的dubbo-admin版本,下載地址:http://www.itmayun.com/it/files/226631678709806/resource/901920001882583/1.html。
成功開啟輸入使用者名稱密碼root後,即可進入控制檯首頁檢視消費者提供者情況:
檢視提供者:
檢視消費者:
---------------------
作者:是Guava不是瓜娃
來源:CSDN
原文:https://blog.csdn.net/noaman_wgs/article/details/70214612
版權宣告:本文為博主原創文章,轉載請附上博文連結!