dubbo框架的简单的实现

本文详细介绍Dubbo框架的特点、架构及其实现原理。Dubbo是一种高性能、轻量级的微服务框架,支持服务治理、负载均衡等功能。文章还介绍了如何通过Dubbo搭建分布式系统,包括服务提供者与消费者的配置。
  • 搭建一个分布式的项目 RPC类型的框架(Remote project conntection)远程服务调用
  • RPC webService
  • 特点

  • 开源对本原生代码没有入侵性
  • 可以搭建分布式的项目的结构
  • 完全采用Spring的配置方式
  • 调用元辰的方法就像调用本地的代码一样方便
  • 解耦合
  • zookeeper

  • 这个的配置文件中的信息

    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
    # The number of milliseconds of each tick
    tickTime=2000
    # The number of ticks that the initial
    # synchronization phase can take
    initLimit=10
    # The number of ticks that can pass between
    # sending a request and getting an acknowledgement
    syncLimit=5
    # the directory where the snapshot is stored.
    # do not use /tmp for storage, /tmp here is just
    # example sakes.
    dataDir=/tmp/zookeeper
    # the port at which the clients will connect
    clientPort=2181
    # the maximum number of client connections.
    # increase this if you need to handle more clients
    #maxClientCnxns=60
    #
    # Be sure to read the maintenance section of the
    # administrator guide before turning on autopurge.
    #
    # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
    #
    # The number of snapshots to retain in dataDir
    #autopurge.snapRetainCount=3
    # Purge task interval in hours
    # Set to "0" to disable auto purge feature
    #autopurge.purgeInterval=1
    • 在bin里面 ./zookeerServer.sh
  • netstat -ano | grep 2181

  • 介绍一下框架的种类:

  • 单一的框架:(orm) object relation mapping
    • 特点:单一的系统的架构,使得开发的过程中越来越难以维护
    • 当网站的流量小时,只需要一个web应用,节省了服务器节点的部署,大大节省成本
  • 垂直的应用的框架(mvc) modle view controller
    • 这样就将这个web的框架分为了三层的结构,这样 三层的开发的模型,系统的体积可控,而且分结构的开发,大大提升了开发效率
    • 但是在垂直架构中相同逻辑代码需要不断的复制,不能复用。
  • 分布式应用的架构 (rpc)

    • 当垂直的架构应用越来越多时候应用之间的交互必然增多 ,最后只会形成一个服务中心,我们可以跨越服务器之间的调用
    • 这样我们需要考虑几个问题:
      • 我们将核心的服务抽取出来,并且让他暴露出来,让其他的服务器进行调用这个服务
      • 通信问题:dubbo框架的核心就是zookeeper :zookeepr设置了自身的协议这种的通信tcp类似rpc的协议
      • 寻址问题:我们如何去寻中对方服务器的方法
      • 序列化和反序列化:跨服务器的调用对象,一定设计到对象的序列化和反序列化
  • Dubbo框架:
    image

    • provider 可以暴露服务作为服务的提供方
    • consumer 远程服务的调用服务
    • registry 服务的注册于发现的注册的中心
    • monitor 统计服务的调用的次数和调用
      -Dubbo注册中心:
    • Multicast 注册中心
    • zookeeper注册中心
    • redis 注册的中心
    • simple注册中心
  • 我们这次只使用simple 的注册的方式
  • 对于Dubbo的框架的优点:
    • 透明的调用远程的方法
    • 软负载均衡以及容错机制(可在内网中代替nginx 的硬件的负载均衡)
  • 项目的结构分为三大模块:
    • dubbo-common dubbo的公共接口
    • dubbo-cusummer :调用的远程的服务
    • dubbo-provider 提供远程的服务
    • 这种结构让我联想到了装饰者模式设计,定义一个公共的接口,两个实现类,一个类作为另 一个类的参数进行修饰(在这里就是调用,只不过没有实现通信以及寻址的访问)
    • 项目的结构如下:
      image
  • 在公共接口中添加抽象方法:并且在实现类中实现该方法。
  • 接口中的抽象方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    package service;

    import java.util.List;

    public interface UserService {

    public List<String> select();

    public String insert();
    }
  • 服务的提供者实现方法,并将方法进行暴露

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
package service.impl;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Service;

import service.UserService;

@Service
public class UserServiceImpl implements UserService{

public List<String> select() {
String hell ="你好,dubbo框架";
System.out.println(hell);
List<String> list =new ArrayList<String>();
list.add(hell);
return list;
}

public String insert() {
String iString ="爱生活,爱自己";
System.out.println(iString);
return iString;
}

}
  • 服务的消费者进行调用服务:
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
package test;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import service.UserService;

@Component
public class TestDumbol {
/**
* 测试这个接口的实现类
*/
@Autowired
UserService userService;

public void testV(){

List<String> select = userService.select();

String insert = userService.insert();
System.out.println(insert);
}


}

maven的project 的引入的jar :

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
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
<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>dubbo-pro1</groupId>
<artifactId>dubbo-pro1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>service-pro</module>
<module>provider-pro</module>
<module>consummer-pro</module>
</modules>

<!-- 从阿里云仓库下载 -->
<repositories>
<repository>
<id>public</id>
<name>aliyun nexus</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>

<!-- 相关jar包版本号 -->
<properties>
<!-- spring版本号 -->
<spring.version>4.3.7.RELEASE</spring.version>
<!-- mybatis版本号 -->
<mybatis.version>3.4.2</mybatis.version>
<mybatis-spring-version>1.3.0</mybatis-spring-version>
<!-- log4j日志文件管理包版本 -->
<slf4j.version>1.7.7</slf4j.version>
<log4j.version>1.2.17</log4j.version>
<dubbo.version>2.5.3</dubbo.version>
<zookeeper.version>3.4.8</zookeeper.version>
</properties>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>

<!-- dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>${zookeeper.version}</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>

<!-- 这在粘贴 -->
<!-- dbcp连接池 -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.2.2</version>
</dependency>
<!-- 导入java ee jar 包 -->
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
</dependency>
<!-- spring核心包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- mybatis核心包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- mybatis/spring包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis-spring-version}</version>
</dependency>
<!-- 导入Mysql数据库链接jar包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.30</version>
</dependency>
<!-- mybatis分页 -->
<dependency>
<groupId>com.github.miemiedev</groupId>
<artifactId>mybatis-paginator</artifactId>
<version>1.2.5</version>
</dependency>
<!-- aop -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.10</version>
</dependency>
<!-- 文件上传 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<!-- json -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.8</version>
</dependency>
<!-- JSTL标签类 -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- 日志文件管理包 -->
<!-- log start -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- log end -->
<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
<dependency>
<groupId>cn.songxinqiang</groupId>
<artifactId>com.baidu.ueditor</artifactId>
<version>1.1.2-offical</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.json/json -->
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20160810</version>
</dependency>

<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.1.1</version>
</dependency>

</dependencies>

</project>
  • 提供服务spring的配置
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
<?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 配置自动扫描 -->
<context:component-scan base-package="service.impl"/>

<!-- dubbo配置 -->
<!-- 服务提供者的名字,随意定义,只要不重复即可 -->
<dubbo:application name="my_provider"/>
<!-- 配置zookeeper注册中心的地址 -->
<dubbo:registry address="zookeeper://10.0.152.224:2181"/>
<!-- 配置dubbo暴露服务时所使用的端口号 -->
<dubbo:protocol name="dubbo" port="20880"/>

<!-- 配置服务接口,将哪些service进行暴露,提供服务<-->
<!-- 一个标签只为一个service提供远程调用的功能,如果需要有多个类都具备远程调用,那么需要配置多个标签
interface属性:写的是,接口的完全限定名
ref属性:配置的是该接口的 实现类,写的是是现在类在spring容器中的id,并不是完全限定名
要保证实现类在容器中是存在的
-->
<dubbo:service interface="service.UserService" ref="userServiceImpl"/>


</beans>
  • 读取配置文件,当然这个要在web容器里要配置在web.xml里配置servlet进行读取配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package test;

import java.io.IOException;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestClass {

public static void main(String[] args) throws IOException {
ApplicationContext applicationContext =new ClassPathXmlApplicationContext("spring-ioc.xml");
//这个就是进行线程的阻塞
System.in.read();

}

}
  • constomer的消费者的Spring的配置文件:
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
<?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<context:component-scan base-package="test"/>
<!-- 服务调用者的应用名字,随便定义,只要不重复即可,不需要跟服务提供者一致 -->
<dubbo:application name="my_consumer"/>

<!-- 配置zookeeper地址,用于订阅(发现)服务 -->
<dubbo:registry address="zookeeper://10.0.152.224:2181"/>

<!-- 配置需要调用哪一个服务接口 -->
<!--
一个标签只能调用一个服务接口
如果需要调用多个服务接口,需要配置多个标签
会将该接口的实例,存入spring容器中
id属性:该实例在容器中的id,值是自定义的
interface属性:服务接口对应的完全限定名
-->

<dubbo:reference id="userServiceImpl" interface="service.UserService"/>

</beans>
  • 通过公共的接口进行调用这个接口中的方法
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
package test;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import service.UserService;

@Component
public class TestDumbol {
/**
* 测试这个接口的实现类
*/
@Autowired
UserService userService;

public void testV(){

List<String> select = userService.select();

String insert = userService.insert();
System.out.println(insert);
}


}
  • 通过方法进行调用方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;



public class Testmm {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-ioc.xml");
TestDumbol bean = (TestDumbol) applicationContext.getBean("testDumbol");
bean.testV();


}
}
  • dubble框架的实现:
    image
  • 通过配至服务器的zookeeper的,将conf的文件下到的simple文件修改为:
  • 启动zookeeper,运行本地的程序provider的程序暴露所需要远程的调用 的服务
  • 消费者在本地调用服务
  • 运行结果:
    image
  • 在服务器添加一个web应用就可以实现对服务的管理,包括设置服务 器的均衡,以及当前的服务的状态以及provider和consummer的状态。

  • 提供者:
    image

  • 服务的发布者:
    image
  • zookeeper的作用的其实就是:在这个链接两个Spring的容器:对他们的Spring之间通信rcp的协议,这样实现两个接口的调用。而dubbo框架的核心,最后实现一个服务跨服务器之间的调用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值