一.工程加入dubbo和zookeeper
1.dubbo是服务的中间件,可以提高我们表现层访问服务层的效率,zookeeper是它dubbo支持且推荐使用作为注册中心。
2.安装好zookeeper后,启动zookeeper即可
3.想要使用dubbo和zookeeper,只需要引入相关的jar即可,由于dubbo和zookeeper的作用对象都涉及消费者和提供者两者,所以在web和service都得引入dubbo和zookeeper的jar包.
4.引入dubbo的jar时,它会依赖spring和netty的jar包,我们要把这两个给排除掉不让其加入,避免与我们原先的spring冲突
<!-- dubbo相关 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <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> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> </dependency>
5.记得导入约束dubbo的约束文件,然后我们在web和service的springmvc.xml和applicationContext-service.xml添加dubbo相关的标签来调用服务和暴露服务
<!-- 使用dubbo发布服务 --> <!-- 提供方应用信息,用于计算依赖关系 --> <dubbo:application name="e3-manager" /> <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" /> <!-- 用dubbo协议在20880端口暴露服务 --> <dubbo:protocol name="dubbo" port="20880" /> <!-- 声明需要暴露的服务接口 --> <dubbo:service interface="cn.e3mall.service.ItemService" ref="itemServiceImpl"/>
<!-- 引用dubbo服务 --> <!-- 指代服务消费者的应用程序,name为程序名,可任意,最好跟工程名一致 --> <dubbo:application name="e3-manager-web"/> <!-- 指代注册中心,protocol指明哪个注册中心,address指代注册中心的ip地址 --> <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"/> <!-- 表示引用服务的标签,interface要调用的接口,id表示该标签 --> <dubbo:reference interface="cn.e3mall.service.ItemService" id="itemService" />
6.在启动web和manager工程前,由于是两个工程,需要两个tomcat来启动,还要在web中再配置tomcat插件
7.为pojo实现序列化接口,并重新安装到本地仓库,在重新启动工程
8.先启动manager后启动web,若控制台一直卡在某个地方,即没有异常抛出也没有说启动成功,可以在web或service下的resoures目录下添加log4j.properties
9.访问web工程的controller即可。
二.debug启动工程出现找不到源码问题的解决
解决办法如下:
》选择Debug Configurations
》选择对应工程类型,再挑选工程即可
三.设置发布服务的超时时间
<dubbo:service interface="cn.e3mall.service.ItemService" ref="itemServiceImpl" timeout="10000"/>
四.开启监控中心
》监控中心:是dubbo提供的jar(较早版本是web工程),用于监听消费者和提高者之间的交互信息
五.pageHelper的使用
》pageHelper是第三方提供的一个mabatis分页插件。由于我们是经常使用逆向工程里的statement,可官方提供的逆向工程代码并不支持分页的操作,这让我们很头疼,若想提取分页数据的话,又得自己手动去写sql语句了,想想很难受。所以呢有人就写了这个分页插件来解决我们面临的困境,实际这个插件本质是拦截器,在sql语句执行前,将它篡改成可以进行分页的sql罢了。下面讲如何使用:
1.在项目中引入对pageHelper的依赖
2.在sqlMapConfig.xml配置该拦截器,并指定数据库类型(pageHelper插件只支持一些数据库,但sqlServer是用不了的)
<plugins> <!-- 配置mabatis的拦截器 --> <plugin interceptor="com.github.pagehelper.PageHelper"> <!-- 设置数据库的类型 --> <property name="dialect" value="mysql"/> </plugin> </plugins>
3.配置完毕就书写代码测试了,测试的基本代码如下:
package cn.e3mall.service.impl; import java.util.List; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import cn.e3mall.mapper.TbItemMapper; import cn.e3mall.pojo.TbItem; import cn.e3mall.pojo.TbItemExample; public class TestPageHelper { @Test public void testPageHelper() { /** * 1.获取spring ioc * 2.获取mapper代理对象(指定对哪个mapper下的全部查询方法进行分页操作) * 3.在执行sql之前,设置分页参数信息 * 4.执行sql,得到已分页操作的数据 * 5.若想得到分页数据的具体信息,可创建pageInfo对象将分页数据作为参数传入 * */ ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-*.xml"); TbItemMapper itemMapper = ac.getBean(TbItemMapper.class); //设置当前页码和每页记录数 PageHelper.startPage(1, 10); TbItemExample tbItemExample = new TbItemExample(); List<TbItem> itemList = itemMapper.selectByExample(tbItemExample); PageInfo<TbItem> tbItemInfo = new PageInfo<>(itemList); System.out.println(tbItemInfo.getTotal()); } }
六.查询数据库列表警告问题
》使用pageHelper查询数据并返回到列表时,控制台可能会出现如下的警告:
》它的意思时找不到Page这个类,至于为什么说一下:
其实在startPage设置分页的参数后,调用查询方法得到其实是一个page对象,这个page本质是一个list
这就是为什么我们能把查询出来的list作为参数创建出pageInfo;那这个跟警告有啥关系呢?service层是需要把数据List返回给web层的,而web层并没有对PageHelper进行依赖,所以找不到Page这个类会有警告,不是异常的原因在于它page它的父类是arrayList,可以强制转为arrayList来使用
解决办法也很简单:在web依赖pageHelper即可