首页 > 编程语言 > 详细

跟我学习dubbo-使用Maven构建Dubbo服务的可执行jar包(4)

时间:2016-01-08 02:02:31      阅读:1076      评论:0      收藏:0      [点我收藏+]

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

跟我学习dubbo-使用Maven构建Dubbo服务的可执行jar包(4)

原文:http://jeesml.iteye.com/blog/2269319

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!