分布式
什么是分布式?什么是集群?什么是高并发?什么是高可用?
- 高并发:指访问量很多的情况下
- 分布式:分布式指一件事情拆开来做
- 集群:集群指同样一件事情大家一起做
- 负载均衡:将请求大概平均分配到不同的tomcat中去
- 高可用:对服务器进行备份,避免系统挂掉
总结:在我们高并发的情况下,我们可以使用集群,分布式,在负载均衡的作用下达到一种高可用的目的
海量数据的入门级别
1024b=1kb
1024kb=1Mb
1024Mb=1Gb
1024Gb=1Tb
1024Tb=1pb
海量数据的入门级别就是1pb
电商模式
B2B:商家到商家
B2C:商家到用户
C2C:用户到用户
B2B2C:商家到商家到用户
O2O:线上到线下
P2P:个人对个人的信贷
传统架构的缺点
- 功能耦合度高,指当需要维护某一个功能时,其他功能可能因此也需要做一定的调整
- 系统维护成本高,当需要维护某一个功能时,就需要停掉整个系统,造成大量的损失
- 如果并发量大,无法解决高并发的问题,
针对第三点,我们可以采用负载均衡+集群的方法解决
假设一个服务器为500并发,则两个服务器就是1000并发,使用负载均衡+集群可以解决高并发问题但是使用集群+负载均衡仍然存在一些问题
- 用户存在重复登录的问题
当用户访问经负载均衡到服务器1登录,在服务器1上保存session,但是当用户第二次请求时,可能就请求到服务器2上,服务器2上并没有用户的session,用户就会被服务器2打回登录页面重新登录
解决办法可以使用session共享,但是比较消耗资源,宽带,它的服务能力是先增加后下降,所以集群的节点数量不能太多,一般5个左右) - 系统无法有效进行水平扩展(如果要对系统进行维护扩展,就需要对所有的服务器都进行维护拓展)
分布式
什么是集群?
相当于同一个工程代码拷贝多份部署到多台服务器,每台服务器单独独立部署运行。
什么是分布式?
按照功能点把系统拆分,拆分成独立的功能模块,可以单独为某一个功能模块添加服务器,需要系统之间的配合通信才能完成整个业务逻辑
解决问题:
- 解决了传统系统间功能耦合度高的问题,当只需要维护某一个功能的时候,只需要维护对应功能的服务器即可
- 解决了传统系统维护成本高的问题,当某一块功能出现问题时,只需要停掉对应功能的服务器即可,其他功能依然不影响使用
- 解决高并发问题,将登陆系统独立出来成一个单点登录系统,专门用于登录,身份认证,其他系统只需要向单点登录系统通讯询问即可。
优点:
- 把模块拆分,使用接口通信,降低模块之间的耦合度
- 把项目拆分成若干个子项目,不同的团队负责不同的子项目
- 增加功能时只需要再增加一个子项目,调用其他系统的接口就可以。
- 可以灵活的进行分布式部署
缺点:
- 系统之间交互需要使用远程通信,需要开发接口,增加工作量
- 各个模块有一些通用的业务逻辑无法公用(SOA架构可以解决)
基于SOA的架构
SOA指面向服务的架构,将工程分为服务层工程和表现层工程,服务层包含业务逻辑,只需要对外提供服务即可,表现层只需要调用服务层的服务,处理与页面交互即可。
SOA架构的结构
- **-parent:父工程,打包方式pom,管理jar包的版本号,项目中所有工程都应该继承父工程。
- **-common:通用的工具类,打包方式jar
- **-manager:服务层工程。聚合工程。打包方式pom
- **-manager-dao:打包方式jar
- **-manager-pojo:打包方式jar
- **-manager-interface:为表现层提供业务接口,打包方式jar
- **-manager-service:打包方式jar
- **-manager-web:表现层工程,打包方式war
SSM框架版的SOA架构的搭建(idea版,以taotao商城为例)
-
创建一个空的文件夹taotao
-
创建model父工程taotao-parent,管理jar包版本,打包成pom
- spring和springmvc的10个jar包
- spring的jdbc
- spring对于声明式和注解式事务的支持spring-tx
- spring对消息队列的支持spring-jms
- jsp相关的3个jar包
- 文件上传的jar包
- redis缓存支持的jar包
- solr客户端支持的jar包
- dubbo相关的jar包
- 数据库连接池durid的jar包
- mysql的支持jar包
- mybatis的jar包
- spring支持mybatis的jar包
- mybatis支持的分页的jar包
- 日志处理
- 单元测试
- httpclient的jar包
- Json数据支持的jar包
- Apache工具组件
- 时间操作组件
<groupId>com.taobao</groupId> <artifactId>taobao-parent</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <!--集中定义依赖版本号--> <properties> <!--单元测试--> <junit.version>4.12</junit.version> <!--spring和springmvc等--> <spring.version>5.1.5.RELEASE</spring.version> <aspectjweaver.version>1.9.2</aspectjweaver.version> <aopalliance.version>1.0.0</aopalliance.version> <!--mybatis--> <mybatis.version>3.4.6</mybatis.version> <!--spring的Mybatis的支持--> <mybatis.spring.version>1.3.2</mybatis.spring.version> <!--分页--> <mybatis.paginator.version>1.2.15</mybatis.paginator.version> <pagehelper.version>5.1.2</pagehelper.version> <!--mysql--> <mysql.version>6.0.6</mysql.version> <!-- 日志处理 --> <slf4j.version>1.7.25</slf4j.version> <!--json数据--> <jackson.version>2.9.8</jackson.version> <!-- 连接池 --> <druid.version>1.1.10</druid.version> <!--httpclient--> <httpclient.version>4.3.5</httpclient.version> <!--前端支持--> <jstl.version>1.2</jstl.version> <servlet-api.version>2.5</servlet-api.version> <jsp-api.version>2.0</jsp-api.version> <!-- 时间操作组件 --> <joda-time.version>2.9.9</joda-time.version> <!-- Apache工具组件 --> <commons-lang3.version>3.4</commons-lang3.version> <commons-io.version>1.3.2</commons-io.version> <commons-net.version>3.3</commons-net.version> <jsqlparser.version>0.9.1</jsqlparser.version> <!-- 文件上传组件 --> <commons-fileupload.version>1.3.1</commons-fileupload.version> <!-- Redis客户端 --> <jedis.version>2.9.0</jedis.version> <!-- solr客户端 --> <solrj.version>7.4.0</solrj.version> <!-- dubbo相关 --> <dubbo.version>2.5.3</dubbo.version> <zookeeper.version>3.4.6</zookeeper.version> <zkclient.version>0.10</zkclient.version> <activemq.version>5.10.0</activemq.version> <freemarker.version>2.3.23</freemarker.version> <!-- quartz任务调度框架 --> <quartz.version>2.3.0</quartz.version> </properties> <!--管理版本的标签--> <dependencyManagement> <dependencies> <!-- 时间操作组件 --> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>${joda-time.version}</version> </dependency> <!-- Apache工具组件 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>${commons-lang3.version}</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-io</artifactId> <version>${commons-io.version}</version> </dependency> <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>${commons-net.version}</version> </dependency> <!-- Jackson Json处理工具包 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <!-- httpclient --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>${httpclient.version}</version> </dependency> <!-- quartz任务调度框架 --> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>${quartz.version}</version> </dependency> <!-- 单元测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <!-- 日志处理 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j.version}</version> </dependency> <!-- Mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>${mybatis.spring.version}</version> </dependency> <dependency> <groupId>com.github.miemiedev</groupId> <artifactId>mybatis-paginator</artifactId> <version>${mybatis.paginator.version}</version> </dependency> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>${pagehelper.version}</version> </dependency> <!-- MySql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <!-- 连接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>${druid.version}</version> </dependency> <!-- Spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</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-webmvc</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-aspects</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.aopalliance</groupId> <artifactId>com.springsource.org.aopalliance</artifactId> <version>${aoplliance.version}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>${aspectjweaver.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <!-- JSP相关 --> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>${jstl.version}</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>${servlet-api.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>${jsp-api.version}</version> <scope>provided</scope> </dependency> <!-- 文件上传组件 --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>${commons-fileupload.version}</version> </dependency> <!-- Redis客户端 --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>${jedis.version}</version> </dependency> <!-- solr客户端 --> <dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> <version>${solrj.version}</version> </dependency> <!-- dubbo相关 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>${dubbo.version}</version> </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>${zkclient.version}</version> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</artifactId> <version>${activemq.version}</version> </dependency> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>${freemarker.version}</version> </dependency> </dependencies> </dependencyManagement>
-
创建model通用工具项目taotao-common,父类工程为taotao-parent,打包jar包,根据父类工程导入相应的依赖
<parent> <artifactId>taobao-parent</artifactId> <groupId>com.taobao</groupId> <version>1.0-SNAPSHOT</version> <relativePath>../taobaoparent/pom.xml</relativePath> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>taobao-common</artifactId> <packaging>jar</packaging> <dependencies> <!-- 时间操作组件 --> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>${joda-time.version}</version> </dependency> <!-- Apache工具组件 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>${commons-lang3.version}</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-io</artifactId> <version>${commons-io.version}</version> </dependency> <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>${commons-net.version}</version> </dependency> <!-- Jackson Json处理工具包 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <!-- httpclient --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>${httpclient.version}</version> </dependency> <!-- quartz任务调度框架 --> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>${quartz.version}</version> </dependency> <!-- 单元测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies>
-
创建taotao-manager,父类工程为taotao-parent,此工程为一个聚合工程,其下的工程有taotao-dao,taotao-pojo,taotao-service,taotao-interface,需要导入taotao-common的依赖,打包为pom
-
taotao-dao,taotao-pojo,taotao-service,taotao-interface的父工程都是taotao-manager,打成jar包,taotao-pojo不需要引入什么依赖,但是对于分布式项目而言,taotao-pojo下面的所有实体类都需要序列化,包括json数据的类也要序列化taotao-dao和taotao-interface都需要引入taotao-pojo的依赖,taotao-service需要引入taotao-dao和taotao-interface的依赖,其他依赖根据情况添加
-
taotao-manager-web,父工程taotao-parent,打成war包,引入taotao-manager-interface的依赖即可,其他依赖根据情况添加,并且还需添加tomcat插件
<plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <configuration> <port>8081</port> <path>/</path> </configuration> </plugin> </plugins>
运行项目
- 按照顺序依次打包taotao-parent,taotao-common,taotao-manager
- 运行taotao-manager-web