学习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如需转载请自行联系原作者

我爱大金子
相关文章
|
26天前
|
Java Docker 容器
|
2月前
|
XML Dubbo Java
【Dubbo3高级特性】「框架与服务」服务的异步调用实践以及开发模式
【Dubbo3高级特性】「框架与服务」服务的异步调用实践以及开发模式
31 0
|
2月前
|
XML Java Shell
【深入浅出Maven开发实战】「入门教程系列」带你零基础学习和开发使用Maven开发工具实战指南(实战技术总结)(一)
【深入浅出Maven开发实战】「入门教程系列」带你零基础学习和开发使用Maven开发工具实战指南(实战技术总结)
81 1
|
2月前
|
SpringCloudAlibaba Dubbo Java
SpringCloud Alibaba集成Dubbo实现远程服务间调用
SpringCloud Alibaba集成Dubbo实现远程服务间调用
|
3月前
|
前端开发 Java 数据库连接
Springboot-MyBatis配置-配置端口号与服务路径(idea社区版2023.1.4+apache-maven-3.9.3-bin)
Springboot-MyBatis配置-配置端口号与服务路径(idea社区版2023.1.4+apache-maven-3.9.3-bin)
33 0
|
2月前
|
XML Dubbo Java
【Dubbo3高级特性】「框架与服务」 Nacos作为注册中心-服务分组及服务分组聚合实现
【Dubbo3高级特性】「框架与服务」 Nacos作为注册中心-服务分组及服务分组聚合实现
59 0
|
2月前
|
Cloud Native Dubbo 应用服务中间件
【Dubbo3高级特性】「微服务云原生架构」带你从零基础认识搭建公司内部服务用户中心体系(实战指南-序章)
【Dubbo3高级特性】「微服务云原生架构」带你从零基础认识搭建公司内部服务用户中心体系(实战指南-序章)
60 0
|
2月前
|
Java fastjson 数据安全/隐私保护
【Dubbo3技术专题】「云原生微服务开发实战」 一同探索和分析研究RPC服务的底层原理和实现
【Dubbo3技术专题】「云原生微服务开发实战」 一同探索和分析研究RPC服务的底层原理和实现
40 0
|
2月前
|
XML Dubbo Java
【Dubbo3高级特性】「提升系统安全性」手把手教你如何通过令牌进行Dubbo3服务验证及服务鉴权控制实战指南(二)
【Dubbo3高级特性】「提升系统安全性」手把手教你如何通过令牌进行Dubbo3服务验证及服务鉴权控制实战指南
46 0
|
2月前
|
XML Cloud Native Dubbo
【Dubbo3高级特性】「提升系统安全性」手把手教你如何通过令牌进行Dubbo3服务验证及服务鉴权控制实战指南(一)
【Dubbo3高级特性】「提升系统安全性」手把手教你如何通过令牌进行Dubbo3服务验证及服务鉴权控制实战指南
48 1

热门文章

最新文章

推荐镜像

更多