zoukankan      html  css  js  c++  java
  • 分布式编程

    ①分布式应用程序简介

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

    ②分布式的作用
       分散服务器的压力
        大型系统中,模块众多,并发量大,仅用一个服务器承载往往会发生压力过大而导致系统瘫痪的情况。可以在横向和纵向两方面来进行拆分,把这些模块部署到不同的服务器上。这样整个系统的压力就分布到了不同的服务器上。
        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满天飞),却意想不到的达到了一举两得的效果,期待以后更好的发展。

        

        

        

  • 相关阅读:
    LAMP环境搭建博客
    PHP项目中经常用到的无限极分类函数
    在PHP项目中,每个类都要有对应的命名空间,为什么?
    一键解决docker pull hello-world的问题
    网盘10M速度下载-亿寻下载器
    《提问的智慧》
    idea出现 Error:(1, 1) java: 非法字符: 'ufeff'解决方式
    多线程的四种实现方式
    Java中的get()方法和set()方法
    Java构造器(构造方法/constructor)
  • 原文地址:https://www.cnblogs.com/yimengxianzhi/p/8631656.html
Copyright © 2011-2022 走看看