使用Maven构建Dubbo服务的可执行jar包

Dubbo服务的运行方式

1.使用Servlet容器运行(tomcat,jetty等)---不可取

缺点:

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

比如说tomcat,启动tomcat容器,tomcat本身会占用一个端口,dubbo服务本身也会占用一个端口。如果启动多个tomcat容器来启动多个服务,或者说一个tomcat容器中启动多个dubbo服务等都会增加配置、容器内存调优等管理的成本。

tomcat容器本身启动时也会占用几百兆内存

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

缺点:

dubbo本身提供的很多高级特性没有用上,自己编写启动类可能会有缺陷,比如没有考虑优雅关机等一些特殊的处理

但是在开发环境做本地调试可以使用这种方式

public static void main(String[] args) {
        try {
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/spring-context.xml");
            context.start();
        } catch (Exception e) {
            log.error("== DubboProvider context start error:",e);
        }
        synchronized (DubboProvider.class) {
            while (true) {
                try {
                    DubboProvider.class.wait();
                } catch (InterruptedException e) {
                    log.error("== synchronized error:",e);
                }
            }
        }
    }

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

优点:

1)框架本身提供的

2)可实现优雅关机(某个服务当前还有业务在运行,申请关闭服务后,会等待当前运行的业务运行完毕)

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

优雅停机的原理:

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

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

如何使用Maven来构建可运行jar包

如下pom文件中的配置基本上是不用修改,直接可用的


        edu-service-user
        
            
            
                ${project.build.directory}/classes
                src/main/resources
                true
                
                    **/*.xml
                    **/*.properties
                

            

            
            
            
                ${project.build.directory}/classes/META-INF/spring
                src/main/resources/spring
                true
                
                    spring-context.xml
                

            

        

        
        
        
            
                
                
                    org.eclipse.m2e
                    lifecycle-mapping
                    1.0.0
                    
                        
                            
                                
                                    
                                        org.apache.maven.plugins
                                        maven-dependency-plugin
                                        [2.0,)
                                        
                                            copy-dependencies
                                        

                                    

                                    
                                        
                                    

                                

                            

                        

                    

                

            

        

        
        
            
                
                org.apache.maven.plugins
                maven-jar-plugin
                
                    target/classes
                    
                        
                            com.alibaba.dubbo.container.Main
                            
                            false
                            
                            true
                            lib/
                        

                        
                            .
                        

                    

                
            
            

            
                org.apache.maven.plugins
                maven-dependency-plugin
                
                    
                        copy-dependencies
                        package
                        
                            copy-dependencies
                        

                        
                            jar
                            jar
                            false
                            
                            
                                ${project.build.directory}/lib
                            

                        

                    

                

            

        

    

这里假定在Run As -> maven install服务工程时,服务依赖的子工程,比如接口工程都已经maven install到了本地私有库

构建完成后会在目录的targe目录下看到打好的jar包

使用Maven构建Dubbo服务的可执行jar包_第1张图片

本地运行jar包

将上面打包生成的edu-service-user.jar以及lib文件夹拷贝放到本地目录下,比如E:\work\user

cmd命令窗口定位到E:\work\user

输入命令:java -jar edu-service-user.jar &

ok,启动成功了

可以看到dubbo服务已经注册到了dubbo管控台中

使用Maven构建Dubbo服务的可执行jar包_第2张图片

over

 

你可能感兴趣的:(使用Maven构建Dubbo服务的可执行jar包)