一、分布式架构
需要按照功能点把系统拆分,拆分成独立的功能工程,可以单独为某一个节点添加服务器,需要系统之间配合才能完成整个业务逻辑这就叫做分布式。
如图所示,把整个系统的功能模块独立出来,做成单独的系统,然后一起协同工作。对于单独的系统,可以对其功能以及性能做灵活的更改。
集群:相当于同一个工程代码拷贝多份部署到多台服务器,每台服务器单独独立部署运行。
分布式架构:
把系统按照模块拆分成多个子系统;多个子系统相互协作才能完成业务流程系统之间需要进行通信。
优点:
1、把模块拆分,使用接口通信,降低模块之间的耦合度。
2、把项目拆分成若干个子项目,不同的团队负责不同的子项目。
3、增加功能时只需要再增加一个子项目,调用其他系统的接口就可以。
4、可以灵活的进行分布式部署。
缺点:
1、系统之间交互需要使用远程通信,需要开发接口,增加工作量。
2、各个模块有一些通用的业务逻辑无法公用。
所以就需要结合另一种架构SOA架构。
二、SOA架构
SOA:Service Oriented Architecture面向服务的架构。也就是把工程都拆分成服务层工程、表现层工程。服务层中包含业务逻辑,只需要对外提供服务即可。表现层只需要处理和页面的交互,业务逻辑都是调用服务层的服务来实现。工程都可以独立部署。
三、项目SOA架构
可以看出,整体项目基础是SOA的分布式架构,每个功能块都是独立的系统,它们的业务逻辑由于有相似之处,所以都封装到了服务层工程,然后结合一些中间件以及持久层,就完成了整个系统的架构。
四、工程搭建
使用maven管理工程
好处:
Jar包的管理
工程之间的依赖管理
自动打包
统一的版本的控制。
后台管理系统工程搭建分析
Maven的常见打包方式:jar、war、pom
Pom工程一般都是父工程,管理jar包的版本、maven插件的版本、统一的依赖管理。聚合工程。
taotao-parent:父工程,打包方式pom,管理jar包的版本号。
| 项目中所有工程都应该继承父工程。
|–taotao-common:通用的工具类通用的pojo,util。打包方式jar
|–taotao-manager:服务层工程。聚合工程。Pom工程
|–taotao-manager-dao:打包方式jar
|–taotao-manager-pojo:打包方式jar
|–taotao-manager-interface:打包方式jar
|–taotao-manager-service:打包方式:war (为了发布服务的方便)
|–taotao-manager-web:表现层工程。打包方式war
注意:项目跑的命令:clean tomcat7:run
五、系统间消息通知的中间件
1.如何实现远程通信?
1、使用WebService:效率不高,它是基于soap协议(http+xml)。项目中不推荐使用。
2、使用restful形式的服务:http+json。很多项目中应用。如果服务越来越多,服务与服务之间的调用关系复杂,调用服务的URL管理复杂,什么时候添加机器难以确定。
3、使用dubbo。使用rpc协议进行远程调用,直接使用socket通信。传输效率高,并且可以统计出系统之间的调用关系、调用次数,管理服务。
2.dubbo
DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案。
• 单一应用架构
- 当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。
- 此时,用于简化增删改查工作量的 数据访问框架(ORM) 是关键。
• 垂直应用架构
- 当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。
- 此时,用于加速前端页面开发的 Web框架(MVC) 是关键。
• 分布式服务架构
- 当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。
- 此时,用于提高业务复用及整合的 分布式服务框架(RPC) 是关键。
• 流动计算架构
- 当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。
- 此时,用于提高机器利用率的 资源调度和治理中心(SOA) 是关键。
Dubbo就是资源调度和治理中心的管理工具。
Dubbo 就是类似于webservice的关于系统之间通信的框架,并可以统计和管理服务之间的调用情况(包括服务被谁调用了,调用的次数是如何,以及服务的使用状况)。
Dubbo架构
简要说明:
init:初始化
async:异步
sync:同步
Dubbo执行流程:
首先,容器进行初始化,然后将服务器所有用的信息,包括可调用的端口号,ip地址等等发送给注册器,服务注册器接收信息,当用户要请求服务器执行操作的时候,会根据注册器异步提供给用户的通知,用户就可以根据这个通知来调用具体的服务器来执行操作。
其中,监控器会异步的监视整个系统的运行情况,包括各种调用信息。
节点角色说明:
• Provider: 暴露服务的服务提供方。
• Consumer: 调用远程服务的服务消费方。
• Registry: 服务注册与发现的注册中心。
• Monitor: 统计服务的调用次调和调用时间的监控中心。
• Container: 服务运行容器。
调用关系说明:
• 0. 服务容器负责启动,加载,运行服务提供者。
• 1. 服务提供者在启动时,向注册中心注册自己提供的服务。
• 2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
• 3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
• 4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
• 5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
dubbo使用:
在没有中间件dubbo之前,我们是以在配置文件中注入的方式来实现具体对象的注入的。即,具体对象的类及类名,如下。
<bean id="xxxService" class="com.xxx.XxxServiceImpl" />
<bean id="xxxAction" class="com.xxx.XxxAction">
<property name="xxxService" ref="xxxService" />
</bean>
在使用了dubbo之后,由于服务层与表示层分开了,独立成不一样的系统了,所以则需要在服务层的配置文件中注入,以及标明dubbo的引用。然后在表示层引用服务层注入的属性,然后在声明dubbo就可以了。这样两个系统之间就可以通信了。如下:
远程服务:
在本地服务的基础上,只需做简单配置,即可完成远程化:
将上面的local.xml配置拆分成两份,将服务定义部分放在服务提供方remote-provider.xml,将服务引用部分放在服务消费方remote-consumer.xml。
并在提供方增加暴露服务配置< dubbo:service>,在消费方增加引用服务配置< dubbo:reference>。
服务层发布服务:
<!-- 和本地服务一样实现远程服务 -->
<bean id="xxxService" class="com.xxx.XxxServiceImpl" />
<!-- 增加暴露远程服务配置 -->
<dubbo:service interface="com.xxx.XxxService" ref="xxxService" />
表现层调用服务:
<!-- 增加引用远程服务配置 -->
<dubbo:reference id="xxxService" interface="com.xxx.XxxService" />
<!-- 和本地服务一样使用远程服务 -->
<bean id="xxxAction" class="com.xxx.XxxAction">
<property name="xxxService" ref="xxxService" />
</bean>
注意:
1.dubbo作为系统间进行消息传递的中间件,需要引入依赖并在表示层和服务层配置,来实现表现层的系统和服务层的系统之间的通信。
2.dubbo推荐的服务注册中心用的是zookeeper。来负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小。
六、分页
pagehelper
在Mybatis的全局文件中配置SqlMapConfig.xml中配置拦截器插件:
<plugins>
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageHelper">
<!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库-->
<property name="dialect" value="mysql"/>
</plugin>
</plugins>
在代码中使用
1、设置分页信息:
//获取第1页,10条内容,默认查询总数count
PageHelper.startPage(1, 10);
//紧跟着的第一个select方法会被分页
List<Country> list = countryMapper.selectIf(1);
2、取分页信息第一种方法
//分页后,实际返回的结果list类型是Page<E>,如果想取出分页信息,需要强制转换为Page<E>,
Page<Country> listCountry = (Page<Country>)list;
listCountry.getTotal();
3、取分页信息的第二种方法,推荐使用第二种
//获取第1页,10条内容,默认查询总数count
PageHelper.startPage(1, 10);
List<Country> list = countryMapper.selectAll();
//用PageInfo对结果进行包装
PageInfo page = new PageInfo(list);
例:
//设置分页信息
PageHelper.startPage(page, rows);
//创建example对象,不用设置查询条件
TbItemExample example=new TbItemExample();
//根据mapper调用查询所有数据的方法
List<TbItem> list=mapper.selectByExample(example);
//获取分页信息
PageInfo<TbItem> info=new PageInfo<>(list);
七、git
git服务器的搭建(Linux环境下)
1.Git需要很多依赖环境:因此安装git需要先安装下列软件:
[root@xiaohuzi ~]# yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel gcc-c++
2.去github上下载相应的git的linux版本,然后利用Putty工具上传到虚拟机上
然后解压
上传:
F:/Xshell> pscp F:/git/git-2.22.0.tar.gz root@192.168.25.128: /
解压
tar -xvf git-2.22.0.tar.gz
3.安装命令:(进入git解压目录)
[root@xiaohuzi git-2.9.3]# make prefix=/usr/local all
[root@xiaohuzi git-2.9.3]# make prefix=/usr/local install
4.添加Linux的用户,用户名为git的用户:
[root@itcast-01 ~]# useradd git
设置git用户的密码
[root@xiaohuzi ~]# passwd git
切换到git用户
[root@xiaohuzi ~]# su - git
5.初始化仓库,仓库名为taotao.git:
[git@itcast-01 root]$ cd
[git@itcast-01 ~]$ git init –bare taotao.git
始化空的 Git 仓库于 /home/git/taotao.git/
至此仓库就创建好了。下面就可以把项目通过ip地址来传到仓库以及从仓库中下载项目。
项目右键,Team,share project,git
添加代码到git中,右键项目,team, add to index
右键项目,team,commit。上传到本地仓库。
右键项目,team,push上传到虚拟机的仓库
pull是拉项目下来。需要具体的ip地址。
第一次按照上面那样,后面检入检出如下图
注意:
Commit提交的作用是把代码提交到本地。
Push的作用是把本地的代码提交到远程的git服务器。