博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分布式服务框架 dubbo/dubbox 入门示例(转)
阅读量:6321 次
发布时间:2019-06-22

本文共 26171 字,大约阅读时间需要 87 分钟。

dubbo是一个分布式的服务架构,可直接用于生产环境作为SOA服务框架。

官网首页: ,官方用户指南 上面的几张图画得不错,完全可以当做SOA架构的学习资料

淘宝将这个项目开源出来以后,得到了不少同行的支持,包括:

当当网的扩展版本dubbox :

京东的扩展版本jd-hydra:

不过,略有遗憾的是,据说在淘宝内部,dubbo由于跟淘宝另一个类似的框架HSF(非开源)有竞争关系,导致dubbo团队已经解散(参见 中的评论),反到是当当网的扩展版本仍在持续发展,墙内开花墙外香。

不管如何,能在阿里、当当、京东这些大型网站正式使用的框架,总不至于差到哪里去。

本文下面的示例均基于当当的dubbox版本,由于dubbox并没向maven提交编译后的jar包,所以只能从github clone代码到本地编译得到jar包。

 

编译及测试步骤:(以下步骤全在windows环境中完成)

1. 本机先安装github on Windows的客户端,将在path路径中,把git.exe加进去

2. 命令行下 git clone 把代码拉到本地

3. mvn install -Dmaven.test.skip=true 跳过测试编译

4. 在本机,参考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. 运行 \dubbox\dubbo-demo\dubbo-demo-provider\src\test\java\com\alibaba\dubbo\demo\provider\DemoProvider.java

把服务提供方跑起来,成功后,可以在ZK里,用 ls / 看下,会发现zk里多出了一个dubbo的节点,所有服务全注册在这里了

7. 运行\dubbox\dubbo-demo\dubbo-demo-consumer\src\test\java\com\alibaba\dubbo\demo\consumer\DemoConsumer.java

服务消费方调用测试,可以看console里的输出

8. 运行\dubbox\dubbo-demo\dubbo-demo-consumer\src\test\java\com\alibaba\dubbo\demo\consumer\RestClient.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

1
2
3
4
5
package
yjmyzz.dubbo.demo.api;
 
public
interface
UserService {
User getUser(Long id);
}

UserRestService.java

1
2
3
4
5
6
7
package
yjmyzz.dubbo.demo.api;
 
import
javax.validation.constraints.Min;
 
public
interface
UserRestService {
User getUser(
@Min
(value = 1L, message =
"User ID must be greater than 1"
) Long id);
}

pom.xml

复制代码
1 
2
5 6
4.0.0
7 8
com.cnblogs.yjmyzz
9
dubbo-hello-api
10
0.1
11 12
13 14
15
com.alibaba
16
dubbo
17
2.8.4
18
19 20
21
javax.validation
22
validation-api
23
1.0.0.GA
24
25 26
27
javax.annotation
28
javax.annotation-api
29
1.2
30
31 32
33
org.codehaus.jackson
34
jackson-mapper-asl
35
1.9.12
36
37 38
39
复制代码
View Code

 

二、定义服务生产者(即:服务接口的实现方)

UserServiceImpl.java

1
2
3
4
5
6
7
8
9
10
11
package
yjmyzz.dubbo.demo.provider;
 
import
yjmyzz.dubbo.demo.api.User;
import
yjmyzz.dubbo.demo.api.UserService;
 
public
class
UserServiceImpl
implements
UserService {
 
public
User getUser(Long id) {
return
new
User(id,
"username"
+ id);
}
}

UserRestServiceImpl.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
package
yjmyzz.dubbo.demo.provider;
 
import
com.alibaba.dubbo.rpc.RpcContext;
import
com.alibaba.dubbo.rpc.protocol.rest.support.ContentType;
import
yjmyzz.dubbo.demo.api.User;
import
yjmyzz.dubbo.demo.api.UserRestService;
import
yjmyzz.dubbo.demo.api.UserService;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
import
javax.ws.rs.*;
import
javax.ws.rs.core.MediaType;
 
@Path
(
"users"
)
@Consumes
({MediaType.APPLICATION_JSON, MediaType.TEXT_XML})
@Produces
({ContentType.APPLICATION_JSON_UTF_8, ContentType.TEXT_XML_UTF_8})
public
class
UserRestServiceImpl
implements
UserRestService {
 
private
UserService userService;
 
public
void
setUserService(UserService userService) {
this
.userService = userService;
}
 
@GET
@Path
(
"{id : \\d+}"
)
public
User getUser(
@PathParam
(
"id"
) Long id) {
if
(RpcContext.getContext().getRequest(HttpServletRequest.
class
) !=
null
) {
System.out.println(
"Client IP address from RpcContext: "
+ RpcContext.getContext().getRequest(HttpServletRequest.
class
).getRemoteAddr());
}
if
(RpcContext.getContext().getResponse(HttpServletResponse.
class
) !=
null
) {
System.out.println(
"Response object from RpcContext: "
+ RpcContext.getContext().getResponse(HttpServletResponse.
class
));
}
return
userService.getUser(id);
}
}

DemoProvider.java

1
2
3
4
5
6
7
8
9
10
11
12
package
yjmyzz.dubbo.demo.provider;
import
org.springframework.context.support.ClassPathXmlApplicationContext;
import
java.io.IOException;
 
public
class
DemoProvider {
public
static
void
main(String[] args)
throws
IOException {
ClassPathXmlApplicationContext context =
new
ClassPathXmlApplicationContext(
"classpath*:META-INF/spring/*.xml"
);
context.start();
System.out.println(
"服务已经启动..."
);
System.in.read();
}
}

配置文件:resources\META-INF\spring\dubbo-demo-provider.xml

复制代码
1 
2 3
8 9
10 11
12 13
14 15
16
18 19 20
21 22
23 24
25 26
27
28
29 30 31
复制代码
View Code

pom.xml

复制代码
1 
2
5 6
4.0.0
7 8
com.cnblogs.yjmyzz
9
dubbo-hello-provider
10
0.1
11 12
13 14
15
16
com.cnblogs.yjmyzz
17
dubbo-hello-api
18
0.1
19
20 21
22
com.alibaba
23
dubbo
24
2.8.4
25
26 27
28
org.javassist
29
javassist
30
3.15.0-GA
31
32 33
34
org.apache.mina
35
mina-core
36
1.1.7
37
38 39
40
org.glassfish.grizzly
41
grizzly-core
42
2.1.4
43
44 45
46
org.apache.httpcomponents
47
httpclient
48
4.2.1
49
50 51
52
com.alibaba
53
fastjson
54
1.1.39
55
56 57
58
com.thoughtworks.xstream
59
xstream
60
1.4.1
61
62 63
64
org.apache.bsf
65
bsf-api
66
3.1
67
68 69
70
org.apache.zookeeper
71
zookeeper
72
3.4.6
73
74 75
76
com.github.sgroschupf
77
zkclient
78
0.1
79
80 81
82
org.apache.curator
83
curator-framework
84
2.5.0
85
86 87
88
com.googlecode.xmemcached
89
xmemcached
90
1.3.6
91
92 93
94
org.apache.cxf
95
cxf-rt-frontend-simple
96
2.6.1
97
98 99
100
org.apache.cxf
101
cxf-rt-transports-http
102
2.6.1
103
104 105
106
org.apache.thrift
107
libthrift
108
0.8.0
109
110 111
112
com.caucho
113
hessian
114
4.0.7
115
116 117
118
javax.servlet
119
javax.servlet-api
120
3.1.0
121
122 123
124
org.mortbay.jetty
125
jetty
126
6.1.26
127
128
129
org.mortbay.jetty
130
servlet-api
131
132
133
134 135
136
log4j
137
log4j
138
1.2.16
139
140 141
142
org.slf4j
143
slf4j-api
144
1.6.2
145
146 147
148
redis.clients
149
jedis
150
2.1.0
151
152 153
154
javax.validation
155
validation-api
156
1.0.0.GA
157
158 159
160
org.hibernate
161
hibernate-validator
162
4.2.0.Final
163
164 165
166
javax.cache
167
cache-api
168
0.4
169
170 171
172
org.jboss.resteasy
173
resteasy-jaxrs
174
3.0.7.Final
175
176 177
178
org.jboss.resteasy
179
resteasy-client
180
3.0.7.Final
181
182 183
184
org.jboss.resteasy
185
resteasy-netty
186
3.0.7.Final
187
188 189
190
org.jboss.resteasy
191
resteasy-jdk-http
192
3.0.7.Final
193
194 195
196
org.jboss.resteasy
197
resteasy-jackson-provider
198
3.0.7.Final
199
200 201
202
org.jboss.resteasy
203
resteasy-jaxb-provider
204
3.0.7.Final
205
206 207
208
org.apache.tomcat.embed
209
tomcat-embed-core
210
8.0.11
211
212 213
214
org.apache.tomcat.embed
215
tomcat-embed-logging-juli
216
8.0.11
217
218 219
220
com.esotericsoftware.kryo
221
kryo
222
2.24.0
223
224 225
226
de.javakaffee
227
kryo-serializers
228
0.26
229
230 231
232
de.ruedigermoeller
233
fst
234
1.55
235
236 237
238 239 240
复制代码
View Code

测试时,运行DemoProvider中的main方法即可启动服务,所有服务注册在ZooKeeper,层次结构类似下面这样:

复制代码
/dubbo  /dubbo/yjmyzz.dubbo.demo.api.UserRestService    /dubbo/yjmyzz.dubbo.demo.api.UserRestService/providers    /dubbo/yjmyzz.dubbo.demo.api.UserRestService/configurators  /dubbo/yjmyzz.dubbo.demo.api.UserService    /dubbo/yjmyzz.dubbo.demo.api.UserService/providers    /dubbo/yjmyzz.dubbo.demo.api.UserService/configurators
复制代码

 

三、服务消费方

DemoConsumer.java

配置文件:resources\META-INF\spring\dubbo-hello-consumer.xml

复制代码
1 
2
7 8
9 10
11 12
13 14
15 16
复制代码
View Code

pom.xml

复制代码
1 
2
5 6
4.0.0
7 8
com.cnblogs.yjmyzz
9
dubbo-hello-consumer
10
0.1
11 12 13
14
15
16
com.cnblogs.yjmyzz
17
dubbo-hello-api
18
0.1
19
20 21 22
23
com.alibaba
24
dubbo
25
2.8.4
26
27 28
29
org.javassist
30
javassist
31
3.15.0-GA
32
33 34
35
org.apache.mina
36
mina-core
37
1.1.7
38
39 40
41
org.glassfish.grizzly
42
grizzly-core
43
2.1.4
44
45 46
47
org.apache.httpcomponents
48
httpclient
49
4.2.1
50
51 52
53
com.alibaba
54
fastjson
55
1.1.39
56
57 58
59
com.thoughtworks.xstream
60
xstream
61
1.4.1
62
63 64
65
org.apache.bsf
66
bsf-api
67
3.1
68
69 70
71
org.apache.zookeeper
72
zookeeper
73
3.4.6
74
75 76
77
com.github.sgroschupf
78
zkclient
79
0.1
80
81 82
83
org.apache.curator
84
curator-framework
85
2.5.0
86
87 88
89
com.googlecode.xmemcached
90
xmemcached
91
1.3.6
92
93 94
95
org.apache.cxf
96
cxf-rt-frontend-simple
97
2.6.1
98
99 100
101
org.apache.cxf
102
cxf-rt-transports-http
103
2.6.1
104
105 106
107
org.apache.thrift
108
libthrift
109
0.8.0
110
111 112
113
com.caucho
114
hessian
115
4.0.7
116
117 118
119
javax.servlet
120
javax.servlet-api
121
3.1.0
122
123 124
125
org.mortbay.jetty
126
jetty
127
6.1.26
128
129
130
org.mortbay.jetty
131
servlet-api
132
133
134
135 136
137
log4j
138
log4j
139
1.2.16
140
141 142
143
org.slf4j
144
slf4j-api
145
1.6.2
146
147 148
149
redis.clients
150
jedis
151
2.1.0
152
153 154
155
javax.validation
156
validation-api
157
1.0.0.GA
158
159 160
161
org.hibernate
162
hibernate-validator
163
4.2.0.Final
164
165 166
167
javax.cache
168
cache-api
169
0.4
170
171 172
173
org.jboss.resteasy
174
resteasy-jaxrs
175
3.0.7.Final
176
177 178
179
org.jboss.resteasy
180
resteasy-client
181
3.0.7.Final
182
183 184
185
org.jboss.resteasy
186
resteasy-netty
187
3.0.7.Final
188
189 190
191
org.jboss.resteasy
192
resteasy-jdk-http
193
3.0.7.Final
194
195 196
197
org.jboss.resteasy
198
resteasy-jackson-provider
199
3.0.7.Final
200
201 202
203
org.jboss.resteasy
204
resteasy-jaxb-provider
205
3.0.7.Final
206
207 208
209
org.apache.tomcat.embed
210
tomcat-embed-core
211
8.0.11
212
213 214
215
org.apache.tomcat.embed
216
tomcat-embed-logging-juli
217
8.0.11
218
219 220
221
com.esotericsoftware.kryo
222
kryo
223
2.24.0
224
225 226
227
de.javakaffee
228
kryo-serializers
229
0.26
230
231 232
233
de.ruedigermoeller
234
fst
235
1.55
236
237
238 239 240
复制代码
View Code

其它注意事项:

dubbo构架中,zk充着“服务注册中心”的角色,所以生产者与消费者的xml配置文件中,都要配置zk地址,如果zk采用集群部署时,配置写法参考下面这样:

 

dubbo还有一个管理界面,用于服务治理,包括启用/禁用服务,设置服务的路由规则(即:A地址的Consumer直接调用B机器的Provider,而不是由负载均衡算法分配)等等。

使用方法:将dubbo-admin这个项目编译成war包后,部署到jetty或其它兼容web server即可(当然要修改\WEB-INF\dubbo.properties里zk的地址)

部署完成后,访问管理界面时,默认用户名,密码均是root。

 

另外dubbo-monitor项目用于性能监控,结合监控产生的数据,再套上一些图表展示的框架,可以用图表方式直观展示各种指标。

 

2016-02-25:dubbox依赖的spring虽然升级成3.x了,但版本还是有点低,spring都已经4.x了,为了方便我fork了一份,升级成spring 4.x 同时增加了log4j2的日志组件支持,详情见:

 

参考文章:

 

http://www.cnblogs.com/yjmyzz/p/dubbox-demo.html

 

你可能感兴趣的文章
我的友情链接
查看>>
Nginx+mysql+php-fpm负载均衡配置实例
查看>>
MySql之基于ssl安全连接的主从复制
查看>>
informix的逻辑日志和物理日志分析
查看>>
ARM inlinehook小结
查看>>
wordpress admin https + nginx反向代理配置
查看>>
管理/var/spool/clientmqueue/下的大文件
查看>>
centos 5.5 64 php imagick 模块错误处理记录
查看>>
apache中文url日志分析--php十六进制字符串转换
查看>>
浅谈代理
查看>>
基于jquery实现的超酷动画源码
查看>>
fl包下的TransitionManager的使用
查看>>
Factorialize a Number
查看>>
防HTTP慢速攻击的nginx安全配置
查看>>
Spring Boot2.0+中,自定义配置类扩展springMVC的功能
查看>>
参与博客编辑器改版,我的礼物 感谢51cto
查看>>
JavaWeb笔记——JSTL标签
查看>>
一些实用性的总结与纠正
查看>>
spring技术内幕读书笔记之IoC容器的学习
查看>>
自动生成四则运算题目
查看>>