Dubbo是阿里巴巴内部的SOA服务化治理方案的核心框架,每天为2000+ 个服务提供3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。Dubbo自2011年开源后,已被许多非阿里系公司使用。
Dubbo[
]是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
其核心部分包含:
- 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
- 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
- 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。
Dubbo能做什么?
- 透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
- 软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
- 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。
快速启动
Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。 |
1 | 1 |
如果不想使用Spring配置,而希望通过API的方式进行调用(不推荐),请参见:API配置 (+) |
1 | 1 |
服务提供者
完整安装步骤,请参见:示例提供者安装 (+) |
1 | 1 |
定义服务接口: (该接口需单独打包,在服务提供方和消费方共享)
DemoService.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 1package
2 com.alibaba.dubbo.demo;
3
4
5
6
7
8
9
10
11
12
13
14 public
15 interface
16 DemoService {
17
18
19
20
21
22
23
24
25
26
27
28
29 String sayHello(String name);
30
31
32
33
34
35
36
37
38
39
40
41 }
42
在服务提供方实现接口:(对服务消费方隐藏实现)
DemoServiceImpl.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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74 1package
2 com.alibaba.dubbo.demo.provider;
3
4
5
6
7
8
9
10
11
12
13
14 import
15 com.alibaba.dubbo.demo.DemoService;
16
17
18
19
20
21
22
23
24
25
26
27 public
28 class
29 DemoServiceImpl
30 implements
31 DemoService {
32
33
34
35
36
37
38
39
40
41
42
43
44 public
45 String sayHello(String name) {
46
47
48
49
50
51
52 return
53 "Hello "
54 + name;
55
56
57
58
59
60
61 }
62
63
64
65
66
67
68
69
70
71
72
73 }
74
用Spring配置声明暴露服务:
provider.xml
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196 1<?
2 xml
3 version
4 =
5 "1.0"
6 encoding
7 =
8 "UTF-8"
9 ?>
10
11
12
13
14
15 <
16 beans
17 xmlns
18 =
19 "http://www.springframework.org/schema/beans"
20
21
22
23
24
25
26 xmlns:xsi
27 =
28 "http://www.w3.org/2001/XMLSchema-instance"
29
30
31
32
33
34
35 xmlns:dubbo
36 =
37 "http://code.alibabatech.com/schema/dubbo"
38
39
40
41
42
43
44 xsi:schemaLocation
45 =
46 "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"
47 >
48
49
50
51
52
53
54
55
56
57
58
59
60 <!-- 提供方应用信息,用于计算依赖关系 -->
61
62
63
64
65
66
67 <
68 dubbo:application
69 name
70 =
71 "hello-world-app"
72 />
73
74
75
76
77
78
79
80
81
82
83
84
85 <!-- 使用multicast广播注册中心暴露服务地址 -->
86
87
88
89
90
91
92 <
93 dubbo:registry
94 address
95 =
96 "multicast://224.5.6.7:1234"
97 />
98
99
100
101
102
103
104
105
106
107
108
109
110 <!-- 用dubbo协议在20880端口暴露服务 -->
111
112
113
114
115
116
117 <
118 dubbo:protocol
119 name
120 =
121 "dubbo"
122 port
123 =
124 "20880"
125 />
126
127
128
129
130
131
132
133
134
135
136
137
138 <!-- 声明需要暴露的服务接口 -->
139
140
141
142
143
144
145 <
146 dubbo:service
147 interface
148 =
149 "com.alibaba.dubbo.demo.DemoService"
150 ref
151 =
152 "demoService"
153 />
154
155
156
157
158
159
160
161
162
163
164
165
166 <!-- 和本地bean一样实现服务 -->
167
168
169
170
171
172
173 <
174 bean
175 id
176 =
177 "demoService"
178 class
179 =
180 "com.alibaba.dubbo.demo.provider.DemoServiceImpl"
181 />
182
183
184
185
186
187
188
189
190
191
192
193 </
194 beans
195 >
196
加载Spring配置:
Provider.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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88 1import
2 org.springframework.context.support.ClassPathXmlApplicationContext;
3
4
5
6
7
8
9
10
11
12
13
14 public
15 class
16 Provider {
17
18
19
20
21
22
23
24
25
26
27
28
29 public
30 static
31 void
32 main(String[] args)
33 throws
34 Exception {
35
36
37
38
39
40
41 ClassPathXmlApplicationContext context =
42 new
43 ClassPathXmlApplicationContext(
44 new
45 String[] {
46 "http://10.20.160.198/wiki/display/dubbo/provider.xml"
47 });
48
49
50
51
52
53
54 context.start();
55
56
57
58
59
60
61
62
63
64
65
66
67 System.in.read();
68 // 按任意键退出
69
70
71
72
73
74
75 }
76
77
78
79
80
81
82
83
84
85
86
87 }
88
服务消费者
完整安装步骤,请参见:示例消费者安装 (+) |
1 | 1 |
通过Spring配置引用远程服务:
consumer.xml
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140 1<?
2 xml
3 version
4 =
5 "1.0"
6 encoding
7 =
8 "UTF-8"
9 ?>
10
11
12
13
14
15 <
16 beans
17 xmlns
18 =
19 "http://www.springframework.org/schema/beans"
20
21
22
23
24
25
26 xmlns:xsi
27 =
28 "http://www.w3.org/2001/XMLSchema-instance"
29
30
31
32
33
34
35 xmlns:dubbo
36 =
37 "http://code.alibabatech.com/schema/dubbo"
38
39
40
41
42
43
44 xsi:schemaLocation
45 =
46 "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"
47 >
48
49
50
51
52
53
54
55
56
57
58
59
60 <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
61
62
63
64
65
66
67 <
68 dubbo:application
69 name
70 =
71 "consumer-of-helloworld-app"
72 />
73
74
75
76
77
78
79
80
81
82
83
84
85 <!-- 使用multicast广播注册中心暴露发现服务地址 -->
86
87
88
89
90
91
92 <
93 dubbo:registry
94 address
95 =
96 "multicast://224.5.6.7:1234"
97 />
98
99
100
101
102
103
104
105
106
107
108
109
110 <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
111
112
113
114
115
116
117 <
118 dubbo:reference
119 id
120 =
121 "demoService"
122 interface
123 =
124 "com.alibaba.dubbo.demo.DemoService"
125 />
126
127
128
129
130
131
132
133
134
135
136
137 </
138 beans
139 >
140
加载Spring配置,并调用远程服务:(也可以使用IoC注入)
Consumer.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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121 1import
2 org.springframework.context.support.ClassPathXmlApplicationContext;
3
4
5
6
7
8 import
9 com.alibaba.dubbo.demo.DemoService;
10
11
12
13
14
15
16
17
18
19
20
21 public
22 class
23 Consumer {
24
25
26
27
28
29
30
31
32
33
34
35
36 public
37 static
38 void
39 main(String[] args)
40 throws
41 Exception {
42
43
44
45
46
47
48 ClassPathXmlApplicationContext context =
49 new
50 ClassPathXmlApplicationContext(
51 new
52 String[] {
53 "http://10.20.160.198/wiki/display/dubbo/consumer.xml"
54 });
55
56
57
58
59
60
61 context.start();
62
63
64
65
66
67
68
69
70
71
72
73
74 DemoService demoService = (DemoService)context.getBean(
75 "demoService"
76 );
77 // 获取远程服务代理
78
79
80
81
82
83
84 String hello = demoService.sayHello(
85 "world"
86 );
87 // 执行远程方法
88
89
90
91
92
93
94
95
96
97
98
99
100 System.out.println( hello );
101 // 显示调用结果
102
103
104
105
106
107
108 }
109
110
111
112
113
114
115
116
117
118
119
120 }
121