①分布式應用程序簡介
分布式應用程序就是指應用程序分布在不同計算機上,通過網絡來共同完成一項任務,通常為服務器/客戶端模式。更廣義上理解“分布”,不只是應用程序,還包括數據庫等,分布在不同計算機,完成同一個任務。
②分布式的作用
分散服務器的壓力
大型系統中,模塊眾多,並發量大,僅用一個服務器承載往往會發生壓力過大而導致系統癱瘓的情況。可以在橫向和縱向兩方面來進行拆分,把這些模塊部署到不同的服務器上。這樣整個系統的壓力就分布到了不同的服務器上。
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 <properties> 3 <junit.version>4.12</junit.version> 4 <spring.version>4.3.14.RELEASE</spring.version> 5 <mybatis.version>3.4.5</mybatis.version> 6 <mybatis.spring.version>1.3.1</mybatis.spring.version> 7 <mybatis.paginator.version>1.2.15</mybatis.paginator.version> 8 <pagehelper.version>3.4.2-fix</pagehelper.version> 9 <mysql.version>5.1.32</mysql.version> 10 <slf4j.version>1.6.4</slf4j.version> 11 <jackson.version>2.4.2</jackson.version> 12 <druid.version>1.1.8</druid.version> 13 <httpclient.version>4.3.5</httpclient.version> 14 <jstl.version>1.2</jstl.version> 15 <servlet-api.version>2.5</servlet-api.version> 16 <jsp-api.version>2.0</jsp-api.version> 17 <joda-time.version>2.9.9</joda-time.version> 18 <commons-lang3.version>3.3.2</commons-lang3.version> 19 <commons-io.version>1.3.2</commons-io.version> 20 <commons-net.version>3.3</commons-net.version> 21 <jsqlparser.version>0.9.1</jsqlparser.version> 22 <commons-fileupload.version>1.3.1</commons-fileupload.version> 23 <jedis.version>2.7.2</jedis.version> 24 <solrj.version>4.10.3</solrj.version> 25 <dubbo.version>2.5.3</dubbo.version> 26 <zookeeper.version>3.4.7</zookeeper.version> 27 <zkclient.version>0.1</zkclient.version> 28 <activemq.version>5.11.2</activemq.version> 29 <freemarker.version>2.3.23</freemarker.version> 30 <quartz.version>2.2.2</quartz.version> 31 </properties> 32 33 <!-- 管理工程依賴jar包的版本號 --> 34 <dependencyManagement> 35 <dependencies> 36 <!-- 單元測試 --> 37 <dependency> 38 <groupId>junit</groupId> 39 <artifactId>junit</artifactId> 40 <version>${junit.version}</version> 41 <scope>test</scope> 42 </dependency> 43 <!-- 日志處理 --> 44 <dependency> 45 <groupId>org.slf4j</groupId> 46 <artifactId>slf4j-log4j12</artifactId> 47 <version>${slf4j.version}</version> 48 </dependency> 49 50 <!-- Apache COMMONS工具組件 --> 51 <dependency> 52 <groupId>org.apache.commons</groupId> 53 <artifactId>commons-lang3</artifactId> 54 <version>${commons-lang3.version}</version> 55 </dependency> 56 <dependency> 57 <groupId>org.apache.commons</groupId> 58 <artifactId>commons-io</artifactId> 59 <version>${commons-io.version}</version> 60 </dependency> 61 <dependency> 62 <groupId>commons-net</groupId> 63 <artifactId>commons-net</artifactId> 64 <version>${commons-net.version}</version> 65 </dependency> 66 67 <!-- 時間操作組件 --> 68 <dependency> 69 <groupId>joda-time</groupId> 70 <artifactId>joda-time</artifactId> 71 <version>${joda-time.version}</version> 72 </dependency> 73 74 <!-- JSP相關 --> 75 <dependency> 76 <groupId>jstl</groupId> 77 <artifactId>jstl</artifactId> 78 <version>${jstl.version}</version> 79 </dependency> 80 <dependency> 81 <groupId>javax.servlet</groupId> 82 <artifactId>servlet-api</artifactId> 83 <version>${servlet-api.version}</version> 84 <scope>provided</scope> 85 </dependency> 86 <dependency> 87 <groupId>javax.servlet</groupId> 88 <artifactId>jsp-api</artifactId> 89 <version>${jsp-api.version}</version> 90 <scope>provided</scope> 91 </dependency> 92 <!-- 文件上傳組件 --> 93 <dependency> 94 <groupId>commons-fileupload</groupId> 95 <artifactId>commons-fileupload</artifactId> 96 <version>${commons-fileupload.version}</version> 97 </dependency> 98 99 <!-- Jackson Json處理工具包 --> 100 <dependency> 101 <groupId>com.fasterxml.jackson.core</groupId> 102 <artifactId>jackson-databind</artifactId> 103 <version>${jackson.version}</version> 104 </dependency> 105 106 <!-- httpclient --> 107 <dependency> 108 <groupId>org.apache.httpcomponents</groupId> 109 <artifactId>httpclient</artifactId> 110 <version>${httpclient.version}</version> 111 </dependency> 112 113 <!-- quartz任務調度框架 --> 114 <dependency> 115 <groupId>org.quartz-scheduler</groupId> 116 <artifactId>quartz</artifactId> 117 <version>${quartz.version}</version> 118 </dependency> 119 120 <!-- Mybatis --> 121 <dependency> 122 <groupId>org.mybatis</groupId> 123 <artifactId>mybatis</artifactId> 124 <version>${mybatis.version}</version> 125 </dependency> 126 <dependency> 127 <groupId>org.mybatis</groupId> 128 <artifactId>mybatis-spring</artifactId> 129 <version>${mybatis.spring.version}</version> 130 </dependency> 131 <dependency> 132 <groupId>com.github.miemiedev</groupId> 133 <artifactId>mybatis-paginator</artifactId> 134 <version>${mybatis.paginator.version}</version> 135 </dependency> 136 <dependency> 137 <groupId>com.github.pagehelper</groupId> 138 <artifactId>pagehelper</artifactId> 139 <version>${pagehelper.version}</version> 140 </dependency> 141 <!-- MySql --> 142 <dependency> 143 <groupId>mysql</groupId> 144 <artifactId>mysql-connector-java</artifactId> 145 <version>${mysql.version}</version> 146 </dependency> 147 <!-- 連接池 --> 148 <dependency> 149 <groupId>com.alibaba</groupId> 150 <artifactId>druid</artifactId> 151 <version>${druid.version}</version> 152 </dependency> 153 <!-- Spring --> 154 <dependency> 155 <groupId>org.springframework</groupId> 156 <artifactId>spring-context</artifactId> 157 <version>${spring.version}</version> 158 </dependency> 159 <dependency> 160 <groupId>org.springframework</groupId> 161 <artifactId>spring-beans</artifactId> 162 <version>${spring.version}</version> 163 </dependency> 164 <dependency> 165 <groupId>org.springframework</groupId> 166 <artifactId>spring-webmvc</artifactId> 167 <version>${spring.version}</version> 168 </dependency> 169 <dependency> 170 <groupId>org.springframework</groupId> 171 <artifactId>spring-jdbc</artifactId> 172 <version>${spring.version}</version> 173 </dependency> 174 <dependency> 175 <groupId>org.springframework</groupId> 176 <artifactId>spring-aspects</artifactId> 177 <version>${spring.version}</version> 178 </dependency> 179 <dependency> 180 <groupId>org.springframework</groupId> 181 <artifactId>spring-jms</artifactId> 182 <version>${spring.version}</version> 183 </dependency> 184 <dependency> 185 <groupId>org.springframework</groupId> 186 <artifactId>spring-context-support</artifactId> 187 <version>${spring.version}</version> 188 </dependency> 189 190 <!-- Redis客戶端 --> 191 <dependency> 192 <groupId>redis.clients</groupId> 193 <artifactId>jedis</artifactId> 194 <version>${jedis.version}</version> 195 </dependency> 196 <!-- solr客戶端 --> 197 <dependency> 198 <groupId>org.apache.solr</groupId> 199 <artifactId>solr-solrj</artifactId> 200 <version>${solrj.version}</version> 201 </dependency> 202 <!-- dubbo相關 --> 203 <dependency> 204 <groupId>com.alibaba</groupId> 205 <artifactId>dubbo</artifactId> 206 <version>${dubbo.version}</version> 207 </dependency> 208 <dependency> 209 <groupId>org.apache.zookeeper</groupId> 210 <artifactId>zookeeper</artifactId> 211 <version>${zookeeper.version}</version> 212 </dependency> 213 <dependency> 214 <groupId>com.github.sgroschupf</groupId> 215 <artifactId>zkclient</artifactId> 216 <version>${zkclient.version}</version> 217 </dependency> 218 <dependency> 219 <groupId>org.apache.activemq</groupId> 220 <artifactId>activemq-all</artifactId> 221 <version>${activemq.version}</version> 222 </dependency> 223 <dependency> 224 <groupId>org.freemarker</groupId> 225 <artifactId>freemarker</artifactId> 226 <version>${freemarker.version}</version> 227 </dependency> 228 </dependencies> 229 </dependencyManagement> 230 231 <build> 232 <!-- 工程插件管理 --> 233 <pluginManagement> 234 <plugins> 235 <plugin> 236 <groupId>org.eclipse.jetty</groupId> 237 <artifactId>jetty-maven-plugin</artifactId> 238 <version>9.0.0.v20130308</version> 239 </plugin> 240 </plugins> 241 </pluginManagement> 242 <plugins> 243 <!-- 資源文件拷貝插件 --> 244 <plugin> 245 <groupId>org.apache.maven.plugins</groupId> 246 <artifactId>maven-resources-plugin</artifactId> 247 <version>2.7</version> 248 <configuration> 249 <encoding>UTF-8</encoding> 250 </configuration> 251 </plugin> 252 <!-- java編譯插件 --> 253 <plugin> 254 <groupId>org.apache.maven.plugins</groupId> 255 <artifactId>maven-compiler-plugin</artifactId> 256 <version>3.2</version> 257 <configuration> 258 <source>1.8</source> 259 <target>1.8</target> 260 <encoding>UTF-8</encoding> 261 </configuration> 262 </plugin> 263 </plugins> 264 </build>
(其中包含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滿天飛),卻意想不到的達到了一舉兩得的效果,期待以后更好的發展。