Dubbo 服务的运行方式
使用Servlet 容器运行(Tomcat 、Jetty 等)
不可取 缺点如下:
- 增加复杂性(端口、管理)
- 浪费资源(内存)
自建Main 方法类来运行(Spring 容器)
不建议 (可用于测试、但是测试最好使用Junit) 缺点如下:
- Dobbo 本身提供的高级特性没用上
- 自已编写启动类可能会有缺陷
- Junit测试代码可以如下写
@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations = "classpath:spring/spring-context.xml")public class DubboProvider { @Test public void testStartRrgistry(){ System.out.println("-----------1"); synchronized (DubboProvider.class) { while (true) { System.out.println("-----------2"); try { DubboProvider.class.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } }}
- main方法的测试
-
public class DubboProvider { private static final Log log = LogFactory.getLog(DubboProvider.class); 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); } } } } }
使用Dubbo 框架提供的Main 方法类来运行(Spring 容器)
推荐使用,优点如下:
- 框架本身提供(com.alibaba.dubbo.container.Main)
- 可实现优雅关机(ShutdownHook)
- Dubbo是通过JDK的ShutdownHook来完成优雅停机的,所以如果用户使用"kill -9 PID"等强制关闭指令,是不会执行优雅停机的,只有通过"kill PID"时,才会执行。
- 服务提供方
- 停止时,先标记为不接收新请求,新请求过来时直接报错,让客户端重试其它机器。
- 然后,检测线程池中的线程是否正在运行,如果有,等待所有线程执行完成,除非超时,则强制关闭。
- 服务消费方
- 停止时,不再发起新的调用请求,所有新的调用在客户端即报错。
- 然后,检测有没有请求的响应还没有返回,等待响应返回,除非超时,则强制关闭。
- 设置优雅停机超时时间,缺省超时时间是10秒:(超时则强制关剂机)
- 如果ShutdownHook不能生效,可以自行调用:
ProtocolConfig.destroyAll();
spring Container 加载
这里只讲Spring Container,如果更多的加载可以去dubbo官网查看。自动加载META-INF/spring目录下的所有Spring配置。
- 配置:(配在java命令-D参数或者dubbo.properties中)
- dubbo.spring.config=classpath*:META-INF/spring/*.xml ----配置spring配置加载位置
- 基于maven的实现
- 在build的resources增加(注意:发现resource没有继承,待研究)
${project.build.directory}/classes/META-INF/spring src/main/resources/spring true spring-context.xml - 在build的plugins增加
org.apache.maven.plugins maven-jar-plugin 3.0.2 target/classes/ com.alibaba.dubbo.container.Main false true lib/ . org.apache.maven.plugins maven-dependency-plugin 2.10 copy-dependencies package copy-dependencies jar jar false ${project.build.directory}/lib - 修改Spring的配置文件(例如:spring-context.xml),修改其中的import路径:
-
因为maven的pom配置文件中指定了配置文件打包的存放路径
- 在build的resources增加(注意:发现resource没有继承,待研究)