dubbo-容器(可执行性jar启动项目)

    xiaoxiao2023-07-28  188

    1 引言

    众所周知,不管是dubbo服务的提供方还是服务的消费方,我们都可以把工程打包成war包放到web容器(servlet容器)中启动,但这种方式是否合理呢?在dubbo的 官方文档 中,介绍了dubbo的服务提供方其实是不需要web容器单独运行的,也就是本文将要介绍的通过java命令 java -jar dubbo服务.jar 这个命令运行服务,为了运行这个jar包,我们必须把服务打包成可运行jar包,并把所依赖的jar放在约定的目录下。

    如果不了解可执行jar的打包方法,请参考文章:https://my.oschina.net/thinwonton/blog/877493

    为什么对于服务提供方的工程,dubbo官方推荐使用可执行jar的方式运行呢,下面对三种启动方式进行比较:

    使用web容器(Tomcat、Jetty等)启动dubbo服务 : 增加端口管理复杂性, tomcat/jetty等都需要占用端口,dubbo服务也需要端口;浪费资源(内存),单独启动 tomcat,jetty占用内存大使用自建Main方法类运行spring容器启动dubbo服务:Dobbo提供的优雅停机高级特性没用上,并且自已编写启动类可能会有缺陷使用Dubbo框架提供的Main方法类运行Spring容器启动服务:官方建议使用,dubbo框架本身提供启动类(com.alibaba.dubbo.container.Main),可实现优雅关机

    对于优雅停机的概念和原理,请参考文档: http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-优雅停机

    那么,下面我们来研究怎么使用java命令启动dubbo服务吧。

    2 命令行运行dubbo服务

    相对于使用web容器启动的方式,该方式除了需要修改maven配置外,不需要修改原有的配置。

    2.1 打包可运行jar的maven配置

    主要利用maven的maven-jar-plugin和maven-dependency-plugin插件,前一个插件是配置可运行jar的manifest清单文件,该清单文件主要配置主程序main所在的位置还有依赖的jar包的位置。由于dubbo启动类 com.alibaba.dubbo.container.Main 默认自动加载META-INF/spring目录下的所有Spring配置,所以我们还需要把spring的配置文件通过maven拷贝到指定目录。除此之外,packaging的构建包类型修改为jar。完整的pom文件如下:

    <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> <parent> <groupId>com.github.thinwonton.dubbo.sample</groupId> <artifactId>dubbo-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <relativePath>../dubbo-parent</relativePath> </parent> <groupId>com.github.thinwonton.dubbo.sample</groupId> <artifactId>container-provider</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>dubbo-container-提供者</name> <build> <!-- 输出文件名 --> <finalName>dubbo-container-provider</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> <excludes> <!-- spring配置文件由下面的配置:拷贝到META-INF/spring中 --> <exclude>spring/*.xml</exclude> </excludes> </resource> <!-- com.alibaba.dubbo.container.Main加载spring配置文件的路径 META-INF/spring --> <resource> <targetPath>${project.build.directory}/classes/META-INF/spring</targetPath> <directory>src/main/resources/spring</directory> <filtering>true</filtering> <includes> <include>*.xml</include> </includes> </resource> </resources> <plugins> <!-- 资源文件拷贝插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.7</version> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> <!-- java编译插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.2</version> <configuration> <source>1.7</source> <target>1.7</target> <encoding>UTF-8</encoding> </configuration> </plugin> <!-- 打包jar文件时,配置manifest文件,加入lib包的jar依赖 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.6</version> <configuration> <classesDirectory>target/classes/</classesDirectory> <archive> <manifest> <!-- 打包时 MANIFEST.MF文件不记录的时间戳版本 --> <useUniqueVersions>false</useUniqueVersions> <!-- 添加Class-Path --> <addClasspath>true</addClasspath> <!-- Class-Path添加前缀 --> <classpathPrefix>lib/</classpathPrefix> <!-- 指定Main-Class --> <mainClass>com.alibaba.dubbo.container.Main</mainClass> </manifest> </archive> </configuration> </plugin> <!-- 拷贝依赖的jar包到lib目录 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>2.10</version> <executions> <execution> <id>copy</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory> <!-- 拷贝依赖到lib文件夹 --> ${project.build.directory}/lib </outputDirectory> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>

    2.2 运行

    (1)到工程目录的根目录,运行 mvn clean package ,由maven在target目录构建jar包和拷贝依赖包到target/lib目录

    (2)自建一个文件夹,把构建出来的jar和lib目录拷贝到新建文件夹中,然后使用java -jar命令运行服务

    java -jar dubbo-container-provider.jar

    文章转载自 开源中国社区 [http://www.oschina.net]

    最新回复(0)