第一章: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/404261332.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,在這裏需要配置註冊中心的地址,通信的協議方式,服務提供者的應用名,最後就是最關鍵的需要暴露的服務,我們這裏就是
- <?xml version="1.1" 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 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具有服務自動發現的功能,所以我們這邊只需要配置註冊中心,服務消費者的名字,和需要訂閱的服務接口信息,如下:
- <?xml version="1.1" 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 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的一些特性