【大型项目-电商平台】1.0 互联网以及电商行业分析、项目搭建及

2020-03-19  本文已影响0人  bobokaka

本项目Gitee地址:https://gitee.com/bobokaka/pinyougou
项目依赖资料gitee地址:https://gitee.com/bobokaka/pinyougou-data

1.0 IT行业发展

近年来,IT行业发展趋向互联网化,传统项目(比如桌面应用)目前也就国企等单位有此需求。
互联网化趋向于视频、直播、金融、保险、医疗、房地产等等。

2.0 互联网特点
  • 高并发访问(访问量大)
  • 大数据量
3.0 互联网项目开发架构
    1. 前端页面必须美观、大气、上档次。
    1. 系统必须具有流畅的运行效果——必须对项目进行一系列优化。
    • (1) 数据层优化
      • 1> 数据库集群(主备,读写分离),分表、分库存储(大数据:500w'条即换表),开启索引、缓存,数据库设计优化,sql语句优化。
      • 2> 缓存优化(把频繁读取数据,放入缓存,减轻数据库压力)
      • 3> 搜索优化(使用专业的搜索工具进行搜索:solr等)
    • (2) 项目层优化
      • 1> 必须使用集群
      • 2> 必须使用分布式
      • 3> JVM:tomcat服务器优化
    • (3) 应用层优化
      • 1> 页面缓存
      • 2> 页面静态化
      • 3> nginx负载均衡(用来分发请求)
      • 4> F5负载均衡

主备 nginx负载均衡:实现高可用。


image.png
4.0 b2bc类型电商项目——品优购。
  1. 把传统的项目拆分成面向服务分布式架构:SOA
  2. ssm框架分布式项目搭建
  3. 分布式项目测试通过
  4. 前端开发组件——angularJS——重前端轻后端——使运行速度更快
  5. 商品列表查询、添加、更新
  6. 商品相关的业务
  7. 首页广告内容加载——redis缓存
  8. 搜索——solr搜索
  9. 同步索引库(activeMQ消息中间件)
  10. 商品详情页静态化
  11. 发短信登录
  12. 单点登录(查收,spring security)
  13. 购物车
  14. 订单
  15. 微信支付
  16. 集群上线部署(zookeeper集群、redis集群、项目集群、solr集群、acitive集群、nginx集群)
  17. 集群
  18. docker容器部署

品优购是一个B2B2C平台,即有商家对商家,也有商家对个人。

采用商家入驻模式,商家入驻平台提交申请,平台进行资质审核、审核通过后,商家拥有独立的管理后台录入商品信息,商品经过平台审核后即可通过。

品优购网上商城主要分为网站前台、运营商后台、商家管理后台三个子系统。

4.1 网站前台

主要包括网站首页、商家首页、商品详细页、、搜索页、会员中心、订单与支付相关页面、
秒杀频道等。


image.png
4.2 运营商后台

是运营商的运营人员的管理后台。 主要包括商家审核、品牌管理、规格管理、模板管理、
商品分类管理、商品审核、广告类型管理、广告管理、订单查询、商家结算等。


image.png
4.3 商家管理后台

入驻的商家进行管理的后台,主要功能是对商品的管理以及订单查询统计、资金结算等功能。


image.png
5.0 系统架构
5.1 什么是SOA架构

SOA是service-Oriented Architecture的首字母简称,面向服务分布式架构。支持面向服务的框架样式。

5.2 什么叫面向服务

service就是服务,web就是服务消费者,web层面向service,即面向服务架构。

5.3 为什么使用SOA架构?

解决并发压力,大数据场景。
能够解决:

    1. 分担服务器压力
    1. 提高项目并发能力
    1. 提高访问速度

传统项目框架:
只有一个war包,所有业务集中一个项目中进行开发。
并发量:(5+-)

初步分布式部署:

    1. 项目和数据库进行拆分分布式
    1. 项目开发采用mvc框架开发
    1. 项目采用分层开发
      并发量:(500+-)

缺点:

    1. 容错性差(不具有高可用性)
    1. 并发量不能满足互联网需求
image.png

所以,采用集群分布式部署。

集群方式部署:

    1. 项目采用集群部署
    1. 数据库采用集群部署

优点:

    1. 容错能力提高(具有高可用性)
    1. 并发能力提升

缺点:

    1. 并发能力不能满足需求(10w?)
    1. 请求分发问题。分发给哪个服务器
    1. seession如何共享?
    • (1) tomcat集群session复制功能,把用户的身份信息直接广播给每一个集群服务器。——用户太多,无法实现
    • (2) 第三方服务器,存储session
      使用redis服务器存储用户身份信息。
image.png
6.0 实现SOA
6.1 思路
1. 把service拆分成一个单独的项目(war)
2. 把web拆分成一个单独项目(war)

web和service是远程调用关系,这个架构叫做面向服务架构。

6.2 实现远程调用技术
  1. webservice
  2. dubbox(dubbo)——轻量级的服务治理框架
  3. spring cloud——重量级服务治理框架
6.3 采用webservice实现面向服务分布式架构

优点:

  1. 并发能力提升(10w+-)
  2. 分布式项目采用集群部署(高可用性)

缺点:

  1. 网络抖动
  2. 进程繁忙
    以上2种情况都会导致项目性能下降。

解决方案:

  1. 提升带宽(钱钱钱)
  2. 使用dubbox框架
6.4 使用dubbox进行面向服务分布式架构拆分

表现层:web项目(war)
dubbox服务治理中间件

  1. rpc 远程调用hessain2 二进制序列化
  2. nio 异步通讯 netty
    服务层:service项目(war)

zookeep:第三方服务器,注册中心,存储对象。

image.png
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 支付日志

首先是数据库环境的准备。


image.png image.png

数据库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

将解压后的文件放到想要放的位置


image.png
8.3 启动zookeeper

进入bin目录双击zkServer.cmd即可开启zookeeper本地服务,当出现如图所示信息时,表示服务开启成功。


image.png
8.4 配置环境变量

新建系统变量变量名ZOOKEEPER_HOME,变量值D:/acm/zookeeper-3.4.5 【zooleeper安装/解压路径】

在path环境变量中添加 %ZOOKEEPER_HOME%\bin 以及 %ZOOKEEPER_HOME\conf

win+R输入cmd进入命令行窗口,输入zkServer回车,信息如图所示即为配置成功。


image.png

到此,配置完成。

9.0 项目结构
image.png
10.0 新建maven项目
10.1 设置eclipse后面的new菜单

建议参考如下设置:


image.png
image.png
image.png
image.png
image.png
image.png

最后的效果:


image.png
10.2 新建pyg-parent父项目

新建一个maven project。
本项目所有maven项目创建都跳过框架模板。


image.png image.png image.png

这里我之前创建了一个项目pyg-html-utils ,后期会创建。此处可以忽略。

10.3 创建pyg-common项目

因为和pyg-parent父项目是继承而不是聚合,使用应该创建一个maven project,如果是聚合关系,就创建maven Module项目。

image.png
image.png
image.png
10.4 同样的步骤创建项目pyg-pojo项目、pyg-dao项目
image.png

到此,3个公共工程创建完毕。

10.5 创建后台聚合父工程
image.png
10.6 创建聚合后台的其他工程项目
image.png
image.png
image.png
image.png

同理,创建后台服务工程项目


image.png
image.png
image.png
到此,服务层搞定。
10.6 表现层

表现层(web层)调用服务层。
我们用两个表现层项目,一个是商家,一个是运营商。
new一个maven project,创建运营商表现层工程。。


image.png

同理,创建商家表现层工程。


image.png

至此,项目结构为(忽略pyg-html-utils):


image.png
11.0 完善pom.xml

在大型项目中,这一般由产品经理或者项目架构师完成,所以作为一般开发人员只需要复制粘贴即可。

11.1 父项目pyg-parent的pom.xml配置
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.pinyougou</groupId>
  <artifactId>pyg-parent</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>
    
  <!-- 顶级父工程,不是用来提供坐标依赖的,仅仅是一个规范,一个模板 
       dependencyManagement标签:管理坐标,不提供依赖
                  作用主要是:锁定坐标的版本、锁定编译环境
                  公司里面有一套规范,需要按规范来,不要随便更改
                  其他项目需要什么坐标,从中拷贝什么坐标-->
  
    <!-- 集中定义依赖版本号 -->
    <properties>
        <junit.version>4.1</junit.version>
        <spring.version>4.2.4.RELEASE</spring.version>
        <pagehelper.version>4.0.0</pagehelper.version>
        <servlet-api.version>2.5</servlet-api.version>
        <dubbo.version>2.8.4</dubbo.version>
        <zookeeper.version>3.4.7</zookeeper.version>
        <zkclient.version>0.1</zkclient.version>        
        <mybatis.version>3.2.8</mybatis.version>
        <mybatis.spring.version>1.2.2</mybatis.spring.version>
        <mybatis.paginator.version>1.2.15</mybatis.paginator.version>
        <mysql.version>5.1.48</mysql.version>       
        <druid.version>1.0.9</druid.version>
        <commons-fileupload.version>1.3.1</commons-fileupload.version>
        <freemarker.version>2.3.23</freemarker.version>
        <activemq.version>5.11.2</activemq.version>
        <security.version>3.2.3.RELEASE</security.version>      
        <solrj.version>4.10.3</solrj.version>
        <ik.version>2012_u6</ik.version>        
    </properties>
    
    <dependencyManagement>
        <dependencies>  
        
            <!-- 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-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-jms</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context-support</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-test</artifactId>
                <version>${spring.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>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.9</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.28</version>
            </dependency>
            <dependency>
                <groupId>javassist</groupId>
                <artifactId>javassist</artifactId>
                <version>3.11.0.GA</version>
            </dependency>
            <dependency>
                <groupId>commons-codec</groupId>
                <artifactId>commons-codec</artifactId>
                <version>1.10</version>
            </dependency>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
                <version>2.5</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper</artifactId>
                <version>${pagehelper.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>   
                
            <!-- 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>       
            <dependency>
                <groupId>org.csource.fastdfs</groupId>
                <artifactId>fastdfs</artifactId>
                <version>1.2</version>
            </dependency>
            
            <!-- 文件上传组件 -->
            <dependency>
                <groupId>commons-fileupload</groupId>
                <artifactId>commons-fileupload</artifactId>
                <version>${commons-fileupload.version}</version>
            </dependency>
            
            <!-- 缓存 -->
            <dependency> 
              <groupId>redis.clients</groupId> 
              <artifactId>jedis</artifactId> 
              <version>2.8.1</version> 
            </dependency> 
            <dependency> 
              <groupId>org.springframework.data</groupId> 
              <artifactId>spring-data-redis</artifactId> 
              <version>1.7.2.RELEASE</version> 
            </dependency>       
            <dependency>
                <groupId>org.freemarker</groupId>
                <artifactId>freemarker</artifactId>
                <version>${freemarker.version}</version>
            </dependency>       
            <dependency>
                <groupId>org.apache.activemq</groupId>
                <artifactId>activemq-all</artifactId>
                <version>${activemq.version}</version>
            </dependency>
            
            <!-- 身份验证 -->
            <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-web</artifactId>
                <version>4.1.0.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-config</artifactId>
                <version>4.1.0.RELEASE</version>
            </dependency>       
            <dependency>
                <groupId>com.github.penggle</groupId>
                <artifactId>kaptcha</artifactId>
                <version>2.3.2</version>
                <exclusions>
                    <exclusion>
                        <groupId>javax.servlet</groupId>
                        <artifactId>javax.servlet-api</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>       
            <dependency>  
                <groupId>org.springframework.security</groupId>  
                <artifactId>spring-security-cas</artifactId>  
                <version>4.1.0.RELEASE</version>  
            </dependency>  
            <dependency>  
                <groupId>org.jasig.cas.client</groupId>  
                <artifactId>cas-client-core</artifactId>  
                <version>3.3.3</version>
                
                <!-- 排除log4j包冲突 -->  
                <exclusions>  
                    <exclusion>  
                        <groupId>org.slf4j</groupId>  
                        <artifactId>log4j-over-slf4j</artifactId>  
                    </exclusion>  
                </exclusions>  
            </dependency>
           
            <!-- solr客户端 -->
            <dependency>
                <groupId>org.apache.solr</groupId>
                <artifactId>solr-solrj</artifactId>
                <version>${solrj.version}</version>
            </dependency>
            <dependency>
        <!-- ik分词器 -->
            <groupId>com.janeluo</groupId>
                <artifactId>ikanalyzer</artifactId>
                <version>${ik.version}</version>
            </dependency>   
            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpcore</artifactId>
                <version>4.4.4</version>
            </dependency>       
            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient</artifactId>
                <version>4.5.3</version>
            </dependency>
            <dependency>
                <groupId>dom4j</groupId>
                <artifactId>dom4j</artifactId>
                <version>1.6.1</version>
            </dependency>       
            <dependency>  
                <groupId>xml-apis</groupId>  
                <artifactId>xml-apis</artifactId>  
                <version>1.4.01</version>  
            </dependency>       
        </dependencies> 
    
    </dependencyManagement>
    

    
    <build>
        <finalName>${project.artifactId}</finalName>
        
        <plugins>           
            <!-- java编译插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.2</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>

        </plugins>
        
        <pluginManagement>
            <plugins>
            <!-- 配置Tomcat插件 -->
                <plugin>
                    <groupId>org.apache.tomcat.maven</groupId>
                    <artifactId>tomcat7-maven-plugin</artifactId>
                    <version>2.2</version>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>
11.2 工具类pyg-common的pom文件配置
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.pinyougou</groupId>
        <artifactId>pyg-parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <!-- 删掉下面自动创建的两个标签,因为父工程中已经有了 -->
    <!-- <groupId>com.pinyougou</groupId> -->
    <artifactId>pyg-common</artifactId>
    <!-- <version>0.0.1-SNAPSHOT</version> -->

    <!-- 工具类工程: 1. 抽取公共坐标 2. 存放工具类 版本号不用写,被父工程锁定了 -->
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
        </dependency>
        <dependency>
            <groupId>javassist</groupId>
            <artifactId>javassist</artifactId>
        </dependency>
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
        </dependency>
        <!-- 文件上传组件 -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpcore</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
        </dependency>
        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
        </dependency>
        <dependency>
            <groupId>xml-apis</groupId>
            <artifactId>xml-apis</artifactId>
        </dependency>
    </dependencies>
</project>

update maven后,可以看到依赖包都已经被maven自动导入:


image.png
11.3 dao层pyg-dao的pom文件配置

/pyg-dao/pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.pinyougou</groupId>
        <artifactId>pyg-parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>pyg-dao</artifactId>

    <!-- dao持久层: 1. 访问数据库 2. mybatis 3. 数据源 4. 依赖pojo -->
    <dependencies>
        <!-- Mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
        </dependency>
        <dependency>
            <groupId>com.github.miemiedev</groupId>
            <artifactId>mybatis-paginator</artifactId>
        </dependency>
        <!-- 分页的坐标 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
        </dependency>
        <!-- MySql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!-- 连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
        </dependency>
        <!-- pojo -->
        <dependency>
            <groupId>com.pinyougou</groupId>
            <artifactId>pyg-pojo</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <!-- common -->
        <dependency>
            <groupId>com.pinyougou</groupId>
            <artifactId>pyg-common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>
11.4 后台管理的聚合父工程pyg-manager的pom.xml配置

pyg-manager工程原则上不需要坐标依赖,但是它的聚合子工程需要。

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.pinyougou</groupId>
        <artifactId>pyg-parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>pyg-manager</artifactId>
    <packaging>pom</packaging>
    <modules>
        <module>pyg-manager-interface</module>
        <module>pyg-manager-service</module>
    </modules>

    <!-- 后台管理聚合父工程、 1.抽取子工程公共坐标 2.聚合管理子工程(统一打包,统一部署,统一启动) 父工程中配置tomcat插件(服务层从9000开始是端口) -->

    <dependencies>
        <dependency>
            <groupId>com.pinyougou</groupId>
            <artifactId>pyg-dao</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>
    
    <!-- 配置tomcat插件 -->
    <!-- build:配置插件标签 -->
    <build>
        <plugins>
            <!-- 配置Tomcat插件 -->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
<!--                <version>2.2</version> -->
                <configuration>
                <!-- 服务启动端口:从9000开始 -->
                <port>9000</port>
                <!-- /把项目发布tomcat服务器ROOT目录下 -->
                <path>/</path>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>
10.5 pyg-manager-interface的pom.xml配置

不用配置。
/pyg-manager-interface/pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.pinyougou</groupId>
    <artifactId>pyg-manager</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>pyg-manager-interface</artifactId>
</project>
10.6 pyg-manager-service需要管理spring事务,配置pom.xml文件。

/pyg-manager-service/pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.pinyougou</groupId>
        <artifactId>pyg-manager</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>pyg-manager-service</artifactId>
    <packaging>war</packaging>

    <!-- service需要 1. spring 2. dao 3. pojo 4. common 5. 发布服务:dubbo和zookeeper -->

    <dependencies>
        <!-- Spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
        </dependency>

        <!-- dubbo相关 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
        </dependency>
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
        </dependency>
        <!-- 依赖服务端接口 -->
        <dependency>
            <groupId>com.pinyougou</groupId>
            <artifactId>pyg-manager-interface</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
11.7 运营商表现层pyg-manager-web的pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.pinyougou</groupId>
        <artifactId>pyg-parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>pyg-manager-web</artifactId>
    <packaging>war</packaging>

    <!-- 运营商表现层: 1.servlet 2. 服务接口 3.spring 4. 引入服务:dubbo,zookeeper -->
    <dependencies>
        <!-- Spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
        </dependency>

        <!-- dubbo相关 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
        </dependency>
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
        </dependency>

        <dependency>
            <groupId>com.pinyougou</groupId>
            <artifactId>pyg-manager-interface</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <scope>provided</scope>
        </dependency>
    </dependencies>

</project>
11.8 商家表现层pyg-shop-web的pom.xml配置

商家表现层pyg-shop-web的配置和运营商表现层一模一样。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.pinyougou</groupId>
    <artifactId>pyg-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>pyg-shop-web</artifactId>
  <packaging>war</packaging>
  
    <!-- 商家表现层: 1.servlet 2. 服务接口 3.spring 4. 引入服务:dubbo,zookeeper -->
    <dependencies>
        <!-- Spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
        </dependency>

        <!-- dubbo相关 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
        </dependency>
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
        </dependency>

        <dependency>
            <groupId>com.pinyougou</groupId>
            <artifactId>pyg-manager-interface</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</project>
12.0 Dao层

从Dao层开始,Dao层主要负责访问数据库。

12.1 添加数据源
image.png

/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

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <plugins>
        <!-- com.github.pagehelper 为 PageHelper 类所在包名 -->
        <plugin interceptor="com.github.pagehelper.PageHelper">
            <!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL 六种数据库-->
            <property name="dialect" value="mysql"/>
        </plugin>
    </plugins>
</configuration>
12.3 数据源工厂扫描接口的配置。

/pyg-dao/src/main/resources/spring/applicationContext-dao.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd 
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

    <!-- 数据库连接池 -->
    <!-- 加载配置文件  prop下面所有的properties -->
    <context:property-placeholder
        location="classpath*:prop/*.properties" />
    <!-- 数据库连接池 
    数据源使用阿里巴巴的DruidDataSource-->
    <bean id="dataSource"
        class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="maxActive" value="10" />
        <property name="minIdle" value="5" />
    </bean>

    <!-- 让spring管理sqlsessionfactory 使用mybatis和spring整合包中的 -->
    <bean id="sqlSessionFactory"
        class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 数据库连接池 -->
        <property name="dataSource" ref="dataSource" />
        <!-- 加载mybatis的全局配置文件 -->
        <property name="configLocation"
            value="classpath:config/SqlMapConfig.xml" />
            <!-- 定义别名 -->
            <property name="typeAliasesPackage" value="com.pyg.pojo"></property>
    </bean>
    <!-- 接口代理开发的扫描配置 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.pyg.mapper" />
    </bean>
</beans>
13.0 逆向工程生成接口

在12.3中

    <!-- 接口代理开发的扫描配置 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.pyg.mapper" />
    </bean>

接口代理并不存在。我们可以通过反射来实现接口类生成。这时候需要mybatis generator的插件。


image.png

安装说明:

    1. 把plugins中的所有jar拷贝到eclipse的plugins文件夹之中
    1. 把features中的所有文件夹拷贝到eclipse的features文件夹之中
    1. 重启eclipse,ok

配置好后,重启eclipse。配置逆向工程配置文件/pyg-dao/src/main/resources/generatorConfig.xml


image.png
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
  PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
  "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
    <!-- classPathEntry:数据库的JDBC驱动的jar包地址 -->
    <classPathEntry
        location="F:\workspace\pyg-workspace\pyg-dao\src\main\resources\lib\mysql-connector-java-5.1.28-bin.jar" />


    <context id="caigouTables" targetRuntime="MyBatis3">
        <commentGenerator>
            <!-- 是否去除自动生成的注释 true:是 : false:否 -->
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        <!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
            connectionURL="jdbc:mysql://localhost:3306/pinyougoudb" userId="root"
            password="bywwcnll57">
        </jdbcConnection>
        <!-- <jdbcConnection driverClass="oracle.jdbc.OracleDriver" -->
        <!-- connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:yycg" -->
        <!-- userId="yycg" -->
        <!-- password="yycg"> -->
        <!-- </jdbcConnection> -->

        <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer true,把JDBC DECIMAL 和 
            NUMERIC 类型解析为java.math.BigDecimal -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

        <!-- targetProject:生成PO类的位置 -->
        <javaModelGenerator targetPackage="com.pyg.pojo"
            targetProject="pyg-pojo">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="true" />
            <!-- 从数据库返回的值被清理前后的空格 -->
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <!-- targetProject:自动mapper的位置 -->
        <sqlMapGenerator targetPackage="com.pyg.mapper"
            targetProject="pyg-dao">
            <property name="enableSubPackages" value="false" />
        </sqlMapGenerator>

        <javaClientGenerator type="XMLMAPPER" 
            targetPackage="com.pyg.mapper" implementationPackage="com.pyg.mapper"
            targetProject="pyg-dao">
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>


        <!-- 指定数据库表 -->
        <table schema="" tableName="tb_user"></table>
        <table schema="" tableName="tb_content"></table>
        <table schema="" tableName="tb_content_category"></table>
        <table schema="" tableName="tb_item"></table>
        <table schema="" tableName="tb_item_cat"></table>
        <table schema="" tableName="tb_order"></table>
        <table schema="" tableName="tb_order_item"></table>
        <table schema="" tableName="tb_address"></table>
        <table schema="" tableName="tb_areas"></table>
        <table schema="" tableName="tb_brand"></table>
        <table schema="" tableName="tb_provinces"></table>
        <table schema="" tableName="tb_cities"></table>
        <table schema="" tableName="tb_seller"></table>
        <table schema="" tableName="tb_freight_template"></table>
        <table schema="" tableName="tb_specification"></table>
        <table schema="" tableName="tb_specification_option"></table>
        <table schema="" tableName="tb_type_template"></table>
        <table schema="" tableName="tb_goods"></table>
        <table schema="" tableName="tb_goods_desc"></table>
        <table schema="" tableName="tb_pay_log"></table>
    </context>
</generatorConfiguration>

执行‘’蝙蝠“:

image.png

等待完成,打开pyg-dao,可见:


image.png

打开pyg-pojo,可见:


image.png

但是在我们的com.pyg.mapper目录下,只能编译.java的文件,xml配置文件无法编译执行,这时候需要调整一下:

在src/main/resources目录下新建com.pyg.mapper包目录,把xml文件移动到该目录下:


image.png

这种模式,也满足我们的接口代理开发。

14.0 服务层配置
14.1 service配置文件

pyg-manager-service项目负责管理事务,配置其配置文件:


image.png

/pyg-manager-service/src/main/resources/spring/applicationContext-service.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 指定dubbo发布服务端口 -->
    <dubbo:protocol name="dubbo" port="20881"></dubbo:protocol>
    <!-- 指定服务名称 -->
    <dubbo:application name="pyg-manager-service" />
    <!-- 指定服务注册中心地址 -->
    <dubbo:registry
        address="zookeeper://127.0.0.1:2181" />
    <!-- 注解的方式发布服务(dubbo:annotation) -->
    <dubbo:annotation
        package="com.pyg.manager.service.impl" />

</beans>
14.2 WEB-INF

/pyg-manager-service/src/main/webapp/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    version="2.5">  
    
    <!-- 加载spring容器 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
<!--        classpath*:加载两个src目录下的applicationContext-service.xml -->
        <param-value>classpath*:spring/applicationContext*.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
    
</web-app>
15.0 web工程pyg-manager-web
image.png

一些常量保存在application.properties文件中。目前为空。
/pyg-manager-web/src/main/resources/spring/springmvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <context:property-placeholder
        location="classpath:config/application.properties" />

    <!-- 转换json格式做支持的注解驱动 -->
    <mvc:annotation-driven>
        <mvc:message-converters
            register-defaults="true">
            <bean
                class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <property name="supportedMediaTypes"
                    value="application/json" />
                <property name="features">
                    <array>
                        <value>WriteMapNullValue</value>
                        <value>WriteDateUseDateFormat</value>
                    </array>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

    <!-- 放行静态资源 -->
    <mvc:default-servlet-handler/>
    
    <!-- 引用dubbo 服务 -->
    <dubbo:application name="pinyougou-manager-web" />
    <!-- 指定服务注册中心地址 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />
    <!-- 注解的方式引入服务(dubbo:annotation) -->
    <dubbo:annotation
        package="com.pyg.manager.controller" />

</beans>

web.xml中配置编码过滤器、加载DispatcherServlet(前端控制器)、springmvc文件。

/pyg-manager-web/src/main/webapp/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    version="2.5">
    <!-- 解决post乱码 -->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/springmvc.xml</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <!-- 此处采用斜杠,则需要在springmvc.xml文件中放心静态资源 -->
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>
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

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <context:property-placeholder
        location="classpath:config/application.properties" />

    <!-- 转换json格式做支持的注解驱动 -->
    <mvc:annotation-driven>
        <mvc:message-converters
            register-defaults="true">
            <bean
                class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <property name="supportedMediaTypes"
                    value="application/json" />
                <property name="features">
                    <array>
                        <value>WriteMapNullValue</value>
                        <value>WriteDateUseDateFormat</value>
                    </array>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

    <!-- 放行静态资源 -->
    <mvc:default-servlet-handler/>
    
    <!-- 引用dubbo 服务 -->
    <dubbo:application name="pinyougou-shop-web" />
    <!-- 指定服务注册中心地址 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />
    <!-- 注解的方式引入服务(dubbo:annotation) -->
    <dubbo:annotation
        package="com.pyg.shop.controller" />

</beans>

/pyg-shop-web/src/main/webapp/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    version="2.5">
    <!-- 解决post乱码 -->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/springmvc.xml</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <!-- 此处采用斜杠,则需要在springmvc.xml文件中放心静态资源 -->
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>
17.0 集成测试
17.1 新建一个查询所有品牌的接口
image.png

/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<TbBrand> findAll();

}
17.2 在service项目中实现该接口。
image.png

/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<TbBrand> findAll() {
        //创建example对象
        TbBrandExample example = new TbBrandExample();
        // 查询所有
        List<TbBrand> list = brandMapper.selectByExample(example);
        return list;
    }

}
17.3 编写表现层代码
image.png

/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<TbBrand> findAll() {
        // 调用远程服务对象方法
        List<TbBrand> list = brandService.findAll();

        return list;
    }
}

为了执行项目,需要在pyg-manager-web工程中植入tomcat插件,修改pom.xml文件。
/pyg-manager-web/pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.pinyougou</groupId>
        <artifactId>pyg-parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>pyg-shop-web</artifactId>
    <packaging>war</packaging>

    <!-- 商家表现层: 1.servlet 2. 服务接口 3.spring 4. 引入服务:dubbo,zookeeper -->

        …………

    <!-- build:配置插件标签 -->
    <!-- 解决<packaging>war</packaging>报错的bug -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>

            <!-- 配置Tomcat插件 -->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <!-- <version>2.2</version> -->
                <configuration>
                    <!-- 前台启动端口:从8084开始 -->
                    <port>8084</port>
                    <!-- /把项目发布tomcat服务器ROOT目录下 -->
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

同时也修改好pyg-shop-web项目的pom.xml文件。
/pyg-shop-web/pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.pinyougou</groupId>
        <artifactId>pyg-parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>pyg-shop-web</artifactId>
    <packaging>war</packaging>

    <!-- 商家表现层: 1.servlet 2. 服务接口 3.spring 4. 引入服务:dubbo,zookeeper -->

        …………

    <!-- build:配置插件标签 -->
    <!-- 解决<packaging>war</packaging>报错的bug -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>

            <!-- 配置Tomcat插件 -->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <!-- <version>2.2</version> -->
                <configuration>
                    <!-- 前台启动端口:从8084开始 -->
                    <port>8084</port>
                    <!-- /把项目发布tomcat服务器ROOT目录下 -->
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
17.4 安装项目

首先是pyg-parent项目安装,没安装找不到包。


image.png

见下图,安装成功:


image.png

同样的方法,依次安装pyg-common、pyg-pojo、pyg-dao、pyg-manager、pyg-manager-web
如果没有出现BUILD SUCCESS字样,并提示如下界面:

image.png
在window-Preferences-Java-Installed JREs中,设置:
image.png
image.png
image.png
勾选,保存,再一次运行maven install即可。

为了方便调试,载入log4j文件。


image.png

/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插件,使用通过如下操作启动该项目。

image.png

未完待续。
原因:没有服务器。

上一篇下一篇

猜你喜欢

热点阅读