dubbo服务的运行方式有三种,分别为:
      1. 使用Servlet容器运行(Tomcat、Jetty等)
      2. 自建Main方法类来运行(Spring容器)
      3. 使用Dubbo框架提供的Main方法类来运行(Spring容器)
    下面通过详细介绍与配置,比较一下三种方式。
      1. tomcat等web容器
      此方式和我们平时在IDE(Eclipse、IDEA等)环境中部署项目一样,将dubbo服务项目直接添加到容器中启动即可,不需要做任何配置。
      但此方式其实是不可取的,它增加了复杂性(端口、管理等方面),也浪费资源(内存)。
      2. 自建Main方法类运行
      此方式是类似自己写了一个测试的方法,该方法通过初始化spring的配置文件,从而启动dubbo服务。Main方法代码如下:
public class DubboProvider {

    private static final Log log = LogFactory.getLog(DubboProvider.class);

    public static void main(String[] args) {
        try {
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/spring-context.xml");
            context.start();
        } catch (Exception e) {
            log.error("== DubboProvider context start error:",e);
        }
        synchronized (DubboProvider.class) {
            while (true) {
                try {
                    DubboProvider.class.wait();
                } catch (InterruptedException e) {
                    log.error("== synchronized error:",e);
                }
            }
        }
    }

}
      同样,此方式也存在一定的缺点:Dubbo本身提供的高级特性没用上;自己编写启动类可能会有缺陷,所以不建议使用,但可用于本地调试。
      3. 使用Dubbo框架提供的Main方法类运行
      此方法只需要修改一下项目的pom文件,配置代码如下:
<!--MAVEN打包duboo可执行jar begin -->  
    <build>  
        <finalName>edu-service-user</finalName>  

        <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>  

        <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>  

                                        <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>  
<!--MAVEN打包duboo可执行jar end -->
      配置好以后,只需要在IDE中执行一下Maven install命令,便会打出一个jar包,在启动服务的时候,直接使用java -jar命令执行jar包即可。
      此方式是建议使用的方式,其优势在于是
      1. 由框架本身提供(com.alibaba.dubbo.container.Main);
      2. 可实现优雅关机(ShutdownHook)
      本博客介绍的内容属于dubbo中服务容器的要点,关于服务容器的介绍,官方文档简单总结了如下几点:
      1. 服务容器是一个standalone的启动程序,因为后台服务不需要Tomcat或JBoss等web容器的功能,如果硬要用web容器去加载服务提供方,增加复杂性,也浪费资源。
      2. 服务容器只是一个简单的Main方法,并加载一个简单的spring容器,用于暴露服务。
      3. 服务容器的加载内容可以扩展,内置了spring、jetty、log4j等加载,可通过Container扩展点进行扩展。
      从以上介绍,我们也很容易得出,上面介绍的三种方式,该如何进行选择。
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐