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="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" />

这里构建的jar所引用的其它jar在与此jar同级的lib文件夹中


文件结构:

wKiom1i3yn6xATvcAAAe31RhG3M785.png


上面的外部引用jar包放在lib文件夹中,下面我们来介绍一种内置打包的方法:

<plugins>
    <!-- 内置打包法 -->
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <!-- 用这个maven打包插件 -->
        <artifactId>maven-shade-plugin</artifactId>
        <version>2.3</version>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>shade</goal>
                </goals>
                <configuration>
                    <!-- 默认值为true.注意这个属性,如果你用这个插件来deploy,或者发布到中央仓库,这个属性会缩减你的pom文件,会把你依赖的<dependency>干掉 -->
                    <createDependencyReducedPom>false</createDependencyReducedPom>
                    <transformers>
                        <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                            <resource>META-INF/spring.handlers</resource>
                        </transformer>
                        <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                            <resource>META-INF/spring.schemas</resource>
                        </transformer>
                        <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                            <!-- 这个是你的程序入口文件 -->
                            <mainClass>com.alibaba.dubbo.container.Main</mainClass>
                        </transformer>
                    </transformers>
                </configuration>
            </execution>
        </executions>
    </plugin>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.4</version>
        <configuration>
            <encoding>UTF-8</encoding>
        </configuration>
    </plugin>
</plugins>