閱讀217 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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的方式運行呢,下麵對三種啟動方式進行比較:

  1. 使用web容器(Tomcat、Jetty等)啟動dubbo服務 : 增加端口管理複雜性, tomcat/jetty等都需要占用端口,dubbo服務也需要端口;浪費資源(內存),單獨啟動 tomcat,jetty占用內存大

  2. 使用自建Main方法類運行spring容器啟動dubbo服務:Dobbo提供的優雅停機高級特性沒用上,並且自已編寫啟動類可能會有缺陷

  3. 使用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

  上一篇:go  解密亞洲誠信如何做到HTTPS的最佳安全實踐
  下一篇:go  dubbo入門-helloworld