这里先给出Dubbo的中文网站http://dubbo.apache.org/zh-cn/index.html,大家可以根据文档对Dubbo有个初步的认识和了解。
大家可以根据Dubbo网站说明创建一个例子来学习,当然我这里也一个简单Demo,下载地址:https://github.com/godwar/dubbo-simple。这个初始化的demo是没有配置注册中心的。
当第一个Dubbo成功运行后,大家可能会存在一个问题,Dubbo到底是如何启动使用的?那我们就来看看代码
public class App
{
public static void main( String[] args ) throws IOException {
ClassPathXmlApplicationContext classPathXmlApplicationContext =
new ClassPathXmlApplicationContext(new String[]{"META-INF/spring/application.xml"}) ;
classPathXmlApplicationContext.start();
System.in.read();
}
}
Dubbo 提供了一个 Main.main 快速启动相应的容器它会启动Dubbo配置的多个container。默认情况下,只会启动 spring 容器
public class App
{
public static void main( String[] args ) throws IOException {
Main.main(args);
}
}
查看源码如下
public static void main(String[] args) {
try {
if (ArrayUtils.isEmpty(args)) {
String config = ConfigUtils.getProperty("dubbo.container", loader.getDefaultExtensionName());
args = CommonConstants.COMMA_SPLIT_PATTERN.split(config);
}
//申明了一个存放多个容器的集合
final List<Container> containers = new ArrayList();
for(int i = 0; i < args.length; ++i) {
containers.add(loader.getExtension(args[i]));
}
logger.info("Use container type(" + Arrays.toString(args) + ") to run dubbo serivce.");
//对容器循环停止
if ("true".equals(System.getProperty("dubbo.shutdown.hook"))) {
Runtime.getRuntime().addShutdownHook(new Thread("dubbo-container-shutdown-hook") {
public void run() {
Iterator var1 = containers.iterator();
while(var1.hasNext()) {
Container container = (Container)var1.next();
}
....
//对多个容器进行循环启动
while(var12.hasNext()) {
Container container = (Container)var12.next();
container.start();
logger.info("Dubbo " + container.getClass().getSimpleName() + " started!");
}
....
通过跟着可以发现有三种容器
Spring Container
自动加载 META-INF/spring 目录下的所有 Spring 配置。
logback Container
自动装配 logback 日志
Log4j Container
自动配置 log4j 的配置
默认情况下,spring 容器,本质上,就是加在 spring ioc 容器,然后启动一个 netty 服务实现服务的发布。
public class SpringContainer implements Container {
public static final String SPRING_CONFIG = "dubbo.spring.config";
public static final String DEFAULT_SPRING_CONFIG = "classpath*:META-INF/spring/*.xml";
private static final Logger logger = LoggerFactory.getLogger(SpringContainer.class);
static ClassPathXmlApplicationContext context;
public SpringContainer() {
}
public static ClassPathXmlApplicationContext getContext() {
return context;
}
//dubbo启动
public void start() {
//根据dubbo.spring.config获取配置路径
String configPath = ConfigUtils.getProperty("dubbo.spring.config");
//配置为空则获取spring下的xml文件
if (StringUtils.isEmpty(configPath)) {
configPath = "classpath*:META-INF/spring/*.xml";
}
context = new ClassPathXmlApplicationContext(configPath.split("[,\\s]+"), false);
context.refresh();
context.start();
}
//dubbo停止服务
public void stop() {
try {
if (context != null) {
context.stop();
context.close();
context = null;
}
} catch (Throwable var2) {
logger.error(var2.getMessage(), var2);
}
}
}