• 跟我学习dubbo-使用Maven构建Dubbo服务的可执行jar包(4)


    Dubbo服务的运行方式:

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

    缺点:增加复杂性(端口、管理) 浪费资源(内存)

    官方:服务容器是一个standalone的启动程序,因为后台服务不需要Tomcat或JBoss等Web容器的功能,如果硬要用Web容器去加载服务提供方,增加复杂性,也浪费资源。

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

    缺点: Dobbo本身提供的高级特性没用上 自已编写启动类可能会有缺陷 

    官方:服务容器只是一个简单的Main方法,并加载一个简单的Spring容器,用于暴露服务。

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

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

    可实现优雅停机(ShutdownHook) 

    官方:服务容器的加载内容可以扩展,内置了spring, jetty, log4j等加载,可通过Container扩展点进行扩展

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

    原理:

    • 服务提供方

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

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

    • 服务消费方

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

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

    设置优雅停机超时时间,缺省超时时间是10秒:(超时则强制关闭)

    < dubbo:application ...>
         < dubbo:parameter key = "shutdown.timeout" value = "60000" /> <!-- 单位毫秒 -->

    </dubbo:application>

    如果ShutdownHook不能生效,可以自行调用:

    ProtocolConfig.destroyAll();

    打包

    传统的打jar包,大部分人员还在使用eclipse自带的导出一个jar包,对于传统的单实例项目是没有问题的,但对于比较复杂的maven分模块项目,这种做法就不行了。

    下面介绍maven打包方式:

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

    官网声明: Spring Container

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

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

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

      所以声明必须使用maven方式配置才能将spring配置文件打包到META-INF/spring目录下

    引入相关插件:

    <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>
                                <addClasspath>true</addClasspath>
                                <classpathPrefix>lib/</classpathPrefix>
                            </manifest>
                            <manifestEntries>
                                <Class-Path>.</Class-Path>
                            </manifestEntries>
                        </archive>
                    </configuration>
                </plugin>

    ....省略一些配置

    </plugins>

    重点关注标红色的配置,容器启动使用的是容器Main方法启动,故需要配置

    配置好以后,我们就可以使用maven的命令打需要的服务jar包。利用java -jar命令去执行你的jar包,就可以将服务注册到你的zookeeper注册中心了。

    请各位持续关注《跟我学习dubbo-在Linux操作系统上手工部署Dubbo服务(5)》

    由于第一次写关于dubbo的博客,还希望大家加入dubbo学习交流群(446855438),一起学习。

  • 相关阅读:
    VS2005调试问题与解决方法集锦
    [转]在.net 2005中,将数据集序列化成二进制,提高远程传输效率
    DotNet 网上相关资源
    NeHE中文学习网址
    Aspx页上设置客户端的缓存时间
    动态调用Win32 Function(API)
    PB调用COM组件
    字段绑定的效率问题
    三维向量类
    用DataTable绑定TreeView的方法
  • 原文地址:https://www.cnblogs.com/jeesml/p/5104270.html
Copyright © 2020-2023  润新知