dubbo-容器(可執行性jar啟動項目)
1 引言
眾所周知,不管是dubbo服務的提供方還是服務的消費方,我們都可以把工程打包成war包放到web容器(servlet容器)中啟動,但這種方式是否合理呢?在dubbo的 官方文檔 中,介紹了dubbo的服務提供方其實是不需要web容器單獨運行的,也就是本文將要介紹的通過java命令 java -jar dubbo服務.jar 這個命令運行服務,為了運行這個jar包,我們必須把服務打包成可運行jar包,並把所依賴的jar放在約定的目錄下。
如果不了解可執行jar的打包方法,請參考文章:https://my.oschina.net/thinwonton/blog/877493
為什麼對於服務提供方的工程,dubbo官方推薦使用可執行jar的方式運行呢,下麵對三種啟動方式進行比較:
使用web容器(Tomcat、Jetty等)啟動dubbo服務 : 增加端口管理複雜性, tomcat/jetty等都需要占用端口,dubbo服務也需要端口;浪費資源(內存),單獨啟動 tomcat,jetty占用內存大
使用自建Main方法類運行spring容器啟動dubbo服務:Dobbo提供的優雅停機高級特性沒用上,並且自已編寫啟動類可能會有缺陷
使用Dubbo框架提供的Main方法類運行Spring容器啟動服務:官方建議使用,dubbo框架本身提供啟動類(com.alibaba.dubbo.container.Main),可實現優雅關機
對於優雅停機的概念和原理,請參考文檔: https://dubbo.io/User+Guide-zh.htm
那麼,下麵我們來研究怎麼使用java命令啟動dubbo服務吧。
2 命令行運行dubbo服務
相對於使用web容器啟動的方式,該方式除了需要修改maven配置外,不需要修改原有的配置。
2.1 打包可運行jar的maven配置
主要利用maven的maven-jar-plugin和maven-dependency-plugin插件,前一個插件是配置可運行jar的manifest清單文件,該清單文件主要配置主程序main所在的位置還有依賴的jar包的位置。由於dubbo啟動類 com.alibaba.dubbo.container.Main 默認自動加載META-INF/spring目錄下的所有Spring配置,所以我們還需要把spring的配置文件通過maven拷貝到指定目錄。除此之外,packaging的構建包類型修改為jar。完整的pom文件如下:
<project xmlns="https://maven.apache.org/POM/4.0.0"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.github.thinwonton.dubbo.sample</groupId>
<artifactId>dubbo-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../dubbo-parent</relativePath>
</parent>
<groupId>com.github.thinwonton.dubbo.sample</groupId>
<artifactId>container-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-container-提供者</name>
<build>
<!-- 輸出文件名 -->
<finalName>dubbo-container-provider</finalName>
<resources>
<resource>
<targetPath>${project.build.directory}/classes</targetPath>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<excludes>
<!-- spring配置文件由下麵的配置:拷貝到META-INF/spring中 -->
<exclude>spring/*.xml</exclude>
</excludes>
</resource>
<!-- com.alibaba.dubbo.container.Main加載spring配置文件的路徑 META-INF/spring -->
<resource>
<targetPath>${project.build.directory}/classes/META-INF/spring</targetPath>
<directory>src/main/resources/spring</directory>
<filtering>true</filtering>
<includes>
<include>*.xml</include>
</includes>
</resource>
</resources>
<plugins>
<!-- 資源文件拷貝插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- java編譯插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- 打包jar文件時,配置manifest文件,加入lib包的jar依賴 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<classesDirectory>target/classes/</classesDirectory>
<archive>
<manifest>
<!-- 打包時 MANIFEST.MF文件不記錄的時間戳版本 -->
<useUniqueVersions>false</useUniqueVersions>
<!-- 添加Class-Path -->
<addClasspath>true</addClasspath>
<!-- Class-Path添加前綴 -->
<classpathPrefix>lib/</classpathPrefix>
<!-- 指定Main-Class -->
<mainClass>com.alibaba.dubbo.container.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<!-- 拷貝依賴的jar包到lib目錄 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>
<executions>
<execution>
<id>copy</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>
<!-- 拷貝依賴到lib文件夾 -->
${project.build.directory}/lib
</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
2.2 運行
(1)到工程目錄的根目錄,運行 mvn clean package ,由maven在target目錄構建jar包和拷貝依賴包到target/lib目錄
(2)自建一個文件夾,把構建出來的jar和lib目錄拷貝到新建文件夾中,然後使用java -jar命令運行服務
java -jar dubbo-container-provider.jar
文章轉載自 開源中國社區 [https://www.oschina.net]
最後更新:2017-06-30 15:31:53