最简单的dubbo应用包括三部分:服务提供者provider、服务消费者consumer、注册中心。
前两个都是我们自己编写的,第三个注册中心推荐使用稳定性更好的zookeeper。
所以我们需要先下载zookeeper: http://apache.fayea.com/zookeeper/current/
下载后解压到某个目录,进入里面的conf目录。将zoo_sample.cfg复制一份,改名为zoo.cfg。
修改其内容为
tickTime=2000 initLimit=10 syncLimit=5 dataDir=D:\\data\\zookeeper clientPort=2181
其中的dataDir可以自由修改。
进入zookeeper的bin目录,运行zkServer.cmd
{ 要测试是否运行良好的话可以运行zkCli.cmd }
接下来打开eclipse,新建maven项目,arctype使用默认的quickstart就可以。
修改pom.xml文件:
<dependencies> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.0.13</version> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.3.6</version> <exclusions> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.16</version> </dependency> </dependencies>
在Java源文件夹下新建接口,这个接口要给provider和consumer都使用
public interface DemoService {
public void sayHello();
public String returnHello();
public MsgInfo returnMsgInfo(MsgInfo info);
}
新建其实现类
public class DemoServiceImpl implements DemoService{
public void sayHello() {
System.err.println("Hello world.");
}
public String returnHello() {
return "hello world";
}
public MsgInfo returnMsgInfo(MsgInfo info) {
info.getMsgs().add("done!");
return info;
}
}
新建一个测试实体
public class MsgInfo implements Serializable {
int id;
String name;
List<String> msgs;
//getters setters
}
在资源文件夹下新建目录spring(虽然不是必要的,不过我们是和spring集成的)。
在里面新建xml文件dubbo-provider.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 提供方应用信息,用于计算依赖关系 --> <dubbo:application name="hello-world-app" /> <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" /> <!-- 用dubbo协议在20880端口暴露服务 --> <dubbo:protocol name="dubbo" port="20880" /> <!-- 声明需要暴露的服务接口 --> <dubbo:service interface="com.abc.qkdb.DemoService" ref="demoService" /> <!-- 和本地bean一样实现服务 --> <bean id="demoService" class="com.abc.qkdb.DemoServiceImpl" /> </beans>
其中的<dubbo:registry>就是注册中心这里使用的是zookeeper,其他选项可以参考http://dubbo.io/Administrator+Guide-zh.htm#AdministratorGuide-zh-Redis%E6%B3%A8%E5%86%8C%E4%B8%AD%E5%BF%83%E5%AE%89%E8%A3%85
相同目录下新建dubbo-consumer.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!--消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 --> <dubbo:application name="consumer-of-helloworld-app" /> <!--zookeeper注册中心 --> <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" /> <!-- 生成远程服务代理,可以和本地bean一样使用demoService--> <dubbo:reference id="demoService" interface="com.abc.qkdb.DemoService" /> </beans>
注意里面也包含<dubbo:registry>结点。
回到Java文件夹,新建服务类
import java.io.IOException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class LuncherProvider {
public static void main(String[] args) throws InterruptedException, IOException {
LuncherProvider provider = new LuncherProvider();
provider.start();
System.in.read();
}
void start() {
String configLocation = "spring/dubbo-provider.xml";
ApplicationContext context = new ClassPathXmlApplicationContext(configLocation);
String[] names = context.getBeanDefinitionNames();
for (String name : names) {
System.err.println(name);
}
}
}
新建消费者类
import java.util.ArrayList;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class LuncherConsumer {
public static void main(String[] args) {
LuncherConsumer provider = new LuncherConsumer();
provider.start();
}
void start() {
String configLocation = "spring/dubbo-consumer.xml";
ApplicationContext context = new ClassPathXmlApplicationContext(configLocation);
DemoService ds = (DemoService) context.getBean("demoService");
String[] names = context.getBeanDefinitionNames();
System.out.print("Beans:");
for (String string : names) {
System.out.println(string);
}
MsgInfo info = new MsgInfo();
info.setId(1);
info.setName("ruisheh");
List<String> msgs = new ArrayList<String>();
msgs.add("I");
msgs.add("am");
msgs.add("test");
info.setMsgs(msgs);
System.out.println(ds.returnMsgInfo(info).getMsgs());
System.err.println(ds.returnHello());
}
}
编码完毕。
先运行LuncherProvider类,没有错误输出后(会输出context中的bean)运行LuncherConsumer,输出
[I, am, test, done!]
hello world
即为正常。