首页 > 代码库 > 学习dubbo(五):使用maven构建dubbo服务的可执行的jar

学习dubbo(五):使用maven构建dubbo服务的可执行的jar

Dubbo服务的运行方式

 1、使用Servlet容器运行(Tomcat) ----- 不可取

 缺点:增加复杂性(端口、管理)

     浪费资源(内存)

 2、自建Main方法类来运行(Spring容器) -----不建议(本地调试可用)

 缺点:Dubbo本身提供的高级特性没用上

     自己编写启动类可能会有缺陷

 3、使用Dubbo框架提供的Main方法类来运行(Spring容器) -----建议使用

 优点:框架本身提供(com.alibaba.dubbo.container.Main)

     可实现优雅关机(ShutdownHook) 


优雅关机

1、简介


Dubbo是通过JDK的ShutdownHook来完成优雅停机的,所以如果用户使用"kill -9 PID"等强制关闭指令,是不会执行优雅停机的,只有通过"kill PID"时,才会执行。


原理:

  • 服务提供方

    • 停止时,先标记为不接收新请求,新请求过来时直接报错,让客户端重试其它机器。

    • 然后,检测线程池中的线程是否正在运行,如果有,等待所有线程执行完成,除非超时,则强制关闭。

  • 服务消费方

    • 停止时,不再发起新的调用请求,所有新的调用在客户端即报错。

    • 然后,检测有没有请求的响应还没有返回,等待响应返回,除非超时,则强制关闭。


设置优雅停机超时时间,缺省超时时间是10秒:(超时则强制关闭)
<dubbo:application ...>
    <dubbo:parameter key="shutdown.timeout" value="http://www.mamicode.com/60000" /> <!-- 单位毫秒 -->
</dubbo:application>
如果ShutdownHook不能生效,可以自行调用:
ProtocolConfig.destroyAll();    

注意:此方式

  1、自动加载META-INF/spring目录下的所有Spring配置。

  2、配置:(配在java命令-D参数或者dubbo.properties中)

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


2、pom.xml中build

<build>
    <!-- 构建jar包的名字 -->
    <finalName>edu-service-user</finalName>
    <resources>
	<!-- 把src/main/resources中的xml与properties文件放入classes -->
        <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(满足自动加载META-INF/spring目录下的所有Spring配置) -->
        <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>

    <pluginManagement>
	<plugins>
	    <!-- 解决Maven插件在Eclipse内执行了一系列的生命周期引起冲突 -->
	    <plugin>
	        <groupId>org.eclipse.m2e</groupId>
		<artifactId>lifecycle-mapping</artifactId>
		<version>1.0.0</version>
		<configuration>
		    <lifecycleMappingMetadata>
			<pluginExecutions>
			    <pluginExecution>
				<pluginExecutionFilter>
				    <groupId>org.apache.maven.plugins</groupId>
				    <artifactId>maven-dependency-plugin</artifactId>
				    <versionRange>[2.0,)</versionRange>
				    <goals>
					<goal>copy-dependencies</goal>
				    </goals>
				</pluginExecutionFilter>
				<action>
    				    <ignore />
				</action>
			    </pluginExecution>
			</pluginExecutions>
		    </lifecycleMappingMetadata>
		</configuration>
	    </plugin>
	</plugins>
    </pluginManagement>
    <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>
			<!-- 打包时 MANIFEST.MF文件不记录的时间戳版本 -->
			<useUniqueVersions>false</useUniqueVersions>
			    <addClasspath>true</addClasspath>
			    <classpathPrefix>lib/</classpathPrefix>
		    </manifest>
		    <manifestEntries>
			<Class-Path>.</Class-Path>
		    </manifestEntries>
		</archive>
	    </configuration>
	</plugin>
	<plugin>
	    <groupId>org.apache.maven.plugins</groupId>
	    <artifactId>maven-dependency-plugin</artifactId>
	    <executions>
		<execution>
		    <id>copy-dependencies</id>
		    <phase>package</phase>
		    <goals>
			<goal>copy-dependencies</goal>
		    </goals>
		    <configuration>
			<type>jar</type>
			<includeTypes>jar</includeTypes>
			<useUniqueVersions>false</useUniqueVersions>
			<outputDirectory>
			    ${project.build.directory}/lib
			</outputDirectory>
		    </configuration>
                </execution>
	    </executions>
	</plugin>
    </plugins>
</build>

注意:

  spring-context.xml中:

<import resource="classpath:spring/dubbo-provider.xml" />



本文出自 “我爱大金子” 博客,请务必保留此出处http://1754966750.blog.51cto.com/7455444/1902586

学习dubbo(五):使用maven构建dubbo服务的可执行的jar