①分布式应用程序简介
分布式应用程序就是指应用程序分布在不同计算机上,通过网络来共同完成一项任务,通常为服务器/客户端模式。更广义上理解“分布”,不只是应用程序,还包括数据库等,分布在不同计算机,完成同一个任务。
②分布式的作用 分散服务器的压力 大型系统中,模块众多,并发量大,仅用一个服务器承载往往会发生压力过大而导致系统瘫痪的情况。可以在横向和纵向两方面来进行拆分,把这些模块部署到不同的服务器上。这样整个系统的压力就分布到了不同的服务器上。 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 23 32 33 344.12 44.3.14.RELEASE 53.4.5 61.3.1 71.2.15 83.4.2-fix 95.1.32 101.6.4 112.4.2 121.1.8 134.3.5 141.2 152.5 162.0 172.9.9 183.3.2 191.3.2 203.3 210.9.1 221.3.1 232.7.2 244.10.3 252.5.3 263.4.7 270.1 285.11.2 292.3.23 302.2.2 3135 230 23136 37 22938 43 44junit 39junit 40${junit.version} 41test 4245 49 50 51org.slf4j 46slf4j-log4j12 47${slf4j.version} 4852 56org.apache.commons 53commons-lang3 54${commons-lang3.version} 5557 61org.apache.commons 58commons-io 59${commons-io.version} 6062 66 67 68commons-net 63commons-net 64${commons-net.version} 6569 73 74 75joda-time 70joda-time 71${joda-time.version} 7276 80jstl 77jstl 78${jstl.version} 7981 86javax.servlet 82servlet-api 83${servlet-api.version} 84provided 8587 92 93javax.servlet 88jsp-api 89${jsp-api.version} 90provided 9194 98 99 100commons-fileupload 95commons-fileupload 96${commons-fileupload.version} 97101 105 106 107com.fasterxml.jackson.core 102jackson-databind 103${jackson.version} 104108 112 113 114org.apache.httpcomponents 109httpclient 110${httpclient.version} 111115 119 120 121org.quartz-scheduler 116quartz 117${quartz.version} 118122 126org.mybatis 123mybatis 124${mybatis.version} 125127 131org.mybatis 128mybatis-spring 129${mybatis.spring.version} 130132 136com.github.miemiedev 133mybatis-paginator 134${mybatis.paginator.version} 135137 141 142com.github.pagehelper 138pagehelper 139${pagehelper.version} 140143 147 148mysql 144mysql-connector-java 145${mysql.version} 146149 153 154com.alibaba 150druid 151${druid.version} 152155 159org.springframework 156spring-context 157${spring.version} 158160 164org.springframework 161spring-beans 162${spring.version} 163165 169org.springframework 166spring-webmvc 167${spring.version} 168170 174org.springframework 171spring-jdbc 172${spring.version} 173175 179org.springframework 176spring-aspects 177${spring.version} 178180 184org.springframework 181spring-jms 182${spring.version} 183185 189 190 191org.springframework 186spring-context-support 187${spring.version} 188192 196 197redis.clients 193jedis 194${jedis.version} 195198 202 203org.apache.solr 199solr-solrj 200${solrj.version} 201204 208com.alibaba 205dubbo 206${dubbo.version} 207209 213org.apache.zookeeper 210zookeeper 211${zookeeper.version} 212214 218com.github.sgroschupf 215zkclient 216${zkclient.version} 217219 223org.apache.activemq 220activemq-all 221${activemq.version} 222224 228org.freemarker 225freemarker 226${freemarker.version} 227232 233 234 242235 241236 240org.eclipse.jetty 237jetty-maven-plugin 2389.0.0.v20130308 239243 244 264245 252 253org.apache.maven.plugins 246maven-resources-plugin 2472.7 248249 251UTF-8 250254 263org.apache.maven.plugins 255maven-compiler-plugin 2563.2 257258 262
(其中包含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满天飞),却意想不到的达到了一举两得的效果,期待以后更好的发展。