サマリー:為什么要用dubbo? 還是讓官方來解釋吧:http://dubbo.io/User+Guide-zh.htm http://dubbo.io/ 一般 nginx+tomcat | ----> Controller1--------->service1請(qǐng)求----->nginx |
為什么要用dubbo?
還是讓官方來解釋吧:
http://dubbo.io/User+Guide-zh.htm http://dubbo.io/
一般 nginx+tomcat
| ----> Controller1--------->service1
請(qǐng)求----->nginx |
|----->Controller2--------->service2
請(qǐng)求進(jìn)了Controller 就只有一條路可以走了
使用dubbo后
| ------->service1
請(qǐng)求------>Controller----> |
|---------->service2
簡(jiǎn)單的說 也就是 一個(gè)Contoller 我可以部署多個(gè) service 。
一般的mvc項(xiàng)目 包含 Controller、Servicei、ServiceImpl、dao三層
使用doubbo我們可以把項(xiàng)目拆分:
Controller 作為 “消費(fèi)著” 一個(gè)項(xiàng)目
ServiceImpl +dao 作為 “提供者” 一個(gè)項(xiàng)目
Servicei “接口” 可以作為一個(gè)項(xiàng)目
我們可以部署多個(gè)“提供著”。。。。。。。。。。。。。。。。。。。
Zookeeper作為Dubbo服務(wù)的注冊(cè)中心,Dubbo原先基于數(shù)據(jù)庫的注冊(cè)中心,沒采用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)求。我們先在linux上安裝Zookeeper,我們安裝最簡(jiǎn)單的單點(diǎn)
Windons 安裝Zookeeper
1,Zookeeper 官網(wǎng)下載windons 版本,(不會(huì)下載百度)
單機(jī)安裝非常簡(jiǎn)單,只要獲取到 Zookeeper 的壓縮包并解壓到某個(gè)目錄如
Zookeeper 的啟動(dòng)腳本在 bin 目錄下,Windows 下的啟動(dòng)腳本是 zkServer.cmd。
在你執(zhí)行啟動(dòng)腳本之前,還有幾個(gè)基本的配置項(xiàng)需要配置一下,Zookeeper 的配置文件在 conf 目錄下,這個(gè)目錄下有 zoo_sample.cfg 和 log4j.properties,你需要做的就是將 zoo_sample.cfg 改名為 zoo.cfg,因?yàn)?Zookeeper 在啟動(dòng)時(shí)會(huì)找這個(gè)文件作為默認(rèn)配置文件。下面詳細(xì)介紹一下,這個(gè)配置文件中各個(gè)配置項(xiàng)的意義。
打開以后
# The number of milliseconds of each tick tickTime=2000 # The number of ticks that the initial # synchronization phase can take initLimit=10 # The number of ticks that can pass between # sending a request and getting an acknowledgement syncLimit=5 # the directory where the snapshot is stored. dataDir=/tmp/zookeeper # the port at which the clients will connect clientPort=2181
ickTime:這個(gè)時(shí)間是作為 Zookeeper 服務(wù)器之間或客戶端與服務(wù)器之間維持心跳的時(shí)間間隔,也就是每個(gè) tickTime 時(shí)間就會(huì)發(fā)送一個(gè)心跳。
dataDir:顧名思義就是 Zookeeper 保存數(shù)據(jù)的目錄,默認(rèn)情況下,Zookeeper 將寫數(shù)據(jù)的日志文件也保存在這個(gè)目錄里。
clientPort:這個(gè)端口就是客戶端連接 Zookeeper 服務(wù)器的端口,Zookeeper 會(huì)監(jiān)聽這個(gè)端口,接受客戶端的訪問請(qǐng)求。
二.dubbo-admin。 dubbo管控臺(tái)的安裝
下載地址 http://dubbo.io/Download-zh.htm
下載 dubbo-admin-2.5.3.war
解壓之后:
修改 META-INF/dubbo.properties文件
dubbo.registry.address=zookeeper://127.0.0.1:2181 dubbo.admin.root.password=root dubbo.admin.guest.password=guest
address:zookeeper 的ip地址 后面是端口號(hào) ,和zookeeper中配置的端口號(hào)一樣
修改完成后需要一個(gè)tomcat 打開tomcat \webapps\ROOT 目錄 ,此目錄放置的是tomcat的首頁,刪除所有的文件,將解壓后修改好的所有的dubbo-admin 里的文件復(fù)制到 \webapps\ROOT中,
此時(shí)我們已經(jīng)配置好了?,F(xiàn)在可以啟動(dòng)tomcat了 (主意:在啟動(dòng)tomcat之前要先啟動(dòng)zookeeper ,啟動(dòng)zookeeper前面有介紹)。 啟動(dòng)tomcat之后 在瀏覽器輸入 http://localhost:8080 (我的是8083) 進(jìn)入dubbo管控臺(tái)的主頁
用戶名和密碼就是dubbo.properties 中配置的 默認(rèn)的是 用戶名 :root, 密碼:root
輸入用戶名和密碼之后 進(jìn)入首頁
當(dāng)然現(xiàn)在還沒有 消費(fèi)者 和 提供者
現(xiàn)在我們來開發(fā) 消費(fèi)者 和 提供者
配置 好 zookeeper之后 搭建 maven+springmvc+dubbo環(huán)境
新建3個(gè)maven項(xiàng)目
1,test-dubbo-provider ,java項(xiàng)目,作為提供者,serviceImpl 和dao 層
2,test-public-interface ,java項(xiàng)目,存放公共的接口 ,servicei 是service的接口 (備注:1要依賴2, 3也要依賴2)
3,test-web-consumer,web項(xiàng)目,存放 Controller 和 頁面
首先我們來開發(fā) 服務(wù)的提供者也就是 test-dubbo-provider ,目錄結(jié)構(gòu)為
ApplicationContent-dubbo.xml dubbo服務(wù)的配置文件(名字隨意) (待會(huì)再介紹)
ApplicationContent.xml spring的配置文件
這兩個(gè)配置文件 必須要放到 MATE-INF/spring/下面 (原因后面再說)
UserServiceImpl.java 借口的實(shí)現(xiàn)類
package com.cl.user.serviceImpl; import org.springframework.stereotype.Service; import com.cl.user.servicei.UserService; @Service("userService") public class UserServiceImpl implements UserService{ @Override public String sayHello() { System.out.println("hello world----------------------------"); return "hello world"; } }
有了 實(shí)現(xiàn)類 還需要接口 也就是項(xiàng)目test-public-interface
這個(gè)項(xiàng)目很簡(jiǎn)單 只需要 接口 就行了
package com.cl.user.servicei; public interface UserService { public String sayHello(); }
當(dāng)然 項(xiàng)目 1 要 依賴 項(xiàng)目 2
所以在1 的 pom.xml 中 有
<dependency> <groupId>test-web</groupId> <artifactId>test-pubilc-interface</artifactId> 加入項(xiàng)目2依賴 <version>0.0.1-SNAPSHOT</version> <scope>test</scope> </dependency>
那么 1 中的 UserServiceImpl 就可以實(shí)現(xiàn) UserService接口
當(dāng)然我們用到 dubbo 就要有dubbo的核心jar包 所以在1 的 pom.xml 中 有
1 <dependency> 2 <groupId>com.alibaba</groupId> 3 <artifactId>dubbo</artifactId> 4 <version>2.5.3</version> 5 </dependency>
還要有 zookeeper的 所以在1 的 pom.xml 中 有
1 <dependency> 2 <groupId>org.apache.zookeeper</groupId> 3 <artifactId>zookeeper</artifactId> 4 <version>3.3.3</version> 5 </dependency>
下面介紹一下項(xiàng)目1 中 的 ApplicationContent-dubbo.xml 和 ApplicationContent.xml
ApplicationContent.xml 主要是spring的配置 不多說。
<!-- 啟動(dòng)組件掃描,排除@Controller組件,該組件由SpringMVC配置文件掃描 --> <context:component-scan base-package="com.cl.user.serviceImpl"/>
ApplicationContent-dubbo.xml dubbo服務(wù)的配置
<!-- 提供方應(yīng)用信息,用于計(jì)算依賴關(guān)系 --> <dubbo:application name="hehe_provider" /> <!-- 使用zookeeper注冊(cè)中心暴露服務(wù)地址 端口是zookeeper 中配置的2181--> <dubbo:registry address="zookeeper://127.0.0.1:2181"/> <!-- <dubbo:registry address="multicast://224.5.6.7:1234" /> --> <!-- 用dubbo協(xié)議在20880端口暴露服務(wù) --> <dubbo:protocol name="dubbo" port="20880" /> <!-- 具體的實(shí)現(xiàn)bean --> <bean id="userService" class="com.cl.user.serviceImpl.UserServiceImpl" /> <!-- 聲明需要暴露的服務(wù)接口 --> <dubbo:service interface="com.cl.user.servicei.UserService" ref="userService" />
主意:有可能你的配置文件中不識(shí)別 <dubbo:> 去網(wǎng)上找解決的辦法
到這里我們的 “提供者” 即 服務(wù) 已經(jīng)開發(fā)完了,那么如何啟動(dòng)服務(wù)呢? 在項(xiàng)目1中有個(gè)start.java
package com.test; import org.apache.log4j.PropertyConfigurator; public class start { static{ PropertyConfigurator.configure("src/main/resources/log4j.properties"); } public static void main(String[] args) { com.alibaba.dubbo.container.Main.main(args); } }
主意里面有main方法,可以直接運(yùn)行啟動(dòng)了。別急?。?! 之前還有個(gè)問題就是為什 ApplicationContent-dubbo.xml 和 ApplicationContent.xml 這兩個(gè)配置文件 必須要放到 /MATE-INF/spring/下面
因?yàn)? com.alibaba.dubbo.container.Main.main(args) 默認(rèn)就會(huì)去加載 /MATE-INF/spring/ 下的配置文件
我們來看一下源碼
看完源碼 這下明白為什么了吧?。。。。。。。。。。。。。。。?!
啟動(dòng)服務(wù)后 我們?cè)?dubbo-admin中就能看到我們剛才開發(fā)的的 “提供者”
192.168.56.1 是本地局域網(wǎng) 地址
這是 “提供者” 此時(shí)還沒有“消費(fèi)者” 接下來我們就要開發(fā) “消費(fèi)者”