之前一直听说dubbo,是一个很厉害的分布式服务框架,而且巴巴将其开源,这对于咱们广大程序猿来说,真是一个好消息。最近有时间了,打算做一个demo把dubbo在本地跑起来先。
先copy一段dubbo的介绍哈!DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点(其他的详细介绍可以查看dubbo的官网地址dubbo,写的很详细哒!)。
该demo是基于maven搭建的,项目架构基于SpringMVC,这里忽略Spring的基本配置,着重介绍下dubbo部分的配置,以及dubbo后台管理系统
一、软件环境
1、zookeeper
下载地址:https://zookeeper.apache.org/releases.html 下载最新版的zookeeper,我这里使用的版本是 zookeeper-3.4.8(当前最新版3.5.1)
2、springMVC (maven方式引入)
3、dubbo (maven方式引入)
二、项目搭建
这里我搭建了三个项目,分别为dubbo-api,dubbo-controller,dubbo-service
dubbo-api:主要是接口定义,供controller调用,以及service层去实现该接口,分离这一层的好处就是前段项目调用接口时候,直接调用dubbo-api的接口即可,不需要关注后端如何实现;而service层来具体实现该接口,进行业务逻辑处理,不需要关注 controller层如何调用。
dubbo-controller:主要controller层控制跳转等。
dubbo-service:主要是service实现,结合数据层实现后端业务逻辑处理。
项目搭建完成之后,的结构图如下:
三、项目配置
1、dubbo-api
新建TestService接口类
1
2
3
4
5
6
7
8
9
10
11
12
|
<code
class
=
"hljs java"
>
package
com.dubbo.service;
public
interface
TestService {
/**
* 测试发消息
* @param name
* @return
*/
public
String sayHello(String name);
}</code>
|
pom.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
|
<code
class
=
" hljs xml"
><project xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemalocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<modelversion>
4.0
.
0
</modelversion>
<groupid>com.dubbo</groupid>
<artifactid>dubbo-api</artifactid>
<version>
0.0
.
1
-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbo-api</name>
<url>http:
//maven.apache.org</url>
<properties>
<project.build.sourceencoding>UTF-
8
</project.build.sourceencoding>
</properties>
<dependencies>
<dependency>
<groupid>junit</groupid>
<artifactid>junit</artifactid>
<version>
3.8
.
1
</version>
<scope>test</scope>
</dependency>
</dependencies>
</project></code>
|
注意: 这个项目最终打包成jar文件,直接maven引入到另外两个项目中
2、dubbo-controller
新建MyController类
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
|
<code
class
=
"hljs avrasm"
>
package
com.dubbo.controller;
import
org.springframework.beans.factory.annotation.Autowired;
import
org.springframework.stereotype.Controller;
import
org.springframework.web.bind.annotation.RequestMapping;
import
org.springframework.web.bind.annotation.RequestParam;
import
org.springframework.web.bind.annotation.ResponseBody;
import
com.dubbo.service.TestService;
/**
* controller
* @author hwy
*
*/
@Controller
public
class
MyController {
@Autowired
private
TestService testService;
@RequestMapping
(value =
"/test"
)
@ResponseBody
public
String testSay(
@RequestParam
(value =
"name"
,defaultValue =
""
) String name){
StringBuffer sb =
new
StringBuffer();
sb.append(
"Dubbo: "
).append(testService.sayHello(name));
return
sb.toString();
}
}</code>
|
新建dubbo-config.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<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=
"test_consumer"
>
<dubbo:registry address=
"zookeeper://192.168.2.193:2181"
>
<dubbo:reference
interface
=
"com.dubbo.service.TestService"
id=
"testService"
check=
"false"
>
</dubbo:reference></dubbo:registry></dubbo:application></beans></code>
|
注意:这里作为消费者名称为test_consumer,注释很详细,就不一一介绍了,这个项目最终打包成dubbo-service.war放在tomcat或其他容器中运行。
pom.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
|
<code
class
=
" hljs xml"
><project xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemalocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<modelversion>
4.0
.
0
</modelversion>
<groupid>com.dubbo</groupid>
<artifactid>dubbo-controller</artifactid>
<version>
0.0
.
1
-SNAPSHOT</version>
<packaging>war</packaging>
<name>dubbo-contoller</name>
<url>http:
//maven.apache.org</url>
<properties>
<project.build.sourceencoding>UTF-
8
</project.build.sourceencoding>
<org.springframework.version>
3.1
.
4
.RELEASE</org.springframework.version>
</properties>
<dependencies>
<dependency>
<groupid>junit</groupid>
<artifactid>junit</artifactid>
<version>
3.8
.
1
</version>
<scope>test</scope>
</dependency>
<dependency>
<groupid>javax.servlet</groupid>
<artifactid>javax.servlet-api</artifactid>
<version>
3.1
.
0
</version>
</dependency>
<dependency>
<groupid>org.springframework</groupid>
<artifactid>spring-context</artifactid>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupid>org.springframework</groupid>
<artifactid>spring-context-support</artifactid>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupid>org.springframework</groupid>
<artifactid>spring-web</artifactid>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupid>org.springframework</groupid>
<artifactid>spring-webmvc</artifactid>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupid>org.codehaus.jackson</groupid>
<artifactid>jackson-core-asl</artifactid>
<version>
1.9
.
12
</version>
</dependency>
<dependency>
<groupid>org.codehaus.jackson</groupid>
<artifactid>jackson-mapper-asl</artifactid>
<version>
1.9
.
12
</version>
</dependency>
<dependency>
<groupid>net.sf.json-lib</groupid>
<artifactid>json-lib</artifactid>
<version>
2.4
</version>
<classifier>jdk15</classifier>
</dependency>
<dependency>
<groupid>com.alibaba</groupid>
<artifactid>dubbo</artifactid>
<version>
2.5
.
3
</version>
<exclusions>
<exclusion>
<artifactid>spring</artifactid>
<groupid>org.springframework</groupid>
</exclusion>
</exclusions>
</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>
<dependency>
<groupid>com.github.sgroschupf</groupid>
<artifactid>zkclient</artifactid>
<version>
0.1
</version>
</dependency>
<dependency>
<groupid>com.dubbo</groupid>
<artifactid>dubbo-api</artifactid>
<version>
0.0
.
1
-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<finalname>dubbo-controller</finalname>
</build>
</project></code>
|
3、dubbo-service
新建TestServiceImpl类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<code
class
=
"hljs java"
>
package
com.dubbo.service.impl;
import
com.dubbo.service.TestService;
/**
* service impl
* @author hwy
*
*/
public
class
TestServiceImpl
implements
TestService{
public
String sayHello(String name) {
return
name +
" service2 say hello word service2!"
;
}
}</code>
|
新建applicationContext.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<beans xmlns=
"http://www.springframework.org/schema/beans"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xmlns:p=
"http://www.springframework.org/schema/p"
xmlns:dubbo=
"http://code.alibabatech.com/schema/dubbo"
xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-
3.1
.xsd
http:
//code.alibabatech.com/schema/dubbo
http:
//code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name=
"test_provider"
>
<dubbo:registry address=
"zookeeper://192.168.2.193:2181"
>
<dubbo:protocol name=
"dubbo"
port=
"20880"
>
<dubbo:service
interface
=
"com.dubbo.service.TestService"
ref=
"testService"
>
<bean id=
"testService"
class
=
"com.dubbo.service.impl.TestServiceImpl"
>
</bean></dubbo:service></dubbo:protocol></dubbo:registry></dubbo:application></beans></code>
|
注意:这里作为服务提供者名称为test_provider,注释很详细,就不一一介绍了,这个项目最终打包成dubbo-service.war放在tomcat或其他容器中运行,跟其他直接通过ClassPathXmlApplicationContext 启动方式稍微有点区别。
pom.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
|
<code
class
=
" hljs xml"
><project xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemalocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
>
<modelversion>
4.0
.
0
</modelversion>
<groupid>com.dubbo</groupid>
<artifactid>dubbo-service</artifactid>
<packaging>war</packaging>
<version>
0.0
.
1
-SNAPSHOT</version>
<name>dubbo-service Maven Webapp</name>
<url>http:
//maven.apache.org</url>
<properties>
<project.build.sourceencoding>UTF-
8
</project.build.sourceencoding>
<spring.vesion>
3.1
.
4
.RELEASE</spring.vesion>
</properties>
<dependencies>
<dependency>
<groupid>com.alibaba</groupid>
<artifactid>dubbo</artifactid>
<version>
2.5
.
3
</version>
<exclusions>
<exclusion>
<artifactid>spring</artifactid>
<groupid>org.springframework</groupid>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupid>org.apache.zookeeper</groupid>
<artifactid>zookeeper</artifactid>
<version>
3.4
.
6
</version>
<exclusions>
<exclusion>
<artifactid>log4j</artifactid>
<groupid>log4j</groupid>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupid>log4j</groupid>
<artifactid>log4j</artifactid>
<version>
1.2
.
17
</version>
</dependency>
<dependency>
<groupid>com.github.sgroschupf</groupid>
<artifactid>zkclient</artifactid>
<version>
0.1
</version>
</dependency>
<dependency>
<groupid>org.springframework</groupid>
<artifactid>spring-aop</artifactid>
<version>${spring.vesion}</version>
</dependency>
<dependency>
<groupid>org.springframework</groupid>
<artifactid>spring-asm</artifactid>
<version>${spring.vesion}</version>
</dependency>
<dependency>
<groupid>org.springframework</groupid>
<artifactid>spring-aspects</artifactid>
<version>${spring.vesion}</version>
</dependency>
<dependency>
<groupid>org.springframework</groupid>
<artifactid>spring-beans</artifactid>
<version>${spring.vesion}</version>
</dependency>
<dependency>
<groupid>org.springframework</groupid>
<artifactid>spring-context</artifactid>
<version>${spring.vesion}</version>
</dependency>
<dependency>
<groupid>org.springframework</groupid>
<artifactid>spring-context-support</artifactid>
<version>${spring.vesion}</version>
</dependency>
<dependency>
<groupid>org.springframework</groupid>
<artifactid>spring-core</artifactid>
<version>${spring.vesion}</version>
</dependency>
<dependency>
<groupid>org.springframework</groupid>
<artifactid>spring-expression</artifactid>
<version>${spring.vesion}</version>
</dependency>
<dependency>
<groupid>org.springframework</groupid>
<artifactid>spring-instrument</artifactid>
<version>${spring.vesion}</version>
</dependency>
<dependency>
<groupid>org.springframework</groupid>
<artifactid>spring-instrument-tomcat</artifactid>
<version>${spring.vesion}</version>
</dependency>
<dependency>
<groupid>org.aspectj</groupid>
<artifactid>aspectjweaver</artifactid>
<version>
1.6
.
9
</version>
</dependency>
<dependency>
<groupid>commons-pool</groupid>
<artifactid>commons-pool</artifactid>
<version>
1.5
.
3
</version>
</dependency>
<dependency>
<groupid>commons-collections</groupid>
<artifactid>commons-collections</artifactid>
<version>
3.2
</version>
</dependency>
<dependency>
<groupid>org.springframework</groupid>
<artifactid>spring-jms</artifactid>
<version>${spring.vesion}</version>
</dependency>
<dependency>
<groupid>org.springframework</groupid>
<artifactid>spring-oxm</artifactid>
<version>${spring.vesion}</version>
</dependency>
<dependency>
<groupid>org.springframework</groupid>
<artifactid>spring-web</artifactid>
<version>${spring.vesion}</version>
</dependency>
<dependency>
<groupid>org.springframework</groupid>
<artifactid>spring-webmvc</artifactid>
<version>${spring.vesion}</version>
</dependency>
<dependency>
<groupid>org.springframework</groupid>
<artifactid>spring-webmvc-portlet</artifactid>
<version>${spring.vesion}</version>
</dependency>
<dependency>
<groupid>org.springframework</groupid>
<artifactid>spring-struts</artifactid>
<version>${spring.vesion}</version>
</dependency>
<dependency>
<groupid>commons-httpclient</groupid>
<artifactid>commons-httpclient</artifactid>
<version>
3.1
</version>
</dependency>
<dependency>
<groupid>com.dubbo</groupid>
<artifactid>dubbo-api</artifactid>
<version>
0.0
.
1
-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<finalname>dubbo-service</finalname>
</build>
</project>
</code>
|
好了,经过这么配置之后,我们的项目编码配置部分就大功告成了!
maven编译下三个项目,将dubbo-controller和dubbo-service放到tomcat容器中,启动tomcat容器! 出错啦! 为啥容器不起来!那是因为我们还少了主要的一步,那就是配置启动zookeeper,不然dubbo去zookeeper注册中心暴露服务地址不成功啦!
四、配置启动zookeeper
将下载的zookeeper压缩包,解压到一个磁盘目录上去,这里我指定的位置:D:\hwy\zookeeper-3.4.8,我们可以通过启动D:\hwy\zookeeper-3.4.8\bin\zkServer.cmd直接启动默认配置,默认端口为2181,当然我们也可以指定其他的配置,打开D:\hwy\zookeeper-3.4.8\conf\zoo.cfg,这个是zookeeper配置文件的位置,我们这里在指定一下数据目录以及数据日志目录
1
2
|
<code
class
=
"hljs tex"
>dataDir=D:\\hwy\\www\\zookeeper\\data
dataLogDir=D:\\hwy\\www\\zookeeper\\log</code>
|
启动zookeeper!
再次启动tomcat容器,是不是就成功啦!我们来访问下http://127.0.0.1:8090/dubbo-controller/test?name=hwy,看下返回结果是不是正确啦!
好啦!经过上边的一系列操作,一个Maven+SpringMVC+Dubbo 的demo就配置完成了,但是我们如果管理这些服务提供者以及消费者呢?当然,dubbo给我们提供了现成的后台管理网站,专门管理这些服务,应用,路由规则,动态配置,访问控制、权重控制、负载均衡等等,还可以查看系统日志,系统状态,系统环境等等,功能很是强大,通过这个后台,可以可视化控制你的服务和应用。
接下来我们来简单的看看后台系统,以及简单修改下权重控制啥的看看效果吧!我们将dubbo-admin-2.5.3.war包放到tomcat容器中,启动tomcat容器,访问http://127.0.0.1:8080/dubbo-admin-2.5.3
一、登录
注意:用户名和密码默认为root,当然为了安全起见,线上必须更改这个用户名和密码,
二、首页
注意:我们看到红色区域,里面显示 服务数:1 应用数:2 提供者数:1 消费者数:1 。
这就是刚刚我们启动的那个服务1(com.dubbo.service.TestService服务),应用2(test_consumer,test_provider),提供者1(192.168.2.193:20880) 消费者1(192.168.2.193),分别来张截图看看:
1、服务
2、应用
3、提供者
4、消费者
看看,是不是很直观的看到刚刚我们启动的服务,应用,提供者及消费者信息,这里,我们在演示下里面的功能之一权重调节功能,给不同的服务提供者分配不同的权限,看下消费者消费提供者的次数的变化。
为了达到演示效果,我将dubbo-service项目在复制一份放到tomcat里面去,并将TestServiceImpl类修改下sayHello()方法,并修改dubbo暴露端口号,通过输出不同信息,判断消费者调用哪个服务提供者提供的服务。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<code
class
=
"hljs java"
>
package
com.dubbo.service.impl;
import
com.dubbo.service.TestService;
/**
* service impl
* @author hwy
*
*/
public
class
TestServiceImpl
implements
TestService{
public
String sayHello(String name) {
return
name +
" say hello word!"
;
}
}</code>
|
接着,我们在修改下dubbo的暴漏端口号,修改applicationContext.xml里面的
1
|
<code
class
=
"hljs xml"
><dubbo:protocol name=
"dubbo"
port=
"20881"
></dubbo:protocol></code>
|
好了,我们在重新启动tomcat,继续访问http://127.0.0.1:8080/dubbo-admin-2.5.3,我们能看到提供者里面,已经有我们刚新加的192.168.2.193:20881服务提供者啦!
这个时候我们在访问http://127.0.0.1:8090/dubbo-controller/test?name=hwy,当我们刷新时,返回的结果中除了上面截图返回的结果,也会返回刚新修改的返回结果,而且多刷新几次,两种结果出现的几率是一样哒!因为这里的提供者权重是一样的。
现在,我们修改这2个提供者的权重,我们让192.168.2.193:20881的权重降一半即50,另一个192.168.2.193:20880提高到200,我们在来刷新多次,看下返回的两种结果出现的几率是不是1:4。亲测,是哒!!!
好了,上边只是简单介绍了这个后台管理系统,里面还有很多很强大的功能,我也暂时还没完全玩转,大家一起尝试下,分享下吧!
dubbo是一个很强大的分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案,我用到的只是冰山一角,他的更多功能,大家一起研究下吧!
所有评论(0)