Spring Boot整合Dubbo執行
原文地址:http://www.cnblogs.com/whthomas/p/running-dubbo-on-spring-boot.html
Dubbo
(http://dubbo.io/)
是阿里的開源的一款分散式服務框架。而Spring
Boot
則是Spring社群這兩年致力於打造的簡化Java配置的微服務框架。
利用他們各自優勢,配置到一起,可以幫助我們構建出非常優秀的微服務。
配置Maven
使用的Dubbo的一般都是大型專案,maven專案構建也會使用parent節點,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會只啟動spring的配置,而不會自動啟用什麼軟體或者是網路伺服器。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId >
</dependency>
Maven
的部分就配置完了
配置啟動類
Dubbo提供了一個啟動類com.alibaba.dubbo.container.Main
,在Dubbo的專案中,大多數都是使用這個類啟動專案的,而這個類中會載入很多的容器,其中最重要的就是SpringContainer
,這個類會讀取系統中相關的spring配置。
而在Spring
Boot
的體系中,則是任意寫一個啟動類,然後加註解@SpringBootApplication
在這個類之上,讓spring
boot能夠發現這個類,並啟動這個類的main方法。
在Spring
Boot
的設計中,推薦大家使用無XML配置的方式啟動專案,但大多數專案由於各種原因很難擺脫XML的束縛,這種情況下,使用@ImportResource
註解引入xml配置,在@ImportResource
中填寫需要引入的配置:
@ImportResource({"classpath:spring-context.xml"})
@ImportResource
會自動去查詢resource目錄下的檔案並引入Spring
Boot
。
經接著,我們需要解決啟動類中main()
方法的問題,一般情況下,我們寫的啟動類會使用:
SpringApplication.run(DemoApplication.class, args);
但由於Dubbo專案引用了Spring
Web
框架中的一些類,使得Maven也不得不匯入Spring
Web
專案,了而Spring
Boot
發現跟web相關的框架就會去啟動web容器(比如Tomcat
、Jetty
等),並且我們的配置是沒有新增容器的,所以main()
方法需要寫成:
ApplicationContext ctx = new SpringApplicationBuilder()
.sources(DemoApplication.class)
.web(false) // 沒錯,把專案設定成非web環境
.run(args);
還需要注意的是,由於使用了非常純粹的starter,而且Dubbo的網路框架也是非阻塞的,所以我們還需使用一些方法,保持主執行緒的阻塞狀態。比如我使用CountDownLatch
來做這件事。最終形成了以下啟動類的完整程式碼:
@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("專案啟動!");
CountDownLatch closeLatch = ctx.getBean(CountDownLatch.class);
closeLatch.await();
}
}
好了這個類構建完成之後,我們按照Dubbo的方式配置好service,就可以打包了。
打包部署
Dubbo本身有一個比較麻煩的問題就是在打包部署,從官方的demo上來看,Dubbo打包藉助了maven外掛assembly
,而且要寫不少的配置,而Spring
Boot
的工具相對來說,幾乎不需要任何的配置。在pom.xml
的build
節點下面,配置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>
命令列切換到專案的目錄之後,執行命令:
mvn package
在target目錄下面,會產生兩個檔案
把demo-0.0.1-SNAPSHOT.jar
拷貝到任意一個專案下啟動:
服務呼叫
我簡單地寫了一個consumer
的測試類,從consumer
專案呼叫專案,也是可以順利呼叫到這個服務的。
這個時候在provider
端,也是可以consumer
看到呼叫的情況
:
Bingo ! Dubbo running over the Spring Boot!