【dubbo】使用Dubbo框架提供的Main方法类来运行dubbo服务——服务容器

曾经终败给现在 2024-02-19 21:30 110阅读 0赞

我们在dubbo的框架使用中,不能不提的就是如何运行我们的dubbo服务的jar包。比如provider的jar等。
根据现有经验,dubbo服务的运行方式有三种。

1.Dubbo服务的运行方式:

1、使用Servlet容器运行(Tomcat、Jetty等)——不可取
缺点:
增加复杂性(端口、管理)
浪费资源(内存)
2、自建Main方法类来运行(Spring容器) ——不建议(本地调试可用)
缺点:
Dobbo本身提供的高级特性没用上 自已编写启动类可能会有缺陷
3、使用Dubbo框架提供的Main方法类来运行(Spring容器)——建议使用
优点:
框架本身提供(com.alibaba.dubbo.container.Main)
可实现优雅关机(ShutdownHook) 详见(http://dubbo.apache.org/zh-cn/docs/user/demos/graceful-shutdown.html)

2.自建Main方法类来运行

对于这样的方式,我们主要在调试过程中使用。只需要写个测试类就可以了。

  1. package dubbo.test;
  2. import org.apache.commons.logging.Log;
  3. import org.apache.commons.logging.LogFactory;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5. /**
  6. *
  7. * @描述: 启动Dubbo服务用的MainClass.
  8. * @作者: 程金鹏
  9. * @创建时间: 2019年8月1日21:16:25
  10. * @版本: 1.0 .
  11. */
  12. public class DubboProvider {
  13. private static final Log log = LogFactory.getLog(DubboProvider.class);
  14. public static void main(String[] args) {
  15. try {
  16. ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/spring-context.xml");
  17. context.start();
  18. } catch (Exception e) {
  19. log.error("== DubboProvider context start error:",e);
  20. }
  21. synchronized (DubboProvider.class) {
  22. while (true) {
  23. try {
  24. DubboProvider.class.wait();
  25. } catch (InterruptedException e) {
  26. log.error("== synchronized error:",e);
  27. }
  28. }
  29. }
  30. }
  31. }

3. 使用Dubbo框架提供的Main方法类来运行

今天我们主要来说这种方式。

a 什么是服务容器

详见:http://dubbo.apache.org/zh-cn/docs/user/demos/service-container.html
服务容器是一个 standalone 的启动程序,因为后台服务不需要 Tomcat 或 JBoss 等 Web 容器的功能,如果硬要用 Web 容器去加载服务提供方,增加复杂性,也浪费资源。

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

服务容器的加载内容可以扩展,内置了 spring, jetty, log4j 等加载,可通过容器扩展点进行扩展。配置配在 java 命令的 -D 参数或者 dubbo.properties 中。

b 具体配置方式:

在需要配置的服务模块中的pom中增加如下代码:

  1. <build>
  2. <finalName>edu-service-user</finalName>
  3. <resources>
  4. <resource>
  5. <targetPath>${project.build.directory}/classes</targetPath>
  6. <directory>src/main/resources</directory>
  7. <filtering>true</filtering>
  8. <includes>
  9. <include>**/*.xml</include>
  10. <include>**/*.properties</include>
  11. </includes>
  12. </resource>
  13. <!-- 结合com.alibaba.dubbo.container.Main -->
  14. <resource>
  15. <targetPath>${project.build.directory}/classes/META-INF/spring</targetPath>
  16. <directory>src/main/resources/spring</directory>
  17. <filtering>true</filtering>
  18. <includes>
  19. <include>spring-context.xml</include>
  20. </includes>
  21. </resource>
  22. </resources>
  23. <pluginManagement>
  24. <plugins>
  25. <!-- 解决Maven插件在Eclipse内执行了一系列的生命周期引起冲突 -->
  26. <plugin>
  27. <groupId>org.eclipse.m2e</groupId>
  28. <artifactId>lifecycle-mapping</artifactId>
  29. <version>1.0.0</version>
  30. <configuration>
  31. <lifecycleMappingMetadata>
  32. <pluginExecutions>
  33. <pluginExecution>
  34. <pluginExecutionFilter>
  35. <groupId>org.apache.maven.plugins</groupId>
  36. <artifactId>maven-dependency-plugin</artifactId>
  37. <versionRange>[2.0,)</versionRange>
  38. <goals>
  39. <goal>copy-dependencies</goal>
  40. </goals>
  41. </pluginExecutionFilter>
  42. <action>
  43. <ignore />
  44. </action>
  45. </pluginExecution>
  46. </pluginExecutions>
  47. </lifecycleMappingMetadata>
  48. </configuration>
  49. </plugin>
  50. </plugins>
  51. </pluginManagement>
  52. <plugins>
  53. <!-- 打包jar文件时,配置manifest文件,加入lib包的jar依赖 -->
  54. <plugin>
  55. <groupId>org.apache.maven.plugins</groupId>
  56. <artifactId>maven-jar-plugin</artifactId>
  57. <configuration>
  58. <classesDirectory>target/classes/</classesDirectory>
  59. <archive>
  60. <manifest>
  61. <mainClass>com.alibaba.dubbo.container.Main</mainClass>
  62. <!-- 打包时 MANIFEST.MF文件不记录的时间戳版本 -->
  63. <useUniqueVersions>false</useUniqueVersions>
  64. <addClasspath>true</addClasspath>
  65. <classpathPrefix>lib/</classpathPrefix>
  66. </manifest>
  67. <manifestEntries>
  68. <Class-Path>.</Class-Path>
  69. </manifestEntries>
  70. </archive>
  71. </configuration>
  72. </plugin>
  73. <plugin>
  74. <groupId>org.apache.maven.plugins</groupId>
  75. <artifactId>maven-dependency-plugin</artifactId>
  76. <executions>
  77. <execution>
  78. <id>copy-dependencies</id>
  79. <phase>package</phase>
  80. <goals>
  81. <goal>copy-dependencies</goal>
  82. </goals>
  83. <configuration>
  84. <type>jar</type>
  85. <includeTypes>jar</includeTypes>
  86. <useUniqueVersions>false</useUniqueVersions>
  87. <outputDirectory>
  88. ${project.build.directory}/lib
  89. </outputDirectory>
  90. </configuration>
  91. </execution>
  92. </executions>
  93. </plugin>
  94. </plugins>
  95. </build>

这样构建出来的jar 便可以直接使用命令来执行了。

  1. java -jar xxxx.jar

发表评论

表情:
评论列表 (有 0 条评论,110人围观)

还没有评论,来说两句吧...

相关阅读

    相关 图解DubboDubbo服务提供者详解

    本文将介绍 Dubbo 中的服务提供者,包括服务提供者的定义、服务暴露的方式、服务注册的实现、服务提供者的容错处理、服务提供者集群以及服务提供者的网络通信。 ![148007