本项目Gitee地址:https://gitee.com/bobokaka/pinyougou
项目依赖资料gitee地址:https://gitee.com/bobokaka/pinyougou-data
1.0 IT行业发展
近年来,IT行业发展趋向互联网化,传统项目(比如桌面应用)目前也就国企等单位有此需求。
互联网化趋向于视频、直播、金融、保险、医疗、房地产等等。
2.0 互联网特点
- 高并发访问(访问量大)
- 大数据量
3.0 互联网项目开发架构
- 前端页面必须美观、大气、上档次。
- 系统必须具有流畅的运行效果——必须对项目进行一系列优化。
- (1) 数据层优化
- 1> 数据库集群(主备,读写分离),分表、分库存储(大数据:500w'条即换表),开启索引、缓存,数据库设计优化,sql语句优化。
- 2> 缓存优化(把频繁读取数据,放入缓存,减轻数据库压力)
- 3> 搜索优化(使用专业的搜索工具进行搜索:solr等)
- (2) 项目层优化
- 1> 必须使用集群
- 2> 必须使用分布式
- 3> JVM:tomcat服务器优化
- (3) 应用层优化
- 1> 页面缓存
- 2> 页面静态化
- 3> nginx负载均衡(用来分发请求)
- 4> F5负载均衡
主备 nginx负载均衡:实现高可用。
4.0 b2bc类型电商项目——品优购。
- 把传统的项目拆分成面向服务分布式架构:SOA
- ssm框架分布式项目搭建
- 分布式项目测试通过
- 前端开发组件——angularJS——重前端轻后端——使运行速度更快
- 商品列表查询、添加、更新
- 商品相关的业务
- 首页广告内容加载——redis缓存
- 搜索——solr搜索
- 同步索引库(activeMQ消息中间件)
- 商品详情页静态化
- 发短信登录
- 单点登录(查收,spring security)
- 购物车
- 订单
- 微信支付
- 集群上线部署(zookeeper集群、redis集群、项目集群、solr集群、acitive集群、nginx集群)
- 集群
- docker容器部署
品优购是一个B2B2C平台,即有商家对商家,也有商家对个人。
采用商家入驻模式,商家入驻平台提交申请,平台进行资质审核、审核通过后,商家拥有独立的管理后台录入商品信息,商品经过平台审核后即可通过。
品优购网上商城主要分为网站前台、运营商后台、商家管理后台三个子系统。
4.1 网站前台
主要包括网站首页、商家首页、商品详细页、、搜索页、会员中心、订单与支付相关页面、
秒杀频道等。
4.2 运营商后台
是运营商的运营人员的管理后台。 主要包括商家审核、品牌管理、规格管理、模板管理、
商品分类管理、商品审核、广告类型管理、广告管理、订单查询、商家结算等。
4.3 商家管理后台
入驻的商家进行管理的后台,主要功能是对商品的管理以及订单查询统计、资金结算等功能。
5.0 系统架构
5.1 什么是SOA架构
SOA是service-Oriented Architecture的首字母简称,面向服务分布式架构。支持面向服务的框架样式。
5.2 什么叫面向服务
service就是服务,web就是服务消费者,web层面向service,即面向服务架构。
5.3 为什么使用SOA架构?
解决并发压力,大数据场景。
能够解决:
- 分担服务器压力
- 提高项目并发能力
- 提高访问速度
传统项目框架:
只有一个war包,所有业务集中一个项目中进行开发。
并发量:(5+-)
初步分布式部署:
- 项目和数据库进行拆分分布式
- 项目开发采用mvc框架开发
- 项目采用分层开发
并发量:(500+-)
缺点:
- 容错性差(不具有高可用性)
- 并发量不能满足互联网需求
所以,采用集群分布式部署。
集群方式部署:
- 项目采用集群部署
- 数据库采用集群部署
优点:
- 容错能力提高(具有高可用性)
- 并发能力提升
缺点:
- 并发能力不能满足需求(10w?)
- 请求分发问题。分发给哪个服务器
- seession如何共享?
- (1) tomcat集群session复制功能,把用户的身份信息直接广播给每一个集群服务器。——用户太多,无法实现
- (2) 第三方服务器,存储session
使用redis服务器存储用户身份信息。
6.0 实现SOA
6.1 思路
1. 把service拆分成一个单独的项目(war)
2. 把web拆分成一个单独项目(war)
web和service是远程调用关系,这个架构叫做面向服务架构。
6.2 实现远程调用技术
- webservice
- dubbox(dubbo)——轻量级的服务治理框架
- spring cloud——重量级服务治理框架
6.3 采用webservice实现面向服务分布式架构
优点:
- 并发能力提升(10w+-)
- 分布式项目采用集群部署(高可用性)
缺点:
- 网络抖动
- 进程繁忙
以上2种情况都会导致项目性能下降。
解决方案:
- 提升带宽(钱钱钱)
- 使用dubbox框架
6.4 使用dubbox进行面向服务分布式架构拆分
表现层:web项目(war)
dubbox服务治理中间件
- rpc 远程调用hessain2 二进制序列化
- nio 异步通讯 netty
服务层:service项目(war)
zookeep:第三方服务器,注册中心,存储对象。
7.0 数据库环境准备
下面开始项目的搭建。
项目搭建可分为3个步骤:
- 数据库环境
- 开发搭建zookeeper注册中心
- 搭建项目结构
表名称 | 含义 |
---|---|
tb_brand | 品牌 |
tb_specification | 规格 |
tb_specification_option | 规格选项 |
tb_type_template | 类型模板:用于关联品牌和规格 |
tb_item_cat | 商品分类 |
tb_seller | 商家 |
tb_goods | 商品 |
tb_goods_desc | 商品详情 |
tb_item | 商品明细 |
tb_content | 内容(广告) |
tb_content_category | 内容(广告)类型 |
tb_user | 用户 |
tb_order | 订单 |
tb_order_item | 订单明细 |
tb_pay_log | 支付日志 |
首先是数据库环境的准备。
数据库sql语句:https://gitee.com/bobokaka/pinyougou-data/blob/master/%E5%BB%BA%E5%BA%93%E8%AF%AD%E5%8F%A5/pinyougoudb.sql
品优购采用当前流行的前后端编程架构。
后端框架采用 Spring +SpringMVC+mybatis +Dubbox。前端采用 angularJS + Bootstrap。
8.0 zokepper安装
8.1 下载zookeeper
可参考如下链接:
Zookeeper本地安装配置(入门)https://blog.csdn.net/nangu0673/article/details/82587014
首先,下载一个zookeeper。
现在服务器大都是linux系统,配置安装教程如下:
zookeeper安装文档.docx
8.2 修改配置文件
解压后,进入目录中的conf目录,有一个zoo_sample.cfg文件,将其重命名为zoo.cfg,然后打开,在最后添加
dataDir=D:/acm/zookeeper-3.4.5/data
dataDirLog=D:/acm/zookeeper-3.4.5/log
完整的zoo.cfg文件配置:
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=D:/acm/zookeeper-3.4.5
# the port at which the clients will connect
clientPort=2181
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
dataDir=D:/acm/zookeeper-3.4.5/data
dataDirLog=D:/acm/zookeeper-3.4.5/log
将解压后的文件放到想要放的位置
8.3 启动zookeeper
进入bin目录双击zkServer.cmd即可开启zookeeper本地服务,当出现如图所示信息时,表示服务开启成功。
8.4 配置环境变量
新建系统变量变量名ZOOKEEPER_HOME,变量值D:/acm/zookeeper-3.4.5 【zooleeper安装/解压路径】
在path环境变量中添加 %ZOOKEEPER_HOME%\bin 以及 %ZOOKEEPER_HOME\conf
win+R输入cmd进入命令行窗口,输入zkServer回车,信息如图所示即为配置成功。
到此,配置完成。
9.0 项目结构
10.0 新建maven项目
10.1 设置eclipse后面的new菜单
建议参考如下设置:
最后的效果:
10.2 新建pyg-parent
父项目
新建一个maven project。
本项目所有maven项目创建都跳过框架模板。
这里我之前创建了一个项目pyg-html-utils ,后期会创建。此处可以忽略。
10.3 创建pyg-common
项目
因为和pyg-parent
父项目是继承而不是聚合,使用应该创建一个maven project,如果是聚合关系,就创建maven Module项目。
10.4 同样的步骤创建项目pyg-pojo
项目、pyg-dao
项目
到此,3个公共工程创建完毕。
10.5 创建后台聚合父工程
10.6 创建聚合后台的其他工程项目
同理,创建后台服务工程项目
到此,服务层搞定。
10.6 表现层
表现层(web层)调用服务层。
我们用两个表现层项目,一个是商家,一个是运营商。
new一个maven project,创建运营商表现层工程。。
同理,创建商家表现层工程。
至此,项目结构为(忽略pyg-html-utils):
11.0 完善pom.xml
在大型项目中,这一般由产品经理或者项目架构师完成,所以作为一般开发人员只需要复制粘贴即可。
11.1 父项目pyg-parent的pom.xml配置
4.0.0
com.pinyougou
pyg-parent
0.0.1-SNAPSHOT
pom
4.1
4.2.4.RELEASE
4.0.0
2.5
2.8.4
3.4.7
0.1
3.2.8
1.2.2
1.2.15
5.1.48
1.0.9
1.3.1
2.3.23
5.11.2
3.2.3.RELEASE
4.10.3
2012_u6
org.springframework
spring-context
${spring.version}
org.springframework
spring-beans
${spring.version}
org.springframework
spring-webmvc
${spring.version}
org.springframework
spring-jdbc
${spring.version}
org.springframework
spring-aspects
${spring.version}
org.springframework
spring-jms
${spring.version}
org.springframework
spring-context-support
${spring.version}
org.springframework
spring-test
${spring.version}
com.alibaba
dubbo
${dubbo.version}
org.apache.zookeeper
zookeeper
${zookeeper.version}
com.github.sgroschupf
zkclient
${zkclient.version}
junit
junit
4.9
com.alibaba
fastjson
1.2.28
javassist
javassist
3.11.0.GA
commons-codec
commons-codec
1.10
javax.servlet
servlet-api
2.5
provided
com.github.pagehelper
pagehelper
${pagehelper.version}
org.mybatis
mybatis
${mybatis.version}
org.mybatis
mybatis-spring
${mybatis.spring.version}
com.github.miemiedev
mybatis-paginator
${mybatis.paginator.version}
mysql
mysql-connector-java
${mysql.version}
com.alibaba
druid
${druid.version}
org.csource.fastdfs
fastdfs
1.2
commons-fileupload
commons-fileupload
${commons-fileupload.version}
redis.clients
jedis
2.8.1
org.springframework.data
spring-data-redis
1.7.2.RELEASE
org.freemarker
freemarker
${freemarker.version}
org.apache.activemq
activemq-all
${activemq.version}
org.springframework.security
spring-security-web
4.1.0.RELEASE
org.springframework.security
spring-security-config
4.1.0.RELEASE
com.github.penggle
kaptcha
2.3.2
javax.servlet
javax.servlet-api
org.springframework.security
spring-security-cas
4.1.0.RELEASE
org.jasig.cas.client
cas-client-core
3.3.3
org.slf4j
log4j-over-slf4j
org.apache.solr
solr-solrj
${solrj.version}
com.janeluo
ikanalyzer
${ik.version}
org.apache.httpcomponents
httpcore
4.4.4
org.apache.httpcomponents
httpclient
4.5.3
dom4j
dom4j
1.6.1
xml-apis
xml-apis
1.4.01
${project.artifactId}
org.apache.maven.plugins
maven-compiler-plugin
3.2
1.7
UTF-8
org.apache.tomcat.maven
tomcat7-maven-plugin
2.2
11.2 工具类pyg-common的pom文件配置
4.0.0
com.pinyougou
pyg-parent
0.0.1-SNAPSHOT
pyg-common
junit
junit
com.alibaba
fastjson
javassist
javassist
commons-codec
commons-codec
commons-fileupload
commons-fileupload
org.apache.httpcomponents
httpcore
org.apache.httpcomponents
httpclient
dom4j
dom4j
xml-apis
xml-apis
update maven后,可以看到依赖包都已经被maven自动导入:
11.3 dao层pyg-dao的pom文件配置
/pyg-dao/pom.xml
4.0.0
com.pinyougou
pyg-parent
0.0.1-SNAPSHOT
pyg-dao
org.mybatis
mybatis
org.mybatis
mybatis-spring
com.github.miemiedev
mybatis-paginator
com.github.pagehelper
pagehelper
mysql
mysql-connector-java
com.alibaba
druid
com.pinyougou
pyg-pojo
0.0.1-SNAPSHOT
com.pinyougou
pyg-common
0.0.1-SNAPSHOT
11.4 后台管理的聚合父工程pyg-manager的pom.xml配置
pyg-manager工程原则上不需要坐标依赖,但是它的聚合子工程需要。
4.0.0
com.pinyougou
pyg-parent
0.0.1-SNAPSHOT
pyg-manager
pom
pyg-manager-interface
pyg-manager-service
com.pinyougou
pyg-dao
0.0.1-SNAPSHOT
org.apache.tomcat.maven
tomcat7-maven-plugin
9000
/
10.5 pyg-manager-interface的pom.xml配置
不用配置。
/pyg-manager-interface/pom.xml
4.0.0
com.pinyougou
pyg-manager
0.0.1-SNAPSHOT
pyg-manager-interface
10.6 pyg-manager-service需要管理spring事务,配置pom.xml文件。
/pyg-manager-service/pom.xml
4.0.0
com.pinyougou
pyg-manager
0.0.1-SNAPSHOT
pyg-manager-service
war
org.springframework
spring-context
org.springframework
spring-beans
org.springframework
spring-webmvc
org.springframework
spring-jdbc
org.springframework
spring-aspects
org.springframework
spring-jms
org.springframework
spring-context-support
org.springframework
spring-test
com.alibaba
dubbo
org.apache.zookeeper
zookeeper
com.github.sgroschupf
zkclient
com.pinyougou
pyg-manager-interface
0.0.1-SNAPSHOT
org.apache.maven.plugins
maven-war-plugin
2.3
false
org.apache.maven.plugins
maven-war-plugin
2.3
false
11.7 运营商表现层pyg-manager-web的pom.xml
4.0.0
com.pinyougou
pyg-parent
0.0.1-SNAPSHOT
pyg-manager-web
war
org.springframework
spring-context
org.springframework
spring-beans
org.springframework
spring-webmvc
org.springframework
spring-jdbc
org.springframework
spring-aspects
org.springframework
spring-jms
org.springframework
spring-context-support
org.springframework
spring-test
com.alibaba
dubbo
org.apache.zookeeper
zookeeper
com.github.sgroschupf
zkclient
com.pinyougou
pyg-manager-interface
0.0.1-SNAPSHOT
javax.servlet
servlet-api
provided
11.8 商家表现层pyg-shop-web的pom.xml配置
商家表现层pyg-shop-web的配置和运营商表现层一模一样。
4.0.0
com.pinyougou
pyg-parent
0.0.1-SNAPSHOT
pyg-shop-web
war
org.springframework
spring-context
org.springframework
spring-beans
org.springframework
spring-webmvc
org.springframework
spring-jdbc
org.springframework
spring-aspects
org.springframework
spring-jms
org.springframework
spring-context-support
org.springframework
spring-test
com.alibaba
dubbo
org.apache.zookeeper
zookeeper
com.github.sgroschupf
zkclient
com.pinyougou
pyg-manager-interface
0.0.1-SNAPSHOT
javax.servlet
servlet-api
provided
12.0 Dao层
从Dao层开始,Dao层主要负责访问数据库。
12.1 添加数据源
/pyg-dao/src/main/resources/prop/db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/pinyougoudb?characterEncoding=utf-8
jdbc.username=root
jdbc.password=bywwcnll57
12.2 mybatis配置文件
/pyg-dao/src/main/resources/config/SqlMapConfig.xml
12.3 数据源工厂扫描接口的配置。
/pyg-dao/src/main/resources/spring/applicationContext-dao.xml
13.0 逆向工程生成接口
在12.3中
接口代理并不存在。我们可以通过反射来实现接口类生成。这时候需要mybatis generator的插件。
安装说明:
- 把plugins中的所有jar拷贝到eclipse的plugins文件夹之中
- 把features中的所有文件夹拷贝到eclipse的features文件夹之中
- 重启eclipse,ok
配置好后,重启eclipse。配置逆向工程配置文件/pyg-dao/src/main/resources/generatorConfig.xml
执行‘’蝙蝠“:
等待完成,打开pyg-dao,可见:
打开pyg-pojo,可见:
但是在我们的com.pyg.mapper目录下,只能编译.java的文件,xml配置文件无法编译执行,这时候需要调整一下:
在src/main/resources目录下新建com.pyg.mapper包目录,把xml文件移动到该目录下:
这种模式,也满足我们的接口代理开发。
14.0 服务层配置
14.1 service配置文件
pyg-manager-service项目负责管理事务,配置其配置文件:
/pyg-manager-service/src/main/resources/spring/applicationContext-service.xml
14.2 WEB-INF
/pyg-manager-service/src/main/webapp/WEB-INF/web.xml
contextConfigLocation
classpath*:spring/applicationContext*.xml
org.springframework.web.context.ContextLoaderListener
15.0 web工程pyg-manager-web
一些常量保存在application.properties文件中。目前为空。
/pyg-manager-web/src/main/resources/spring/springmvc.xml
WriteMapNullValue
WriteDateUseDateFormat
web.xml中配置编码过滤器、加载DispatcherServlet(前端控制器)、springmvc文件。
/pyg-manager-web/src/main/webapp/WEB-INF/web.xml
CharacterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
utf-8
forceEncoding
true
CharacterEncodingFilter
/*
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring/springmvc.xml
springmvc
/
16.0 web工程pyg-shop-web
同15.0 配置一样。
/pyg-shop-web/src/main/resources/config/application.properties为空。
/pyg-shop-web/src/main/resources/spring/springmvc.xml
WriteMapNullValue
WriteDateUseDateFormat
/pyg-shop-web/src/main/webapp/WEB-INF/web.xml
CharacterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
utf-8
forceEncoding
true
CharacterEncodingFilter
/*
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring/springmvc.xml
springmvc
/
17.0 集成测试
17.1 新建一个查询所有品牌的接口
/pyg-manager-interface/src/main/java/com/pyg/manager/service/BrandService.java
package com.pyg.manager.service;
import java.util.List;
import com.pyg.pojo.TbBrand;
/**
* 查询品牌的接口
*
* @author EdPeng
*
*/
public interface BrandService {
/**
* 查询所有的品牌数据
*/
public List findAll();
}
17.2 在service项目中实现该接口。
/pyg-manager-service/src/main/java/com/pyg/manager/service/impl/BrandServiceImpl.java
package com.pyg.manager.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import com.alibaba.dubbo.config.annotation.Service;
import com.pyg.manager.service.BrandService;
import com.pyg.mapper.TbBrandMapper;
import com.pyg.pojo.TbBrand;
import com.pyg.pojo.TbBrandExample;
//必须使用dubbo的@Service才能发布到zookeeper的注册中心里。
@Service
public class BrandServiceImpl implements BrandService{
// 注入mapper接口代理对象
@Autowired
private TbBrandMapper brandMapper;
@Override
public List findAll() {
//创建example对象
TbBrandExample example = new TbBrandExample();
// 查询所有
List list = brandMapper.selectByExample(example);
return list;
}
}
17.3 编写表现层代码
/pyg-manager-web/src/main/java/com/pyg/manager/controller/BrandController.java
package com.pyg.manager.controller;
import java.util.List;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.pyg.manager.service.BrandService;
import com.pyg.pojo.TbBrand;
//@RestController是@Controller和@ResponseBody的集合体
@RestController
public class BrandController {
// 注入远程服务的对象,alibaba.dubbo的注解来实现
@Reference
private BrandService brandService;
// 查询所有品牌数据
@RequestMapping("/finAll")
public List findAll() {
// 调用远程服务对象方法
List list = brandService.findAll();
return list;
}
}
为了执行项目,需要在pyg-manager-web工程中植入tomcat插件,修改pom.xml文件。
/pyg-manager-web/pom.xml
4.0.0
com.pinyougou
pyg-parent
0.0.1-SNAPSHOT
pyg-shop-web
war
…………
org.apache.maven.plugins
maven-war-plugin
2.3
false
org.apache.tomcat.maven
tomcat7-maven-plugin
8084
/
同时也修改好pyg-shop-web项目的pom.xml文件。
/pyg-shop-web/pom.xml
4.0.0
com.pinyougou
pyg-parent
0.0.1-SNAPSHOT
pyg-shop-web
war
…………
org.apache.maven.plugins
maven-war-plugin
2.3
false
org.apache.tomcat.maven
tomcat7-maven-plugin
8084
/
17.4 安装项目
首先是pyg-parent项目安装,没安装找不到包。
见下图,安装成功:
同样的方法,依次安装pyg-common、pyg-pojo、pyg-dao、pyg-manager、pyg-manager-web
如果没有出现BUILD SUCCESS
字样,并提示如下界面:
在window-Preferences-Java-Installed JREs中,设置:
勾选,保存,再一次运行maven install即可。
为了方便调试,载入log4j文件。
/pyg-manager-web/src/main/resources/log4j.properties
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c:/mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### set log levels - for more verbose logging change 'info' to 'debug' ###
log4j.rootLogger=debug, stdout
开启zookeeper。win+R键,输入cmd,再输入" zkServer
"
因为是第一次启动,并且在我们的pyg-manager-web配置了tomcat插件,使用通过如下操作启动该项目。
未完待续。
原因:没有服务器。