另附dubbo-admin资源:https://download.csdn.net/download/qq_34598667/12274615
02_SSM整合测试与系统间通信(Dubbo)
1.整合测试
1.1 需求
- 根据商品id查询商品的信息,并将商品的信息使用json数据返回(只做测试,不需要页面)
1.2 分析设计
- 请求url:/item/selectByKey/{itemId}
- 参数:商品id(主键),从请求的url获取
- 返回值:TbItem对象
1.3 Controller
- 先在_web下添加依赖, _interface和pojo的依赖
- 在_web项目下ItemController
1.4 service业务层
-
_interface中创建接口
-
在_service实现ItemService接口
-
先添加依赖
-
实现方法
-
1.5 Dao层
- 使用逆向工程
1.6 启动测试
-
先启动manager,再启动web
-
因为manager和web是不同的工程,spring容器都是独立,从web工程注入service,但是service对象在manager工程中的spring容器中–系统间的通信
2.系统间通信与Dubbo
1.2 分析
- 由于商城项目是基于SOA架构的,表现层和服务层是不同的工程,所以要实现两个系统之间的通信才能完成项目的运行
- 如何实现?
- WebService:效率不高(基于SOAP协议)。项目中不推荐使用
- 使用restful形式的服务:http+json,很多项目中用,如果服务过多,调用的关系会比较混乱
- 工作时肯定会调用接口(其他项目的接口–web层提供给我们访问入口(路径),标注上需要的参数和返回值),
- 使用dubbo。直接使用rpc进行远程调用,使用socket进行通信,效率比较高,可以计算出系统之间的调用关系和次数(服务治理)。
1.3 什么是Dubbo(了解)?
-
互联网发展中,网站应用的规模越来越大,常规的垂直架构已经无法应对了(并发量再增加),分布式架构以及流动计算机构肯定会占据较大的使用量,需要一个治理系统确保架构的演进
-
Dubbo实际上就是资源调度和治理中心的管理工具
-
是一款分布式服务架构
-
支持SOA的服务治理方案
- 单一应用架构:网站流量较小
- 垂直应用架构:将应用拆分互不相干的几个应用(系统之间没有通信,各做各的)
- 分布式服务架构:垂直应用越来越多,应用工程之间是肯定会进行通信的
- 流动计算架构:服务越来越多,小服务资源的浪费问题逐渐显现,需要增加一个调用中心来实时管理集群容量,提高利用率(SOA)
- Dubbo资源调度和治理中心的管理工具
-
1.4 Dubbo的架构(重要)
-
结构图
- Container:服务运行容器
- Provider:暴露服务的提供方
- Register:服务注册与发现的注册中心
- Consumer:调用远程服务的消费方
- Monitor:监控中心
- 统计服务调用的次数和调用时间
-
运行过程
- 服务容器负责启动,加载,运行服务的提供者
- 服务容器启动时,向注册中心注册自己的提供的服务(service)
- 在启动时,向注册中心订阅自己需要的服务(web)
- 注册中心可以返回服务提供者地址给消费者(service提供服务的地址:ip,端口号,服务名称)
- 消费者(web)会根据注册中心返回的地址去调用提供者的服务(service)
- 每一次调用的数据都会被监控中心统计
1.5 注册中心
-
服务提供者和消费者只在启动时才会跟注册中心进行交互
-
建议使用zookeeper作为注册中心
-
下载:http://archive.apache.org/dist/zookeeper/
-
使用(win)
-
先在目录内创建一个data目录
-
进入conf,把zoo_sample.cfg文件复制并重命名为zoo.cfg(zookeeper启动时默认加载的文件名)
-
修改zoo.cfg文件,把dataDir的路径改为刚才创建的data的路径
-
启动:进入到bin,点击zkServer.cmd进行启动注册中心
- 点击zkCli.cmd查看是否启动成功
- 第一次启动的时候测试一下,只要第一次没有问题,后面基本不会出错
- 点击zkCli.cmd查看是否启动成功
-
1.6 dubbo监控中心
-
dubbo-admin来直接启动
-
下载:
-
修改需要监控的注册中心的地址
-
打开properties进行修改
-
把项目打包,运行
-
进入到目录内,直接在地址栏输出cmd
-
找到打包之后的jar包
-
运行jar包。运行其中的main方法
java -jar dubbo-admin-0.1.jar
-
浏览器方法:localhost:8090
-
-
-
3.配置dubbo
先在parent中的zookeeperjar包改成3.4.14(不改也可以)
3.1 Service中配置一下
-
先在_service中添加依赖
<!--dubbo--> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <!--dubbo本身跟spring有冲突,配置自动解决冲突--> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> </exclusion> <exclusion> <groupId>org.jboss.netty</groupId> <artifactId>netty</artifactId> </exclusion> </exclusions> </dependency> <!--注册中心--> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> </dependency> <!--zklicent--> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency>
-
在spring容器中向注册中心注册服务
<?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:context="http://www.springframework.org/schema/context" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <context:component-scan base-package="com.dream.service"/> <!--向注册中心注册服务--> <!--提供者应用名称--> <dubbo:application name="dream_manager"/> <!--注册中心的地址--> <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"/> <!--用dubbo协议在20880端口暴露服务--> <dubbo:protocol name="dubbo" port="20880"/> <!-- 声明需要暴露的服务接口 相当于一个bean,给这个bean注入值,通过ref来注入对象 ref="itemServiceImpl"把实现类的bean注入进来 --> <dubbo:service interface="com.dream.service.ItemService" ref="itemServiceImpl"/> </beans>
-
到监控中心中查看服务
3.2 在web中从注册中心调用服务
-
给web添加依赖(同上)
-
在spring容器中来调用服务
<!--加上一个ItemService的bean,从manager系统中调用--> <dubbo:application name="dream_manaegr_web"/> <!--注册中心的地址--> <dubbo:registry address="zookeeper://127.0.0.1:2181" register=""/> <!--调用服务 interface="com.dream.service.ItemService" 调用的接口 会把服务的接口的bean 注入到spring容器中,给bean设置id 是id="itemService" 在controller中注入对象时,使用这个id进行注入 --> <dubbo:reference interface="com.dream.service.ItemService" id="itemService"/>
-
启动_web项目
-
测试报500错误
-
MyBatis中使用SqlSession来执行创建statement来执行sql,mapper中的每一个sql标签语句都是一个statement,这里说statament not found 说明要么mapper.xml中的statement的id和mapper接口中的方法名称不一样(逆向生成的,肯定一样),说明就是mapper.xml没有被加载到
-
在dao的pom.xml中
<!--默认只会扫描源目录下的【配置文件,设置java下的也扫描--> <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> <include>**/*.properties</include> </includes> <filtering>false</filtering> </resource> </resources> </build>
-
-
重新测试
.xml</include> <include>**/*.properties</include> </includes> <filtering>false</filtering> </resource> </resources> </build>
-
重新测试