分布式服务框架 dubbo/dubbox 入门示例
http://www.cnblogs.com/yjmyzz/p/dubbox-demo.html
dubbo是一个分布式的服务架构,可直接用于生产环境作为SOA服务框架。
官网首页:http://dubbo.io/ ,官方用户指南 http://dubbo.io/User+Guide-zh.htm上面的几张图画得不错,完全可以当做SOA架构的学习资料
淘宝将这个项目开源出来以后,得到了不少同行的支持,包括:
当当网的扩展版本dubbox :https://github.com/dangdangdotcom/dubbox
京东的扩展版本jd-hydra: http://www.oschina.net/p/jd-hydra
不过,略有遗憾的是,据说在淘宝内部,dubbo由于跟淘宝另一个类似的框架HSF(非开源)有竞争关系,导致dubbo团队已经解散(参见http://www.oschina.net/news/55059/druid-1-0-9 中的评论),反到是当当网的扩展版本仍在持续发展,墙内开花墙外香。
不管如何,能在阿里、当当、京东这些大型网站正式使用的框架,总不至于差到哪里去。
本文下面的示例均基于当当的dubbox版本,由于dubbox并没向maven提交编译后的jar包,所以只能从github clone代码到本地编译得到jar包。
编译及测试步骤:(以下步骤全在windows环境中完成)
1. 本机先安装github on Windows的客户端,将在path路径中,把git.exe加进去
2. 命令行下 git clone https://github.com/dangdangdotcom/dubbox 把代码拉到本地
3. mvn install -Dmaven.test.skip=true 跳过测试编译
4. 在本机安装一个zookeeper,参考zoo.cfg如下:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=D:/java/zookeeper-3.4.6/data
dataLogDir=D:/java/zookeeper-3.4.6/log
clientPort=2181
server.1=localhost:2287:3387
然后输入 bin/zkServer.cmd 启用zookeeper
5. intellij Idea中导入源码
6. 运行 dubboxdubbo-demodubbo-demo-providersrc estjavacomalibabadubbodemoproviderDemoProvider.java
把服务提供方跑起来,成功后,可以在ZK里,用 ls / 看下,会发现zk里多出了一个dubbo的节点,所有服务全注册在这里了
7. 运行dubboxdubbo-demodubbo-demo-consumersrc estjavacomalibabadubbodemoconsumerDemoConsumer.java
服务销售方调用测试,可以看console里的输出
8. 运行dubboxdubbo-demodubbo-demo-consumersrc estjavacomalibabadubbodemoconsumerRestClient.java
跑一下rest调用
9. 浏览器访问 http://localhost:8888/services/users/100.xml 或 http://localhost:8888/services/users/100.json
dubbox官方的示例,虽然已经很简单了,但是对于初次接触的人来讲,仍然略显复杂,下面的代码在其基础上简化了一下:
一、先定义服务接口及传输对象DTO
项目结构如下
代码:
User.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
package yjmyzz.dubbo.demo.api;
import org.codehaus.jackson.annotate.JsonProperty;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.io.Serializable;
@XmlRootElement
@XmlAccessorType (XmlAccessType.FIELD)
public class User implements Serializable
{
@NotNull
@Min (1L)
private Long
id;
@JsonProperty ( "username" )
@XmlElement (name
= "username" )
@NotNull
@Size (min
= 6 ,
max = 50 )
private String
name;
public User()
{
}
public User(Long
id, String name) {
this .id
= id;
this .name
= name;
}
public Long
getId() {
return id;
}
public void setId(Long
id) {
this .id
= id;
}
public String
getName() {
return name;
}
public void setName(String
name) {
this .name
= name;
}
@Override
public String
toString() {
return "User
(" +
"id=" +
id +
",
name="" +
name + " "" +
")" ;
}
}
|
UserService.java
+ View CodeUserRestService.java
+ View Codepom.xml

二、定义服务生产者(即:服务接口的实现方)
UserServiceImpl.java
+ View CodeUserRestServiceImpl.java
+ View CodeDemoProvider.java
+ View Code配置文件:resourcesMETA-INFspringdubbo-demo-provider.xml

pom.xml

测试时,运行DemoProvider中的main方法即可启动服务,所有服务注册在ZooKeeper,