跟我學習dubbo-使用Maven構建Dubbo服務的可執行jar包(4)


Dubbo服務的運行方式:

1、使用Servlet容器運行(Tomcat、Jetty等)----不可取

缺點:增加復雜性(端口、管理) 浪費資源(內存)

官方:服務容器是一個standalone的啟動程序,因為后台服務不需要Tomcat或JBoss等Web容器的功能,如果硬要用Web容器去加載服務提供方,增加復雜性,也浪費資源。

2、自建Main方法類來運行(Spring容器) ----不建議(本地調試可用)

缺點: Dobbo本身提供的高級特性沒用上 自已編寫啟動類可能會有缺陷 

官方:服務容器只是一個簡單的Main方法,並加載一個簡單的Spring容器,用於暴露服務。

3、使用Dubbo框架提供的Main方法類來運行(Spring容器)----建議使用

優點:框架本身提供(com.alibaba.dubbo.container.Main)

可實現優雅停機(ShutdownHook) 

官方:服務容器的加載內容可以擴展,內置了spring, jetty, log4j等加載,可通過Container擴展點進行擴展

Dubbo是通過JDK的ShutdownHook來完成優雅停機的,所以如果用戶使用"kill -9 PID"等強制關閉指令,是不會執行優雅停機的,只有通過"kill PID"時,才會執行。

原理:

 

  • 服務提供方

    • 停止時,先標記為不接收新請求,新請求過來時直接報錯,讓客戶端重試其它機器。

    • 然后,檢測線程池中的線程是否正在運行,如果有,等待所有線程執行完成,除非超時,則強制關閉。

  • 服務消費方

    • 停止時,不再發起新的調用請求,所有新的調用在客戶端即報錯。

    • 然后,檢測有沒有請求的響應還沒有返回,等待響應返回,除非超時,則強制關閉。

設置優雅停機超時時間,缺省超時時間是10秒:(超時則強制關閉)

< dubbo:application ...>
     < dubbo:parameter key = "shutdown.timeout" value = "60000" /> <!-- 單位毫秒 -->

</dubbo:application>

如果ShutdownHook不能生效,可以自行調用:

ProtocolConfig.destroyAll();

打包

傳統的打jar包,大部分人員還在使用eclipse自帶的導出一個jar包,對於傳統的單實例項目是沒有問題的,但對於比較復雜的maven分模塊項目,這種做法就不行了。

下面介紹maven打包方式:

<resources>
            <resource>
                <targetPath>${project.build.directory}/classes</targetPath>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes>
            </resource>
            <!-- 結合com.alibaba.dubbo.container.Main,需要重點掌握-->
            <resource>
                <targetPath>${project.build.directory}/classes/META-INF/spring</targetPath>
                <directory>src/main/resources/spring</directory>
                <filtering>true</filtering>
                <includes>
                    <include>spring-context.xml</include>
                </includes>
            </resource>
 </resources>

官網聲明: Spring Container

  • 自動加載META-INF/spring目錄下的所有Spring配置。

  • 配置:(配在java命令-D參數或者dubbo.properties中)

  • dubbo.spring.config=classpath*:META-INF/spring/*.xml ----配置spring配置加載位置

    所以聲明必須使用maven方式配置才能將spring配置文件打包到META-INF/spring目錄下

引入相關插件:

<plugins>
            <!-- 打包jar文件時,配置manifest文件,加入lib包的jar依賴 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <classesDirectory>target/classes/</classesDirectory>
                    <archive>
                        <manifest>
                            <mainClass>com.alibaba.dubbo.container.Main</mainClass>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                        </manifest>
                        <manifestEntries>
                            <Class-Path>.</Class-Path>
                        </manifestEntries>
                    </archive>
                </configuration>
            </plugin>

....省略一些配置

</plugins>

重點關注標紅色的配置,容器啟動使用的是容器Main方法啟動,故需要配置

配置好以后,我們就可以使用maven的命令打需要的服務jar包。利用java -jar命令去執行你的jar包,就可以將服務注冊到你的zookeeper注冊中心了。

 

請各位持續關注《跟我學習dubbo-在Linux操作系統上手工部署Dubbo服務(5)》

由於第一次寫關於dubbo的博客,還希望大家加入dubbo學習交流群(446855438),一起學習。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM