Dubbo服務的運行方式 服務容器是一個standalone的啟動程式,因為後臺服務不需要Tomcat或JBoss等Web容器的功能,如果硬要用Web容器去載入服務提供方,增加複雜性,也浪費資源。 服務容器只是一個簡單的Main方法,並載入一個簡單的Spring容器,用於暴露服務。 服務容器的載入內...
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),一起學習。