淘淘商城(4)

SSM框架整合

1.使用mysql数据库,要求5.5版本以上

2.Mybatis****:根据表结构,自动生成pojo和dao接口及映射文件

 ****自动生成代码

先把文件导入到工程里面,不是maven工程,选择Genaral

在反向生成里都生成什么内容?

根据数据库里面的表反向生成pojo(实体类bean)和dao,dao里面放mybatis中接口和映射文件

generatorConfig.xml文件

①既然是通过数据库中的表反向生成,首先配置数据库连接

淘淘商城(4)

②要将数据库中的表反向生成一个pojo,那么要告诉它,我要将pojo放在哪个包中

淘淘商城(4)

映射文件的位置

淘淘商城(4)

接口的位置

淘淘商城(4)

③逆向生成代码,只需要运行main方法就行了

淘淘商城(4)

淘淘商城(4)

控制台报错了,应该是mysql没启动,因为它是根据数据库中的表生成代码,没启数据库肯定是不行的

淘淘商城(4)

启动服务,再Run as,运行成功,刷新看一下。

淘淘商城(4)

淘淘商城(4)

淘淘商城(4)


pojo里面就是我们表中的实体类,dao里面有两部分,大把大把的接口和映射文件。

接口和映射文件放在一个包下,同时保证名称是一致的,这样可以使用包扫描机制,同时扫描。

既然Run as就能自动生成代码,如果再运行一次呢?

运行没有报警告,刷新文件也没有多生成出来包,看了下里面的代码行数也是没变化,为了以防后续出问题,我选择删了重新Run as一遍。

这些生成的代码,只是存在generatorSqlmap文件中,并没有存在Maven项目中,复制粘贴到对应包的src/main/java中,end

                                                搭建环境,整合项目

taotao-manager-interface里定义服务层的接口。taotao-manager-service再去实现这个接口。controller放在taotao-manager-web里面。

使用的是soa架构(面向服务对象的架构)分两层。

taotao-manager是一个服务层项目,访问数据库,产生数据为表现层服务。

taotao-manager-web是一个表现层的web项目,只和页面进行交互


Dao层:配置mtbatis相关的配置,数据库、数据源

mybatis虽然是dao层的配置,但是taotao-manager-dao最终被打成了jar包,可以将mybatis配置在service里面

淘淘商城(4)

淘淘商城(4)

数据文件db.properties

淘淘商城(4)

接下来是application-dao.xml。之前dao层需要依赖的jar包是mybatis,数据源,连接池

淘淘商城(4)

淘淘商城(4)

spring管理SqlSessionFactory,目的创建sqlsessionfactory(?)

扫描mybatis配置文件的方式有三种通过接口扫描,类扫描,包扫描。

通过包扫描的话,需要包里面的接口名和配置文件名需要保持一致

配置application-service.xml

淘淘商城(4)

exclude-filter:过滤掉controller

dubbo服务最后再写。

接下来是application-trans.xml

淘淘商城(4)

当前项目中的方法,以红框里的名字开头事务就会开启(增删改)。而下面的查询就不需要依赖事务,只读。

淘淘商城(4)

当前的方法作用于哪些包、类。淘淘商城(4)当前包下面的所有类(*)的方法(*)不管有没有参数(..)都会被匹配到事务规则。

taotao-manager-service里面的web.xml配置sping监听器为表现层做服务。

淘淘商城(4)

<context-param>指定sping的配置路径

编码集过滤器和前端控制器是处理前端请求应该放在taotao-manager-web中的web.xml中

淘淘商城(4)

淘淘商城(4)

spring开启一个父容器,springmvc开启子容器。当配置前端控制器的时候会默认开启一个子容器。

子容器能访问父容器的一部分bean,但是父容器不能访问子容器的bean。

所以,在子容器中只扫描controller,父容器扫描controller之外的其他注解

最后配置springmvc文件

淘淘商城(4)

淘淘商城(4)

ssm框架整合完毕

    系统间通讯

项目基于soa架构(面向服务的架构),分两个工程,表现层工程和服务层工程,所以要实现商品列表查询,就需要两个系统之间通讯。

我在这里使用的dubbo服务进行远程通讯,使用rpc协议进行远程调用,直接使用socket通信,传输效率高,并且可以统计系统之间的调用关系,调用次数。scoket(二进制方式进行传输)

淘淘商城(4)

ORM:关系对象模型;All in One,所有功能放在一个项目中,传统的web项目

网站流量小,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本

MVC:model、view、controller

当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。

此时,用于加速前端页面开发的 Web框架(MVC) 是关键。

RPC:

当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。

此时,用于提高业务复用及整合的 分布式服务框架(RPC) 是关键。

SOA:面向服务的架构

当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。

此时,用于提高机器利用率的 资源调度和治理中心(SOA) 是关键。

Dubbo是什么?

Dubbo就是资源调度和治理中心的管理工具

一款分布式服务框架

高性能和透明化的RPC远程服务调用方案

SOA服务的治理方案



           Doubbo的架构

淘淘商城(4)

Container: 服务运行容器

Provider: 暴露服务的服务提供方。

Consumer: 调用远程服务的服务消费方。

Registry: 服务注册与发现的注册中心。

Monitor: 统计服务的调用次调和调用时间的监控中心。


调用流程 
0.服务容器负责启动,加载,运行服务提供者。 
1.服务提供者在启动时,向注册中心注册自己提供的服务。 
2.服务消费者在启动时,向注册中心订阅自己所需的服务。 
3.注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。 
4.服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。 

5.服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心

Container:类似spring容器,在spring中运行

Provider:相当于项目中的服务层taotao-manager-service为web做服务

Registry:类似一个中介。。。

Consumer相当于项目中的taotao-manager-web

Monitor:监控器,消费者调用了服务几次,调用的时间


自己的理解:①服务提供方(可能不止一个)将所有拥有的服务告诉给(注册到)注册中心,

消费者告诉注册中心需要什么服务,去注册中心找这些服务③注册中心把提供方提供给自己的信息返回给消费者

④找到合适的信息后,直接去调用服务提供方的服务⑤一旁的监控器在默默地注视着这一切

                                    Dubbo使用方法

Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于SpringSchema扩展进行加载。

spring是一个容器,它里面可以承载各种服务,dubbo对于spring来说也是一种服务,可以在spring里配置

注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小,建议使用Zookeeper注册中心。

什么意思呢,也就是说启动服务之前必须要启动zookeeper工具,完成服务提供者和消费者与注册中心之间的交互

电脑配置不好的情况下,在Windows下安装就行了,可以不在Linux下安装。

安装步骤省略(很简单)。。。直接启动看效果吧。

找到zookeeper的目录,在dos命令中输入下面这两个文件名

淘淘商城(4)

启动前

淘淘商城(4)

启动后更新一下maven项目

淘淘商城(4)

                                        整合测试    

       需求:根据商品id查询商品信息,并将商品信息使用json数据返回。

    分析:

        请求的url/item/{itemId}

        参数:商品id,从请求的url中获得

        返回值:TbItem对象,****生成的pojo(响应json数据)

首先看下****生成的dao,找到根据商品id查询商品信息的接口
淘淘商城(4)
问题来了,为什么id的数据类型是Long?看下数据库中表的设计

淘淘商城(4)

可以看到id的类型是bigint,在mysql中如果类型是bigint要用Long类型对应

接下来开发Service层,Service分两层taotao-manager-interface接口 taotao-manager-service实现类

新建一个接口ItemService

淘淘商城(4)

接口建完之后,在taotao-manager-service实现

淘淘商城(4)

在这里加入@Service注解的作用就是自动注册到spring容器,成为spring容器中的bean

spring自动扫描com.qhit路径下的注解

淘淘商城(4)

将dao注入到service里面

淘淘商城(4)

然后就可以调用dao里的方法

淘淘商城(4)

接下来就是controller

将controller成为控制器加@Controller注解 

淘淘商城(4)

然后加service依赖

淘淘商城(4)

写方法

淘淘商城(4)

淘淘商城(4)

@ResponseBody注解:以json数据形式返回

在service中暴露dubbo接口,在web中引用接口

在taotao-manager-service中的application-service.xml配置dubbo

淘淘商城(4)

刚才已经开启了zookeeper,将我们的服务注册到注册中心,将taotao-manager注册到注册中心

淘淘商城(4)

协议是zookeeper,地址是127.0.0.1,端口号是2181

淘淘商城(4)

通过20880端口暴露接口(大于20000随便写)

淘淘商城(4)

以com.qhit.service.ItemService(ItemService)接口暴露itemServiceImpl服务,这就是服务提供方

已经在service中加了@Service注解,将服务注册spring容器里面了

名称根据类名小写当做服务名字,使用@Service注解时出现的一个bean

接下来看taotao-manager-web中的springmvc

淘淘商城(4)

id和controller里面的属性保持一致

淘淘商城(4)


服务方配好,web也配好了zookeeper注册中心也启动了。测试

报错。

淘淘商城(4)

淘淘商城(4)

淘淘商城(4)

同一处错误,找不到依赖的这个pagehelper jar包信息。

然后开始排错,很明显的错误,肯定是jar包问题。接下来我开始:

重新打一遍包install,clean后再install,没用

Update Maven:更新项目,没用

Dependency Hierarchy:看是不是jar包冲突了,并没有。

去pom文件里面看是不是缺少哪个项目依赖,并没有。

去本地仓库找到对应的jar包位置delete,并Update Maven触发自动下载缺少的jar包,没用。

重启eclipse试试,更新项目,没用。

之前并没有出过这个错误,即使有类似的,一会也就解决掉了。

淘淘商城(4)

电脑还卡的实在不行,改了N久都没用

好的,接下来怎么办,当然是洗洗睡了,要不等猝死呢。