Dubbo
(http://dubbo.io/) 是阿里的開源的一款分布式服務(wù)框架歹袁。而Spring Boot
則是Spring社區(qū)這兩年致力于打造的簡(jiǎn)化Java配置的微服務(wù)框架莺治。
利用他們各自優(yōu)勢(shì)董朝,配置到一起,可以幫助我們構(gòu)建出非常優(yōu)秀的微服務(wù)震糖。
配置Maven
使用的Dubbo的一般都是大型項(xiàng)目肋杖,maven項(xiàng)目構(gòu)建也會(huì)使用parent節(jié)點(diǎn),Spring Boot考慮到了這種情況勘纯,提供了dependencyManagement
的方式局服,引入Spring Boot的包。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.3.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
在具體的starter選擇上驳遵,使用spring-boot-starter
淫奔,這樣spring-boot會(huì)只啟動(dòng)spring的配置,而不會(huì)自動(dòng)啟用什么軟件或者是網(wǎng)絡(luò)服務(wù)器堤结。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
Maven
的部分就配置完了
配置啟動(dòng)類
Dubbo提供了一個(gè)啟動(dòng)類com.alibaba.dubbo.container.Main
唆迁,在Dubbo的項(xiàng)目中,大多數(shù)都是使用這個(gè)類啟動(dòng)項(xiàng)目的竞穷,而這個(gè)類中會(huì)加載很多的容器唐责,其中最重要的就是SpringContainer
,這個(gè)類會(huì)讀取系統(tǒng)中相關(guān)的spring配置。
而在Spring Boot
的體系中瘾带,則是任意寫一個(gè)啟動(dòng)類鼠哥,然后加注解@SpringBootApplication
在這個(gè)類之上,讓spring boot能夠發(fā)現(xiàn)這個(gè)類,并啟動(dòng)這個(gè)類的main方法朴恳。
在Spring Boot
的設(shè)計(jì)中抄罕,推薦大家使用無XML配置的方式啟動(dòng)項(xiàng)目,但大多數(shù)項(xiàng)目由于各種原因很難擺脫XML的束縛于颖,這種情況下呆贿,使用@ImportResource
注解引入xml配置,在@ImportResource
中填寫需要引入的配置:
@ImportResource({"classpath:spring-context.xml"})
@ImportResource
會(huì)自動(dòng)去查找resource目錄下的文件并引入Spring Boot
恍飘。
經(jīng)接著榨崩,我們需要解決啟動(dòng)類中main()
方法的問題谴垫,一般情況下章母,我們寫的啟動(dòng)類會(huì)使用:
SpringApplication.run(DemoApplication.class, args);
但由于Dubbo項(xiàng)目引用了Spring Web
框架中的一些類,使得Maven也不得不導(dǎo)入Spring Web
項(xiàng)目翩剪,了而Spring Boot
發(fā)現(xiàn)跟web相關(guān)的框架就會(huì)去啟動(dòng)web容器(比如Tomcat
乳怎、Jetty
等),并且我們的配置是沒有添加容器的前弯,所以main()
方法需要寫成:
ApplicationContext ctx = new SpringApplicationBuilder()
.sources(DemoApplication.class)
.web(false) // 沒錯(cuò)蚪缀,把項(xiàng)目設(shè)置成非web環(huán)境
.run(args);
還需要注意的是,由于使用了非常純粹的starter恕出,而且Dubbo的網(wǎng)絡(luò)框架也是非阻塞的询枚,所以我們還需使用一些方法,保持主線程的阻塞狀態(tài)浙巫。比如我使用CountDownLatch
來做這件事金蜀。最終形成了以下啟動(dòng)類的完整代碼:
@SpringBootApplication
@ImportResource({"classpath:spring/spring-context.xml"})
public class DemoApplication {
private static final Logger logger = LoggerFactory.getLogger(DemoApplication.class);
@Bean
public CountDownLatch closeLatch() {
return new CountDownLatch(1);
}
public static void main(String[] args) throws InterruptedException {
ApplicationContext ctx = new SpringApplicationBuilder()
.sources(DemoApplication.class)
.web(false)
.run(args);
logger.info("項(xiàng)目啟動(dòng)!");
CountDownLatch closeLatch = ctx.getBean(CountDownLatch.class);
closeLatch.await();
}
}
好了這個(gè)類構(gòu)建完成之后,我們按照Dubbo的方式配置好service的畴,就可以打包了渊抄。
打包部署
Dubbo本身有一個(gè)比較麻煩的問題就是在打包部署,從官方的demo上來看丧裁,Dubbo打包借助了maven插件assembly
护桦,而且要寫不少的配置,而Spring Boot
的工具相對(duì)來說煎娇,幾乎不需要任何的配置二庵。在pom.xml
的build
節(jié)點(diǎn)下面,配置spring-boot-maven-plugin插件
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.3.5.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
命令行切換到項(xiàng)目的目錄之后,執(zhí)行命令:
mvn package
在target目錄下面缓呛,會(huì)產(chǎn)生兩個(gè)文件
把demo-0.0.1-SNAPSHOT.jar
拷貝到任意一個(gè)項(xiàng)目下啟動(dòng):
服務(wù)調(diào)用
我簡(jiǎn)單地寫了一個(gè)consumer
的測(cè)試類眨猎,從consumer
項(xiàng)目調(diào)用項(xiàng)目,也是可以順利調(diào)用到這個(gè)服務(wù)的强经。
這個(gè)時(shí)候在provider
端睡陪,也是可以consumer
看到調(diào)用的情況 :
Bingo ! Dubbo running over the Spring Boot!