Dubbo服务运行
1、使用Servlet容器运行(Tomcat、Jetty等) -不可用
缺点:增加复杂性(端口、管理)
浪费资源(内存)
需要占用多个端口和内存,这种方式是不可取的

2、自己建立Main方法类运行(Srping容器) 本地调试用,本地调试的方式是很重要的,在本地测试中,必须掌握。
缺点:Dobbo本省提供的高级特性没用上,自己的启动类可能有缺陷
案例查看:Dubbo之入门案例-yellowcong

3、使用Dubbo框架提供的Main方法类来运行(Spring 容器) 建议使用
优点:框架本身提供(com.alibaba.dubbo.container.Main),可是现优雅关机(ShutdownHook)

这个地方,我之做第三种的案例

环境搭建

在配置文件中,需要注意我们配置的spring.xml文件,需要打包到META-INF/spring目录下,这个是dubbo规范 ,需要这么做

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>yellowcong</groupId>
    <artifactId>dubbo-provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>dubbo-provider</name>
    <url>http://maven.apache.org</url>


    <!-- 配置国内比较快的 阿里云的Maven仓库 -->
    <repositories>
        <repository>
            <id>aliyunmaven</id>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        </repository>
    </repositories>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <!-- dubbo -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.6</version>
        </dependency>
        <!-- zkclient 客户端 -->
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>

        <!-- Junit 测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <finalName>dubbo-provider</finalName>
        <!-- 配置文件的打包操作 -->
        <resources>
            <resource>
                <targetPath>${project.build.directory}/classes</targetPath>
                <directory>src/main/resources</directory>
                <!-- 将 xml和properties文件都打包到build目录下的 classes目录下 -->
                <filtering>true</filtering>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes>
            </resource>
            <!-- 将Spring 的配置文件单独打包到META-INF目录下 -->
            <!-- 自动加载META-INF/spring目录下的所有Spring配置。 配置:(配在java命令-D参数或者dubbo.properties中) 
                dubbo.spring.config=classpath*:META-INF/spring/*.xml 配置spring配置加载位置 -->
            <resource>
                <targetPath>${project.build.directory}/classes/META-INF/spring</targetPath>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
                <includes>
                    <include>spring-provider.xml</include>
                </includes>
            </resource>
        </resources>

        <!-- 解决Maven在Eclipse内执行的执行了一系列的生命周期引起冲突 -->
        <pluginManagement>
            <plugins>
                <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>
                <version>2.9</version>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <type>jar</type>
                            <incluedTypes>jar</incluedTypes>
                            <useUniqueVersions>false</useUniqueVersions>
                            <outputDirectory>
                                ${project.build.directory}/lib
                            </outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

打包服务

mvn clean

mvn install

生成的打包文件中,lib和 xx.jar是我们想要的东西

Dubbo之服务运行的三种方式-yellowcong_dubbo

将lib和jar拷贝到服务器

目录项目下,有jar和lib依赖包
Dubbo之服务运行的三种方式-yellowcong_dubbo_02

jar包里面的数据类容
Dubbo之服务运行的三种方式-yellowcong_spring_03

这个文件MANIFEST.MF是java的编译的规范,里面定义了依赖的jar包和主函数的入口,我们可以看到主函数的入口是 阿里巴巴所推荐的Main函数

class/META-INF/MANIFEST.MF

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: yellowcong
Class-Path: . lib/dubbo-2.5.6.jar lib/spring-context-4.3.10.RELEASE.ja
 r lib/spring-aop-4.3.10.RELEASE.jar lib/spring-core-4.3.10.RELEASE.ja
 r lib/commons-logging-1.2.jar lib/spring-expression-4.3.10.RELEASE.ja
 r lib/spring-beans-4.3.10.RELEASE.jar lib/spring-web-4.3.10.RELEASE.j
 ar lib/javassist-3.20.0-GA.jar lib/netty-3.2.5.Final.jar lib/zkclient
 -0.1.jar lib/zookeeper-3.3.3.jar lib/jline-0.9.94.jar lib/log4j-1.2.1
 4.jar
Created-By: Apache Maven 3.5.0
Build-Jdk: 1.8.0_102
Main-Class: com.alibaba.dubbo.container.Main

启动dubbo服务のjar包

//启动服务
 java -jar dubbo-provider.jar

Dubbo之服务运行的三种方式-yellowcong_其他_04

最后看到了,dubbo启动成功了
Dubbo之服务运行的三种方式-yellowcong_其他_05

查看管控台,发现服务已经注册成功了

Dubbo之服务运行的三种方式-yellowcong_其他_06