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),一起学习。