学习dubbo(五):使用maven构建dubbo服务的可执行的jar

简介:

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秒:(超时则强制关闭)

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

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

1
2
3
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
<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中:

1
< import  resource= "classpath:spring/dubbo-provider.xml"  />

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


文件结构:

wKiom1i3yn6xATvcAAAe31RhG3M785.png


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
< 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 >
   本文转自我爱大金子博客51CTO博客,原文链接http://blog.51cto.com/1754966750/1902586如需转载请自行联系原作者

我爱大金子
相关文章
|
3月前
|
Java 应用服务中间件 测试技术
Maven学习笔记(一):Maven基础(基于命令行的学习和应用)
Maven 是一款 Java 项目构建工具,主要用于管理 jar 包及其依赖关系。 本文主要了解Maven基础知识及基础应用,旨在为之后的进一步学习奠定基础。 内容上几近全为学习《尚硅谷2022版Maven教程》整理所得。 仅供参考。
294 81
Maven学习笔记(一):Maven基础(基于命令行的学习和应用)
|
4月前
|
敏捷开发 Java 测试技术
阿里云云效产品使用合集之如何下载流水线构建过程中生成的jar
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
1月前
|
Java 应用服务中间件 Maven
Maven的三种项目打包方式——pom,jar,war的区别
Maven 提供了多种打包方式,分别适用于不同类型的项目。pom 用于父项目或聚合项目,便于项目的结构和依赖管理;jar 用于Java类库或可执行的Java应用程序;war 则专用于Java Web应用程序的部署。理解这些打包方式的用途和特点,可以帮助开发者更好地配置和管理Maven项目,确保构建和部署过程的顺利进行。无论是单模块项目还是多模块项目,选择合适的打包方式对于项目的成功至关重要。
122 3
|
2月前
|
存储 负载均衡 监控
dubbo学习一:zookeeper与dubbo的关系,下载安装启动zookeeper(解决启动中报错)
这篇文章是关于Apache Dubbo框架与Zookeeper的关系,以及如何下载、安装和启动Zookeeper的教程,包括解决启动过程中可能遇到的报错问题。
98 3
dubbo学习一:zookeeper与dubbo的关系,下载安装启动zookeeper(解决启动中报错)
|
2月前
|
Dubbo Java 应用服务中间件
Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架
尼恩团队的15大技术圣经,旨在帮助开发者系统化、体系化地掌握核心技术,提升技术实力,从而在面试和工作中脱颖而出。本文介绍了如何使用Dubbo3.0与Spring Cloud Gateway进行整合,解决传统Dubbo架构缺乏HTTP入口的问题,实现高性能的微服务网关。
|
2月前
|
监控 Dubbo Java
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
这篇文章详细介绍了如何将Spring Boot与Dubbo和Zookeeper整合,并通过Dubbo管理界面监控服务注册情况。
173 0
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
|
2月前
|
Dubbo IDE Java
dubbo学习二:下载Dubbo-Admin管理控制台,并分析在2.6.1及2.6.1以后版本的变化
这篇文章是关于如何下载和部署Dubbo管理控制台(dubbo-admin)的教程,并分析了2.6.1版本及以后版本的变化。
99 0
dubbo学习二:下载Dubbo-Admin管理控制台,并分析在2.6.1及2.6.1以后版本的变化
|
4月前
|
前端开发 Java 编译器
【前端学java】如何从前端视角快速学习Maven
【8月更文挑战第12天】如何从前端视角快速学习Maven
69 2
【前端学java】如何从前端视角快速学习Maven
|
4月前
|
Java Maven
构建Springboot项目、实现简单的输出功能、将项目打包成可以执行的JAR包(详细图解过程)
这篇文章详细介绍了构建SpringBoot项目的过程,包括新建工程、选择环境配置、添加依赖、项目结构说明,并演示了如何编写一个简单的Controller控制器实现输出功能,最后讲解了如何使用Maven将项目打包成可执行的JAR包,并提供了运行JAR包的命令和测试效果。
构建Springboot项目、实现简单的输出功能、将项目打包成可以执行的JAR包(详细图解过程)
|
4月前
|
Java Maven
SpringBoot 引用仓库中没有 第三方包 - 将jar 包安装本地 maven
SpringBoot 引用仓库中没有 第三方包 - 将jar 包安装本地 maven
50 0