Dubbo服务治理篇——你知道如何将Dubbo服务打包成Jar文件吗?这篇文章帮你搞定!!

简介: 1、使用Servlet容器运行(Tomcat、Jetty等)----不可取 缺点:增加复杂性(端口、管理)tomcat/jetty等占用端口,dubbo服务也需要端口浪费资源(内存):单独启动tomcat,jetty占用内存大

一、Dubbo服务的运行方式


1、使用Servlet容器运行(Tomcat、Jetty等)----不可取 缺点:增加复杂性(端口、管理)

tomcat/jetty等占用端口,dubbo服务也需要端口

浪费资源(内存):单独启动tomcat,jetty占用内存大


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

缺点:Dobbo本身提供的高级特性没用上

自已编写启动类可能会有缺陷


3、使用Dubbo框架提供的Main方法类来运行(Spring容器)----建议使用 优点:框架本身提供(com.alibaba.dubbo.container.Main)

可实现优雅关机(ShutdownHook)


注意点:


spring-context.xml
<import resource="classpath:spring/xxx.xml" />



官方:

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


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


原理:


服务提供方停止时,先标记为不接收新请求,新请求过来时直接报错,让客户端重试其它机器。然后,检测线程池中的线程是否正在运行,如果有,等待所有线程执行完成,除非超时,则强制关闭。


服务消费方停止时,不再发起新的调用请求,所有新的调用在客户端即报错。然后,检测有没有请求的响应还没有返回,等待响应返回,除非超时,则强制关闭。


二、Maven构建Dubbo服务可执行Jar包的配置


<!--MAVEN打包duboo可执行jar begin -->
<build>
  <finalName>mydubbo-server</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>
    </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>
  <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>
<!--MAVEN打包duboo可执行jar end -->


用Maven将工程打成jar包后,进入工程的target目录后,将mydubbo-server.jar和lib目录拷贝到指定的目录下,命令行运行


java -jar mydubbo-server.jar

就可以运行dubbo服务了。(注:lib目录下的所有jar包是mydubbo-server.jar的依赖jar)。


如果想在服务后台运行Jar文件,可以使用如下命令启动Jar文件。


nohup java -jar mydubbo-server.jar >> /dev/null &
相关文章
课时103:生成jar文件
本文介绍了Java中生成和使用JAR文件的基本概念与操作。JAR文件用于将多个类文件打包成一个压缩文件,便于管理和分发。通过JDK提供的`jar`命令可以创建JAR文件,并可通过设置CLASSPATH环境变量来配置和使用这些文件。文中还演示了如何定义、编译和打包一个简单的Java程序为JAR文件,并详细解释了JAR文件的结构及配置方法。此外,简要提及了JDK 1.9后引入的模块化系统对JAR文件的影响。
331 1
|
Java Maven
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
在Java项目中,启动jar包时遇到“no main manifest attribute”错误,且打包大小明显偏小。常见原因包括:1) Maven配置中跳过主程序打包;2) 缺少Manifest文件或Main-Class属性。解决方案如下:
3062 8
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
|
前端开发 JavaScript Java
Java打包jar运行时分离lib和jar
在`pom.xml`的`build`节点中,设置`packaging`为`jar`,并配置插件分离依赖库到`lib`目录和资源文件到`resources`目录。这样可以在运行时通过`-Dloader.path=lib,resources`加载外部依赖和资源文件,便于独立升级依赖库和修改资源文件,而无需重新打包程序。具体插件包括`maven-dependency-plugin`、`maven-resources-plugin`和`spring-boot-maven-plugin`等。
822 2
|
Java 开发者
修改JAR文件工具
本文介绍了一款名为JarEditor的IDEA插件,该插件允许用户直接对JAR包内的文件进行增删改查操作,无需先行解压。通过简单的安装与使用步骤,大大简化了传统上需要解压缩、反编译、重新编译及打包的过程。此外,JarEditor还支持对混淆过的JAR文件进行字节码级别的修改,并提供了强大的搜索功能,支持大小写、全词匹配和正则表达式搜索。对于开发者而言,这款插件无疑极大提高了处理JAR文件的效率和便捷性。
992 14
|
Java 应用服务中间件 Maven
Maven的三种项目打包方式——pom,jar,war的区别
Maven 提供了多种打包方式,分别适用于不同类型的项目。pom 用于父项目或聚合项目,便于项目的结构和依赖管理;jar 用于Java类库或可执行的Java应用程序;war 则专用于Java Web应用程序的部署。理解这些打包方式的用途和特点,可以帮助开发者更好地配置和管理Maven项目,确保构建和部署过程的顺利进行。无论是单模块项目还是多模块项目,选择合适的打包方式对于项目的成功至关重要。
2362 3
|
Java Maven 容器
Maven使用IDEA自带工具打包,同时将lib下的jar包打入,双击jar包可直接运行
使用IntelliJ IDEA的Artifacts功能,可以将项目依赖的第三方jar包打包进jar文件中,实现双击jar包即可直接运行。
Maven使用IDEA自带工具打包,同时将lib下的jar包打入,双击jar包可直接运行
|
Java Windows
如何在windows上运行jar包/JAR文件 如何在cmd上运行 jar包 保姆级教程 超详细
本文提供了一个详细的教程,解释了如何在Windows操作系统的命令提示符(cmd)中运行JAR文件。
9324 1
|
Java Maven
构建Springboot项目、实现简单的输出功能、将项目打包成可以执行的JAR包(详细图解过程)
这篇文章详细介绍了构建SpringBoot项目的过程,包括新建工程、选择环境配置、添加依赖、项目结构说明,并演示了如何编写一个简单的Controller控制器实现输出功能,最后讲解了如何使用Maven将项目打包成可执行的JAR包,并提供了运行JAR包的命令和测试效果。
构建Springboot项目、实现简单的输出功能、将项目打包成可以执行的JAR包(详细图解过程)
|
Dubbo Java 应用服务中间件
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo:微服务通信的高效解决方案
【10月更文挑战第15天】随着信息技术的发展,微服务架构成为企业应用开发的主流。Spring Cloud Dubbo结合了Dubbo的高性能RPC和Spring Cloud的生态系统,提供高效、稳定的微服务通信解决方案。它支持多种通信协议,具备服务注册与发现、负载均衡及容错机制,简化了服务调用的复杂性,使开发者能更专注于业务逻辑的实现。
335 2