博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分布式编程
阅读量:5021 次
发布时间:2019-06-12

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

①分布式应用程序简介

  分布式应用程序就是指应用程序分布在不同计算机上,通过网络来共同完成一项任务,通常为服务器/客户端模式。更广义上理解“分布”,不只是应用程序,还包括数据库等,分布在不同计算机,完成同一个任务。

 

②分布式的作用

   分散服务器的压力
    大型系统中,模块众多,并发量大,仅用一个服务器承载往往会发生压力过大而导致系统瘫痪的情况。可以在横向和纵向两方面来进行拆分,把这些模块部署到不同的服务器上。这样整个系统的压力就分布到了不同的服务器上。
    l 横向:按功能划分。
    l 纵向:N层架构,其中的一些层分布到不同的服务器上。

   提供服务,功能重用

    使用服务进行功能重用比使用组件进行代码重用更进一层。举例来说,如果在一个系统中的三个模块都需要用到报表功能,一种方法是把报表功能做成一个单独的组件,然后让三个模块都引用这个组件,计算操作由三个模块各自进行;另一种方法是把报表功能做成单独的服务,让这三个模块直接使用这个服务来获取数据,所有的计算操作都在一处进行,很明显后者的方案会比前者好得多。
    服务不仅能对内提供还能对外提供,如果其他合作伙伴需要使用我们的报表服务,我们又不想直接把所有的信息都公开给它们。在这种情况下组件方式就不是很合理了,通过公开服务并对服务的使用方做授权和验证,那么我们既能保证合作伙伴能得到他们需要的数据,又能保证核心的数据不公开。 

 

③实践操作(eclipse  Maven项目)

  1>创建工作环境——配置

    Java环境变量:Window——>preference——>Java——>Installed JRE(找到安装好的jdk)

    Maven:Window——>preference——>Maven——>User Settings——>Global Settings(在maven中config目录下找到settings.xml)

    General:Window——>preference——>general——>workspace(改变编码格式设为UTF-8)

  2>创建maven工程

    configure页面中,packging打包为(jar:纯java文件  pom:父工程文件  war:web文件)

    

    |1|先创建一个父工程,packging选择为pom,此工程只有src与pom.xml,将所有工程配置(jar包)全放在此工程里统一管理,其余工程为其子工程。这里列举常用的版本依赖代码如下:

1 
2
3
4.12
4
4.3.14.RELEASE
5
3.4.5
6
1.3.1
7
1.2.15
8
3.4.2-fix
9
5.1.32
10
1.6.4
11
2.4.2
12
1.1.8
13
4.3.5
14
1.2
15
2.5
16
2.0
17
2.9.9
18
3.3.2
19
1.3.2
20
3.3
21
0.9.1
22
1.3.1
23
2.7.2
24
4.10.3
25
2.5.3
26
3.4.7
27
0.1
28
5.11.2
29
2.3.23
30
2.2.2
31
32 33
34
35
36
37
38
junit
39
junit
40
${junit.version}
41
test
42
43
44
45
org.slf4j
46
slf4j-log4j12
47
${slf4j.version}
48
49 50
51
52
org.apache.commons
53
commons-lang3
54
${commons-lang3.version}
55
56
57
org.apache.commons
58
commons-io
59
${commons-io.version}
60
61
62
commons-net
63
commons-net
64
${commons-net.version}
65
66 67
68
69
joda-time
70
joda-time
71
${joda-time.version}
72
73 74
75
76
jstl
77
jstl
78
${jstl.version}
79
80
81
javax.servlet
82
servlet-api
83
${servlet-api.version}
84
provided
85
86
87
javax.servlet
88
jsp-api
89
${jsp-api.version}
90
provided
91
92
93
94
commons-fileupload
95
commons-fileupload
96
${commons-fileupload.version}
97
98 99
100
101
com.fasterxml.jackson.core
102
jackson-databind
103
${jackson.version}
104
105 106
107
108
org.apache.httpcomponents
109
httpclient
110
${httpclient.version}
111
112 113
114
115
org.quartz-scheduler
116
quartz
117
${quartz.version}
118
119 120
121
122
org.mybatis
123
mybatis
124
${mybatis.version}
125
126
127
org.mybatis
128
mybatis-spring
129
${mybatis.spring.version}
130
131
132
com.github.miemiedev
133
mybatis-paginator
134
${mybatis.paginator.version}
135
136
137
com.github.pagehelper
138
pagehelper
139
${pagehelper.version}
140
141
142
143
mysql
144
mysql-connector-java
145
${mysql.version}
146
147
148
149
com.alibaba
150
druid
151
${druid.version}
152
153
154
155
org.springframework
156
spring-context
157
${spring.version}
158
159
160
org.springframework
161
spring-beans
162
${spring.version}
163
164
165
org.springframework
166
spring-webmvc
167
${spring.version}
168
169
170
org.springframework
171
spring-jdbc
172
${spring.version}
173
174
175
org.springframework
176
spring-aspects
177
${spring.version}
178
179
180
org.springframework
181
spring-jms
182
${spring.version}
183
184
185
org.springframework
186
spring-context-support
187
${spring.version}
188
189 190
191
192
redis.clients
193
jedis
194
${jedis.version}
195
196
197
198
org.apache.solr
199
solr-solrj
200
${solrj.version}
201
202
203
204
com.alibaba
205
dubbo
206
${dubbo.version}
207
208
209
org.apache.zookeeper
210
zookeeper
211
${zookeeper.version}
212
213
214
com.github.sgroschupf
215
zkclient
216
${zkclient.version}
217
218
219
org.apache.activemq
220
activemq-all
221
${activemq.version}
222
223
224
org.freemarker
225
freemarker
226
${freemarker.version}
227
228
229
230 231
232
233
234
235
236
org.eclipse.jetty
237
jetty-maven-plugin
238
9.0.0.v20130308
239
240
241
242
243
244
245
org.apache.maven.plugins
246
maven-resources-plugin
247
2.7
248
249
UTF-8
250
251
252
253
254
org.apache.maven.plugins
255
maven-compiler-plugin
256
3.2
257
258
1.8259
1.8
260
UTF-8
261
262
263
264
设置版本依赖

(其中包含jetty插件,测试时常用jetty插件服务器,方便快捷,代码层级:build——pluginManagement——plugins——plugin)

      |2|创建子工程(如常用工具集comments,选择jar包),此时要填写父工程相关信息。其pom.xml中有父工程的描述,包括版本号和groupId

    |3|单个子工程中模块的创建,选择maven module并创建,如果需要引用其他工程(如dao层需要引用entity中的javaBean),则在pom.xml中加上相关依赖。

      (其中web工程的pom.xml中需要将jetty配置引过来)

 

  3>zookeeper介绍

    |1|Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等

    |2|ZooKeeper配置需要的端口号==》 端口X:客户端连接ZooKeeper集群使用的监听端口号  端口Y:leader和follower之间数据同步使用的端口号  端口Z:leader选举专用的端口号

 

    |3|单点分析:在每个ZooKeeper节点当中,ZooKeeper维护了一个类似linux的树状文件系统结构,可以把一些配置信息,数据等存放到ZooKeeper当中,也可以把ZooKeeper当中的一个目录节点当做一个锁的互斥文件来实现并发安全控制

    |4|集群分析:类似mysql读写分离那样,ZooKeeper的每个节点都存放相同的数据,因此访问ZooKeeper的时候会被分流道各个节点实现高并发,多节点也顺便实现了高可用。 ZooKeeper的节点之间也有主次关系,集群启动完成之后,ZooKeeper会运行选举程序(端口Z)从集群中选择一个leader节点,而其他的节点就是follower节点,对于ZooKeeper的写操作,会被转发到leader节点,而follower节点和leader节点的数据同步(端口Y)也在后台自动实现,读操作则每个节点都能提供,负载均衡

  4>zookeeper配置

    待完善......

 

④基于简单配置操作后自我感悟与理解

  从开始接触编程到现在一直强调的就是模块化,也就是所谓的封装,使整个程序的每一个模块完成一个指定的功能,并在模块之间建立必要的联系,这也是面向对象编程的一个核心思想吧。而我们现在所接触的分布式编程也正是运用了这一核心思想,从最开始的整个工程项目全在一个jsp上实现,到后来的MVC编程,到后来ssm各个层次分的越来越清晰,但是我们还没有做到真正的分离,它们还是在一个项目工程里,而分布式编程的提出,将各个层次从Dao层,服务层(service)到视图层(controller+view)全部分为一个个单独的工程,采用父工程与子工程的关系又使之有一定的联系,而zookeeper作为注册中心,它拥有的单点分析与集群分析特性能很好的调控相关层次之间的联系。

  向模块化的核心思想靠拢这是毋庸置疑的,但它实际带来的好处又有哪些呢?我们知道运行项目工程需要服务器,若采用之前的所有层次全在一个工程中,那么服务器也需要运行整个工程包括的所有层次,但有些层次功能并不需要那么多次的运行,就好比我只有200个管理员来访问着管理员的视图层,但客户却有上万人的访问,没有分布式编程之前,那么整个工程都会按最大需求来运行,也就是客户的上万人次,那么必定有过多的管理员视图层的运行造成资源浪费,而分布式编程解决了这一浪费,我们将各个层次功能划分开来,只需配置相关的需要的服务器数量即可,减少了不必要的资源浪费,当然这些往明了讲就是剩了money啦,但这在我们这些个程序猿眼里可是让人赞叹不已的技术,往后想这不单单是服务器数量使用减少这么简单,如今市面上应该已经有了对照相应功能的服务器,也就是对相应层次功能具有了指向性的专门的服务器,这样一来从性能上又能带来一个质的飞跃,是不是惊叹到了,一个看起来就是分了个层的分布式(操作起来还是挺麻烦的,还在学习中bug满天飞),却意想不到的达到了一举两得的效果,期待以后更好的发展。

 

    

    

    

转载于:https://www.cnblogs.com/yimengxianzhi/p/8631656.html

你可能感兴趣的文章
Jenkins+Maven+SVN快速搭建持续集成环境(转)
查看>>
bootstrap 媒体查询
查看>>
杜教筛
查看>>
《Ext JS模板与组件基本知识框架图----模板》
查看>>
txmpp
查看>>
微信开发时调用jssdk,在安卓设备中成功调用;在ios设备中返回错误消息:config fail,无其他具体错误消息,且接口权限显示获取ok,无法调用...
查看>>
【Github教程】史上最全github使用方法:github入门到精通
查看>>
抽象工厂模式(Abstract Factory)
查看>>
luogu1373 小a和uim之大逃离 (dp)
查看>>
Redis的Pub/Sub客户端实现
查看>>
SQL日常问题和技巧——持续更新
查看>>
springMVC入门(一)------springMVC基本概念与安装
查看>>
Sam做题记录
查看>>
[bzoj] 2453 维护数列 || 单点修改分块
查看>>
IIS版本变迁
查看>>
使用Gzip压缩提升WEB服务器性能
查看>>
BZOJ3884: 上帝与集合的正确用法 拓展欧拉定理
查看>>
mybatis09--自连接一对多查询
查看>>
myeclipse10添加jQuery自动提示的方法
查看>>
【eclipse jar包】在编写java代码时,为方便编程,常常会引用别人已经实现的方法,通常会封装成jar包,我们在编写时,只需引入到Eclipse中即可。...
查看>>