dubbo 源码构建完成并导入myeclipse 后,在dubbo 源码中有一个服务的demo,我们要把dubbo的这个"hellow world"启动起来!
第一步:dubbo 源码中服务demo,见:
dubbo-demo-api:dubbo 服务提供者和服务消费者之间共享,是接口定义所在的工程。
dubbo-demo-provider:dubbo 服务提供者,其中实现了dubbo 接口api中定义的接口。
dubbo-demo-consumer:dubbo 服务消费者,这里持有接口API的动态代理的引用,调用服务提供者实现的方法。
第二步:修改服务消费者和服务提供者的配置,这里将采用zookeeper作为服务注册中心,需要修改配置如下:
这里将注册中心改为zookeeper,端口是2181,这是zookeeper默认的端口,服务消费者和服务提供者这个配置文件都需要改。
第三步:启动zookeeper注册中心,由于我们启动demo将使用zookeeper作为注册中心,因此启动demo前需要先启动注册中心,否则demo启动时将被阻塞。
- 解压下载的zookeeper文件,打开文件目录如下:
- 在此目录下面新建一个zoo.cfg文件,这个文件是zookeeper 的配置文件,内容如下:
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=D:\\data\\zookeeper
dataLogDir=D:\\logs\\zookeeper
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
- 这里指定心跳时间、初始连接数、最大连接数、端口、日志存放位置、缓存文件存放位置,我们需要保证:
dataDir=D:\\data\\zookeeper 和 dataLogDir=D:\\logs\\zookeeper 指定的位置是存在的。
配置好zookeeper后,切换到zookeeper文件夹的bin目录下:双击:zkServer.cmd文件启动zookeeper 服务端,
双击 zkCli.cmd 启动zookeeper 客服端,如启动日志如下图所示,说明zookeeper启动成功:
到此zookeeper已经启动好了
第四步:启动服务提供者:
第五步:启动服务消费者,效果图如下:
看到打印的信息了,这个信息是由服务消费者调用服务提供者返回的信息,说明dubbo服务调用成功了。
思考:为什么这里写如下代码就能启动dubbo消费者和服务者呢:
package com.alibaba.dubbo.demo.consumer;
public class DemoConsumer {
public static void main(String[] args) {
com.alibaba.dubbo.container.Main.main(args);
}
}
分析:这里看到调用的是ali源码中的一个方法,点进去后发现的代码中有这么一句:
private static final ExtensionLoader<Container> loader = ExtensionLoader.getExtensionLoader(Container.class);
这句话会基于dubbo 改良后的SPI 机制去加载一个spring 容器,然后由spring容器来读取dubbo的配置信息,从而使整个程序运行起来。