第一章:Dubbox簡介
Dubbox是一個開源的RPC(Remote ProcedureCall Protocol)遠程調用框架,是由dangdang對阿里的Dubbo的升級,可以被視為Dubbo的增強版,基本架構沒有變動,升級spring2.x到spring3.x,支持restful風格的調用調試方式,豐富了序列化的方式,提高了序列化的性能。
Dubbox的Github官網:
https://github.com/dangdangdotcom/dubbox
第二章 環境搭建(基於注冊中心是Zookeeper的搭建)
2.1 dubbo-admin控制台的安裝
2.1.1打開dubbox的官網https://github.com/dangdangdotcom/dubbox
點擊Clone or download 我們選擇最原始的Download ZIP,當前的stable版本是2.8.4
2.1.2下載到某個文件夾下,解壓文件夾:
2.1.3 解壓dubbox-master.zip
2.1.4按住鍵盤shift 鼠標右擊,選擇命令窗口,進入maven編譯 :
mvn install -Dmaven.test.skip=true
編譯安裝大概需要4~5分鍾,編譯安裝成功之后顯示如下:
好了,到此為止,dubbox2.8.4就算是編譯成功了,接下來我們要先搭建dubbox的控制台,因為可視化是我們最喜歡的模式了
2.1.5進入剛才的文件夾D:\dubboxstudy\dubbox-master\dubbo-admin\target
找到dubbo-admin-2.8.4.war文件,因為這是一個war文件,所以我們就使用tomcat啟動,下載apache-tomcat-7.0.40-windows-x64.zip到我們dubbox study目錄
解壓apache-tomcat.zip,然后將剛才的dubbo-admin-2.8.4.war復制到D:\dubboxstudy\apache-tomcat-7.0.40\webapps文件夾下
因為dubbo的注冊中心和管理控制台是依賴zookeeper,所以我們在測試環境下,需要啟動一個zookeeper的實例,關於zookeeperwindow環境下的搭建就不贅述了,詳細參考:
http://blog.csdn.net/morning99/article/details/40426133
2.1.6啟動dubbo-admin控制台之前,先啟動一個zookeeper實例(因為只是測試,所以就啟動zookeeper集群了):
2.1.7啟動tomcat,進入D:\dubbox study\apache-tomcat-7.0.40\bin,雙擊startup.bat
上圖表示啟動成功,啟動成功之后,我們會發現D:\dubbox study\apache-tomcat-7.0.40\webapps下多了一個文件夾dubbo-admin-2.8.4,進入
D:\dubboxstudy\apache-tomcat-7.0.40\webapps\dubbo-admin-2.8.4\WEB-INF,打開dubbo.properties:
可以看到dubbo默認的注冊機制是zookeeper,地址也是本地地址:127.0.0.1:2181,假如你此時zookeeper的實例的地址不是127.0.0.1:2181,或者注冊機制是Redis的話,需要修改dubbo.properties的配置,此處就不做修改了
2.1.8打開瀏覽器。輸入http://localhost:8080/dubbo-admin-2.8.4/,賬戶密碼是root/root.就可以看到頁面了
2.2 dubbo的Provider/Consumer 消費者和提供者的Demo代碼編寫
2.2.1環境准備JDK1.7 +Eclipse(STS) + Maven3.x
2.2.2新建WorkingSet
點擊finish:
2.2.3新建maven項目
建好之后的目錄結構:
2.2.4在bazinga-provider和bazinga-consumer的pom.xml中引入dubbox的依賴(暫時使用2.8.3的依賴,相對簡單一點):
-
<properties>
-
<dubbox.version>2.8.3</dubbox.version>
-
<slf4j.version>1.7.5</slf4j.version>
-
<zookeeper.version>3.4.6</zookeeper.version>
-
</properties>
-
<dependencies>
-
<dependency>
-
<groupId>com.alibaba</groupId>
-
<artifactId>dubbo</artifactId>
-
<version>${dubbox.version}</version>
-
</dependency>
-
<dependency>
-
<groupId>org.slf4j</groupId>
-
<artifactId>slf4j-api</artifactId>
-
<version>${slf4j.version}</version>
-
</dependency>
-
<dependency>
-
<groupId>org.apache.zookeeper</groupId>
-
<artifactId>zookeeper</artifactId>
-
<version>${zookeeper.version}</version>
-
<exclusions>
-
<exclusion>
-
<groupId>io.netty</groupId>
-
<artifactId>netty</artifactId>
-
</exclusion>
-
<exclusion>
-
<groupId>org.slf4j</groupId>
-
<artifactId>slf4j-api</artifactId>
-
</exclusion>
-
<exclusion>
-
<groupId>log4j</groupId>
-
<artifactId>log4j</artifactId>
-
</exclusion>
-
<exclusion>
-
<groupId>org.slf4j</groupId>
-
<artifactId>slf4j-log4j12</artifactId>
-
</exclusion>
-
<exclusion>
-
<groupId>jline</groupId>
-
<artifactId>jline</artifactId>
-
</exclusion>
-
</exclusions>
-
</dependency>
-
<dependency>
-
<groupId>org.slf4j</groupId>
-
<artifactId>slf4j-api</artifactId>
-
<version>${slf4j.version}</version>
-
</dependency>
-
<dependency>
-
<groupId>com.101tec</groupId>
-
<artifactId>zkclient</artifactId>
-
<version>0.2</version>
-
</dependency>
-
<dependency>
-
<groupId>ch.qos.logback</groupId>
-
<artifactId>logback-classic</artifactId>
-
<version>1.0.13</version>
-
</dependency>
-
</dependencies>
2.2.5在bazinga-provider編寫調用接口IDemoService:
-
package org.bazinga.service;
-
-
public interface IDemoService {
-
-
public String sayHello();
-
-
}
具體的實現:
-
package org.bazinga.service.impl;
-
-
import org.bazinga.service.IDemoService;
-
-
public class IDemoServiceImpl implements IDemoService {
-
-
public String sayHello() {
-
return "hello dubbox";
-
}
-
-
}
2.2.6在src/main/resources下配置dubbo基於Spring的配置文件spring-dubbo-provider.xml,在這里需要配置注冊中心的地址,通信的協議方式,服務提供者的應用名,最后就是最關鍵的需要暴露的服務,我們這里就是
-
-
<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 owner="lyncc" name="bazinga-app" />
-
<!--zookeeper注冊中心 -->
-
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"/>
-
-
<dubbo:protocol name ="dubbo" port="20880" />
-
<!-- 發布這個服務 -->
-
<dubbo:service protocol="dubbo" timeout="4000" connections="100" interface ="org.bazinga.service.IDemoService" ref="demoService" />
-
<!-- 和本地bean一樣實現服務 -->
-
<bean id="demoService" class="org.bazinga.service.impl.IDemoServiceImpl" />
-
-
</beans>
細心的你會發現左側有報錯的提示:
這個報錯是因為不識別dubbo的命名空間,所以需要導入xsd文件,dubbo.xsd文件源碼中有,網上也可以下載到,下載好或者在源碼中找到之后,選擇Windw->Perferences->XML->XMLCatelog->User Specifed Entries
點擊add,點擊FileSystem 選擇你下載好的dubbo.xsd,輸入key值,key值要與schema值一樣,點擊OK:
一路保存剛才的設置,重新打開spring-dubbo-provider.xml文件,可以發現報錯消失。到此為止,dubbox的服務提供者端的代碼已經編寫完畢,我們寫個測試類測試一下:
-
package org.bazinga.service.test;
-
-
import org.springframework.context.support.ClassPathXmlApplicationContext;
-
-
public class DubboxProviderDemoService {
-
-
public static void main(String[] args) throws InterruptedException {
-
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
-
"spring-dubbo-provider.xml");
-
context.start();
-
Thread.sleep( 2000000l);
-
}
-
-
}
啟動main函數之后,會發現dubbo-admin的控制台中提供者發現了該服務:
2.2.7服務提供者模塊的編寫,服務消費者只要有服務的接口就可以了,把服務提供者的接口復制到bazinga-consumer項目的同一個package下,注意必須放在同一個package下,也就是說服務消費者和服務提供者的接口的路徑必須完全相同,因為這是服務的唯一標識,是一一對應的:
2.2.8服務消費端dubbo的配置文件的編寫spring-dubbo-consumer.xml,因為dubbo具有服務自動發現的功能,所以我們這邊只需要配置注冊中心,服務消費者的名字,和需要訂閱的服務接口信息,如下:
-
-
<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 owner="lyncc" name="bazinga-consumer" />
-
<!--zookeeper注冊中心 -->
-
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"/>
-
-
<dubbo:reference id="demoService" interface="org.bazinga.service.IDemoService"/>
-
-
</beans>
-
2.2.9編寫測試類DubboConsumerDemoService:
-
package org.bazinga.service.test;
-
-
import org.bazinga.service.IDemoService;
-
import org.springframework.context.support.ClassPathXmlApplicationContext;
-
-
public class DubboConsumerDemoService {
-
-
public static void main(String[] args) throws InterruptedException {
-
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
-
"spring-dubbo-consumer.xml");
-
context.start();
-
IDemoService demoService = (IDemoService)context.getBean( "demoService");
-
System.out.println(demoService.sayHello());
-
Thread.sleep( 2000000l);
-
}
-
-
}
先運行DubboxProviderDemoService的情況下,啟動DubboConsumerDemoService的main函數,運行結果:
同時控制台admin頁面也會顯示消費者的信息:
好了,到此為止,最簡單的Dubbo的Helloworld搭建完畢
2.3 本章小結
本章簡單的搭建了一個Dubbo的Demo,配置了dubbo-admin控制頁面平台,編寫了一個簡單的Hello World,服務提供者向zookeeper注冊中心注冊服務,服務消費者從注冊中心訂閱服務,發現服務的暴露地址,完成遠程調用,下一個章節,我們稍微深入體驗一下dubbo給我們帶來的豐富的RPC的一些特性