Dubbo入门介绍---搭建一个最简单的Demo框架
Dubbo入門---搭建一個(gè)最簡(jiǎn)單的Demo框架
置頂 2017年04月17日 19:10:44 是Guava不是瓜娃 閱讀數(shù):320947 標(biāo)簽: dubbo zookeeper 更多 個(gè)人分類: Dubbo 版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。 https://blog.csdn.net/noaman_wgs/article/details/70214612Dubbo背景和簡(jiǎn)介
Dubbo開始于電商系統(tǒng),因此在這里先從電商系統(tǒng)的演變講起。
單一應(yīng)用框架(ORM)
當(dāng)網(wǎng)站流量很小時(shí),只需一個(gè)應(yīng)用,將所有功能如下單支付等都部署在一起,以減少部署節(jié)點(diǎn)和成本。
缺點(diǎn):單一的系統(tǒng)架構(gòu),使得在開發(fā)過(guò)程中,占用的資源越來(lái)越多,而且隨著流量的增加越來(lái)越難以維護(hù)
垂直應(yīng)用框架(MVC)
垂直應(yīng)用架構(gòu)解決了單一應(yīng)用架構(gòu)所面臨的擴(kuò)容問題,流量能夠分散到各個(gè)子系統(tǒng)當(dāng)中,且系統(tǒng)的體積可控,一定程度上降低了開發(fā)人員之間協(xié)同以及維護(hù)的成本,提升了開發(fā)效率。
缺點(diǎn):但是在垂直架構(gòu)中相同邏輯代碼需要不斷的復(fù)制,不能復(fù)用。
分布式應(yīng)用架構(gòu)(RPC)
當(dāng)垂直應(yīng)用越來(lái)越多,應(yīng)用之間交互不可避免,將核心業(yè)務(wù)抽取出來(lái),作為獨(dú)立的服務(wù),逐漸形成穩(wěn)定的服務(wù)中心
流動(dòng)計(jì)算架構(gòu)(SOA)
隨著服務(wù)化的進(jìn)一步發(fā)展,服務(wù)越來(lái)越多,服務(wù)之間的調(diào)用和依賴關(guān)系也越來(lái)越復(fù)雜,誕生了面向服務(wù)的架構(gòu)體系(SOA),也因此衍生出了一系列相應(yīng)的技術(shù),如對(duì)服務(wù)提供、服務(wù)調(diào)用、連接處理、通信協(xié)議、序列化方式、服務(wù)發(fā)現(xiàn)、服務(wù)路由、日志輸出等行為進(jìn)行封裝的服務(wù)框架
從以上是電商系統(tǒng)的演變可以看出架構(gòu)演變的過(guò)程:
-
單一應(yīng)用架構(gòu)
- 當(dāng)網(wǎng)站流量很小時(shí),只需一個(gè)應(yīng)用,將所有功能都部署在一起,以減少部署節(jié)點(diǎn)和成本。
- 此時(shí),用于簡(jiǎn)化增刪改查工作量的 數(shù)據(jù)訪問框架(ORM) 是關(guān)鍵。
-
垂直應(yīng)用架構(gòu)
- 當(dāng)訪問量逐漸增大,單一應(yīng)用增加機(jī)器帶來(lái)的加速度越來(lái)越小,將應(yīng)用拆成互不相干的幾個(gè)應(yīng)用,以提升效率。
- 此時(shí),用于加速前端頁(yè)面開發(fā)的 Web框架(MVC) 是關(guān)鍵。
- 分布式服務(wù)架構(gòu)
- 當(dāng)垂直應(yīng)用越來(lái)越多,應(yīng)用之間交互不可避免,將核心業(yè)務(wù)抽取出來(lái),作為獨(dú)立的服務(wù),逐漸形成穩(wěn)定的服務(wù)中心,使前端應(yīng)用能更快速的響應(yīng)多變的市場(chǎng)需求。
- 此時(shí),用于提高業(yè)務(wù)復(fù)用及整合的 分布式服務(wù)框架(RPC) 是關(guān)鍵。
- 流動(dòng)計(jì)算架構(gòu)
- 當(dāng)服務(wù)越來(lái)越多,容量的評(píng)估,小服務(wù)資源的浪費(fèi)等問題逐漸顯現(xiàn),此時(shí)需增加一個(gè)調(diào)度中心基于訪問壓力實(shí)時(shí)管理集群容量,提高集群利用率。
- 此時(shí),用于提高機(jī)器利用率的 資源調(diào)度和治理中心(SOA) 是關(guān)鍵。
在這里插播一條關(guān)于RPC的簡(jiǎn)介:
RPC(Remote Procedure Call Protocol):遠(yuǎn)程過(guò)程調(diào)用:
兩臺(tái)服務(wù)器A、B,分別部署不同的應(yīng)用a,b。當(dāng)A服務(wù)器想要調(diào)用B服務(wù)器上應(yīng)用b提供的函數(shù)或方法的時(shí)候,由于不在一個(gè)內(nèi)存空間,不能直接調(diào)用,需要通過(guò)網(wǎng)絡(luò)來(lái)表達(dá)調(diào)用的語(yǔ)義傳達(dá)調(diào)用的數(shù)據(jù)。
說(shuō)白了,就是你在你的機(jī)器上寫了一個(gè)程序,我這邊是無(wú)法直接調(diào)用的,這個(gè)時(shí)候就出現(xiàn)了一個(gè)遠(yuǎn)程服務(wù)調(diào)用的概念。
RPC是一種通過(guò)網(wǎng)絡(luò)從遠(yuǎn)程計(jì)算機(jī)程序上請(qǐng)求服務(wù),而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議。RPC協(xié)議假定某些傳輸協(xié)議的存在,如TCP或UDP,為通信程序之間攜帶信息數(shù)據(jù)。在OSI網(wǎng)絡(luò)通信模型中,RPC跨越了傳輸層和應(yīng)用層。RPC使得開發(fā)包括網(wǎng)絡(luò)分布式多程序在內(nèi)的應(yīng)用程序更加容易。
RPC采用客戶機(jī)/服務(wù)器模式。請(qǐng)求程序就是一個(gè)客戶機(jī),而服務(wù)提供程序就是一個(gè)服務(wù)器。首先,客戶機(jī)調(diào)用進(jìn)程發(fā)送一個(gè)有進(jìn)程參數(shù)的調(diào)用信息到服務(wù)進(jìn)程,然后等待應(yīng)答信息。在服務(wù)器端,進(jìn)程保持睡眠狀態(tài)直到調(diào)用信息到達(dá)為止。當(dāng)一個(gè)調(diào)用信息到達(dá),服務(wù)器獲得進(jìn)程參數(shù),計(jì)算結(jié)果,發(fā)送答復(fù)信息,然后等待下一個(gè)調(diào)用信息,最后,客戶端調(diào)用進(jìn)程接收答復(fù)信息,獲得進(jìn)程結(jié)果,然后調(diào)用執(zhí)行繼續(xù)進(jìn)行。
RPC需要解決的問題:
(可以稍作了解,詳情可查看別的博文)
- 通訊問題 : 主要是通過(guò)在客戶端和服務(wù)器之間建立TCP連接,遠(yuǎn)程過(guò)程調(diào)用的所有交換的數(shù)據(jù)都在這個(gè)連接里傳輸。連接可以是按需連接,調(diào)用結(jié)束后就斷掉,也可以是長(zhǎng)連接,多個(gè)遠(yuǎn)程過(guò)程調(diào)用共享同一個(gè)連接。
- 尋址問題 : A服務(wù)器上的應(yīng)用怎么告訴底層的RPC框架,如何連接到B服務(wù)器(如主機(jī)或IP地址)以及特定的端口,方法的名稱名稱是什么,這樣才能完成調(diào)用。比如基于Web服務(wù)協(xié)議棧的RPC,就要提供一個(gè)endpoint URI,或者是從UDDI服務(wù)上查找。如果是RMI調(diào)用的話,還需要一個(gè)RMI Registry來(lái)注冊(cè)服務(wù)的地址。
- 序列化 與 反序列化 : 當(dāng)A服務(wù)器上的應(yīng)用發(fā)起遠(yuǎn)程過(guò)程調(diào)用時(shí),方法的參數(shù)需要通過(guò)底層的網(wǎng)絡(luò)協(xié)議如TCP傳遞到B服務(wù)器,由于網(wǎng)絡(luò)協(xié)議是基于二進(jìn)制的,內(nèi)存中的參數(shù)的值要序列化成二進(jìn)制的形式,也就是序列化(Serialize)或編組(marshal),通過(guò)尋址和傳輸將序列化的二進(jìn)制發(fā)送給B服務(wù)器。
同理,B服務(wù)器接收參數(shù)要將參數(shù)反序列化。B服務(wù)器應(yīng)用調(diào)用自己的方法處理后返回的結(jié)果也要序列化給A服務(wù)器,A服務(wù)器接收也要經(jīng)過(guò)反序列化的過(guò)程。
Dubbo是什么
Dubbo是:
- 一款分布式服務(wù)框架
- 高性能和透明化的RPC遠(yuǎn)程服務(wù)調(diào)用方案
- SOA服務(wù)治理方案
每天為2千多個(gè)服務(wù)提供大于30億次訪問量支持,并被廣泛應(yīng)用于阿里巴巴集團(tuán)的各成員站點(diǎn)以及別的公司的業(yè)務(wù)中。
Dubbo架構(gòu)
Provider: 暴露服務(wù)的服務(wù)提供方。
Consumer: 調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費(fèi)方。
Registry: 服務(wù)注冊(cè)與發(fā)現(xiàn)的注冊(cè)中心。
Monitor: 統(tǒng)計(jì)服務(wù)的調(diào)用次數(shù)和調(diào)用時(shí)間的監(jiān)控中心。
調(diào)用流程
0.服務(wù)容器負(fù)責(zé)啟動(dòng),加載,運(yùn)行服務(wù)提供者。
1.服務(wù)提供者在啟動(dòng)時(shí),向注冊(cè)中心注冊(cè)自己提供的服務(wù)。
2.服務(wù)消費(fèi)者在啟動(dòng)時(shí),向注冊(cè)中心訂閱自己所需的服務(wù)。
3.注冊(cè)中心返回服務(wù)提供者地址列表給消費(fèi)者,如果有變更,注冊(cè)中心將基于長(zhǎng)連接推送變更數(shù)據(jù)給消費(fèi)者。
4.服務(wù)消費(fèi)者,從提供者地址列表中,基于軟負(fù)載均衡算法,選一臺(tái)提供者進(jìn)行調(diào)用,如果調(diào)用失敗,再選另一臺(tái)調(diào)用。
5.服務(wù)消費(fèi)者和提供者,在內(nèi)存中累計(jì)調(diào)用次數(shù)和調(diào)用時(shí)間,定時(shí)每分鐘發(fā)送一次統(tǒng)計(jì)數(shù)據(jù)到監(jiān)控中心
Dubbo注冊(cè)中心
對(duì)于服務(wù)提供方,它需要發(fā)布服務(wù),而且由于應(yīng)用系統(tǒng)的復(fù)雜性,服務(wù)的數(shù)量、類型也不斷膨脹;
對(duì)于服務(wù)消費(fèi)方,它最關(guān)心如何獲取到它所需要的服務(wù),而面對(duì)復(fù)雜的應(yīng)用系統(tǒng),需要管理大量的服務(wù)調(diào)用。
而且,對(duì)于服務(wù)提供方和服務(wù)消費(fèi)方來(lái)說(shuō),他們還有可能兼具這兩種角色,即既需要提供服務(wù),有需要消費(fèi)服務(wù)。
通過(guò)將服務(wù)統(tǒng)一管理起來(lái),可以有效地優(yōu)化內(nèi)部應(yīng)用對(duì)服務(wù)發(fā)布/使用的流程和管理。服務(wù)注冊(cè)中心可以通過(guò)特定協(xié)議來(lái)完成服務(wù)對(duì)外的統(tǒng)一。
Dubbo提供的注冊(cè)中心有如下幾種類型可供選擇:
- Multicast注冊(cè)中心
- Zookeeper注冊(cè)中心
- Redis注冊(cè)中心
- Simple注冊(cè)中心
Dubbo優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 像調(diào)用本地方法一樣調(diào)用遠(yuǎn)程方法;只需簡(jiǎn)單配置,沒有任何API侵入。
- 可在內(nèi)網(wǎng)替代nginx lvs等硬件負(fù)載均衡器。
-不需要寫死服務(wù)提供者地址,注冊(cè)中心基于接口名自動(dòng)查詢提供者ip。
使用類似zookeeper等分布式協(xié)調(diào)服務(wù)作為服務(wù)注冊(cè)中心,可以將絕大部分項(xiàng)目配置移入zookeeper集群。
-Dubbo-admin與Dubbo-monitor提供了完善的服務(wù)接口管理與監(jiān)控功能,針對(duì)不同應(yīng)用的不同接口,可以進(jìn)行 多版本,多協(xié)議,多注冊(cè)中心管理。
缺點(diǎn):
- 只支持JAVA語(yǔ)言
Dubbo入門Demo
了解了Dubbo以后,自然要搭建一個(gè)簡(jiǎn)單的Demo實(shí)現(xiàn)。本文采用Dubbo與Zookeeper、Spring框架的整合。
主要是以下幾個(gè)步驟:
1. 安裝Zookeeper,啟動(dòng);
2. 創(chuàng)建MAVEN項(xiàng)目,構(gòu)建Dubbo+Zookeeper+Spring實(shí)現(xiàn)的簡(jiǎn)單Demo;
3. 安裝Dubbo-admin,實(shí)現(xiàn)監(jiān)控。
1 Zookeeper介紹與安裝
本Demo中的Dubbo注冊(cè)中心采用的是Zookeeper。為什么采用Zookeeper呢?
Zookeeper是一個(gè)分布式的服務(wù)框架,是樹型的目錄服務(wù)的數(shù)據(jù)存儲(chǔ),能做到集群管理數(shù)據(jù) ,這里能很好的作為Dubbo服務(wù)的注冊(cè)中心。
Dubbo能與Zookeeper做到集群部署,當(dāng)提供者出現(xiàn)斷電等異常停機(jī)時(shí),Zookeeper注冊(cè)中心能自動(dòng)刪除提供者信息,當(dāng)提供者重啟時(shí),能自動(dòng)恢復(fù)注冊(cè)數(shù)據(jù),以及訂閱請(qǐng)求
具體的安裝方法在此不一一敘述,可參考博文:
http://blog.csdn.net/tlk20071/article/details/52028945
安裝完成后,進(jìn)入到bin目錄,并且啟動(dòng)zkServer.cmd,這個(gè)腳本中會(huì)啟動(dòng)一個(gè)java進(jìn)程:
(注:需要先啟動(dòng)zookeeper后,后續(xù)dubbo demo代碼運(yùn)行才能使用zookeeper注冊(cè)中心的功能)
2 創(chuàng)建MAVEN項(xiàng)目
項(xiàng)目結(jié)構(gòu):
主要分三大模塊:
dubbo-api : 存放公共接口;
dubbo-consumer : 調(diào)用遠(yuǎn)程服務(wù);
dubbo-provider : 提供遠(yuǎn)程服務(wù)。
下面將詳細(xì)敘述代碼構(gòu)建過(guò)程。
1) 首先構(gòu)建MAVEN項(xiàng)目,導(dǎo)入所需要的jar包依賴。
需要導(dǎo)入的有spring, dubbo, zookeeper等jar包。
(詳情參看后面提供的項(xiàng)目代碼)
2)創(chuàng)建dubbo-api的MAVEN項(xiàng)目(有獨(dú)立的pom.xml,用來(lái)打包供提供者消費(fèi)者使用)。
在項(xiàng)目中定義服務(wù)接口:該接口需單獨(dú)打包,在服務(wù)提供方和消費(fèi)方共享。
- 1
- 2
- 3
- 4
- 5
- 6
3)創(chuàng)建dubbo-provider的MAVEN項(xiàng)目(有獨(dú)立的pom.xml,用來(lái)打包供消費(fèi)者使用)。
實(shí)現(xiàn)公共接口,此實(shí)現(xiàn)對(duì)消費(fèi)者隱藏:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
需加入公共接口所在的依賴
用Spring配置聲明暴露服務(wù)
<?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"> <!--定義了提供方應(yīng)用信息,用于計(jì)算依賴關(guān)系;在 dubbo-admin 或 dubbo-monitor 會(huì)顯示這個(gè)名字,方便辨識(shí)--> <dubbo:application name="demotest-provider" owner="programmer" organization="dubbox"/> <!--使用 zookeeper 注冊(cè)中心暴露服務(wù),注意要先開啟 zookeeper--> <dubbo:registry address="zookeeper://localhost:2181"/> <!-- 用dubbo協(xié)議在20880端口暴露服務(wù) --> <dubbo:protocol name="dubbo" port="20880" /> <!--使用 dubbo 協(xié)議實(shí)現(xiàn)定義好的 api.PermissionService 接口--> <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" protocol="dubbo" /> <!--具體實(shí)現(xiàn)該接口的 bean--> <bean id="demoService" class="com.alibaba.dubbo.demo.impl.DemoServiceImpl"/> </beans>- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
啟動(dòng)遠(yuǎn)程服務(wù):
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("服務(wù)已經(jīng)啟動(dòng)..."); System.in.read(); } }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
4)創(chuàng)建dubbo-consumer的MAVEN項(xiàng)目(可以有多個(gè)consumer,但是需要配置好)。
調(diào)用所需要的遠(yuǎn)程服務(wù):
通過(guò)Spring配置引用遠(yuǎn)程服務(wù):
<?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 定時(shí)推送--> <dubbo:registry address="zookeeper://localhost:2181"/> <!--使用 dubbo 協(xié)議調(diào)用定義好的 api.PermissionService 接口--> <dubbo:reference id="permissionService" interface="com.alibaba.dubbo.demo.DemoService"/> </beans>- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
啟動(dòng)Consumer,調(diào)用遠(yuǎn)程服務(wù):
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) { //測(cè)試常規(guī)服務(wù) 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)); } }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
5)運(yùn)行項(xiàng)目,先確保provider已被運(yùn)行后再啟動(dòng)consumer模塊:
運(yùn)行提供者:
消費(fèi)者成功調(diào)用提供者所提供的遠(yuǎn)程服務(wù):
當(dāng)然,這只是一個(gè)模擬的項(xiàng)目,實(shí)際中有多提供者多消費(fèi)者情況,比這要復(fù)雜的多,當(dāng)然只有這樣才能體現(xiàn)dubbo的特性。
Dubbo管理控制臺(tái)介紹
管理控制臺(tái)功能
路由規(guī)則,動(dòng)態(tài)配置,服務(wù)降級(jí)
訪問控制,權(quán)重調(diào)整
負(fù)載均衡
下載dubbo-admin,可自行根據(jù)網(wǎng)上介紹安裝。大致做法就是將dubbo-admin中 的某個(gè)文件夾內(nèi)容替換到tomcat的conf中,再運(yùn)行tomcat即可。但我在實(shí)際操作中發(fā)現(xiàn)JDK8無(wú)法運(yùn)行,后來(lái)找到一個(gè)JDK8可以實(shí)現(xiàn)的dubbo-admin版本,下載地址:http://www.itmayun.com/it/files/226631678709806/resource/901920001882583/1.html。
成功開啟輸入用戶名密碼root后,即可進(jìn)入控制臺(tái)首頁(yè)查看消費(fèi)者提供者情況:
查看提供者:
查看消費(fèi)者:
目前,阿里又開始更新,有興趣可以查看:
https://github.com/apache/incubator-dubbo
整個(gè)項(xiàng)目的代碼已經(jīng)上傳到我的github上https://github.com/nomico271/DatatablesDemo.git,歡迎查看。
(github上項(xiàng)目中的圖片為博客中內(nèi)容,可全部刪除)。
參考:https://www.zhihu.com/question/25536695
轉(zhuǎn)載于:https://www.cnblogs.com/libin6505/p/9883944.html
總結(jié)
以上是生活随笔為你收集整理的Dubbo入门介绍---搭建一个最简单的Demo框架的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在deepin系统中制作桌面快捷方式
- 下一篇: Windows Internals 笔记