之前一直做spring boot框架,mybatis做持久层,mysql做数据库,搭建环境时,各种问题,不是数据库没连上,就是mapper文件未扫描成功,这次就着搭建dubbo项目,总结一下。
一、环境准备
1、下载好zookeeper,进入conf目录将zoo_sample.cfg改名为zoo.cfg,然后将其打开配置dataDir和dataLogDir,找个空文件就行了,例如:
dataDir=D:\\azookerpersstudy\\data dataLogDir=D:\\azookerpersstudy\\log
2、进入bin目录运行zkServer.cmd,启动成功后环境就好了,注意:搭建的项目能否运行成功的前提必须zookeeper处于启动状态,它相当于spring cloud中的eureka注册中心,我们的provider和custumer会在zookeeper上注册。
3、我们会创建三个项目,一个作为公共项目,提供基础,打成jar包install进本地仓库,供另两个项目provider和coustumer引入依赖。
二、公共项目操作
在idea中创建一个maven项目(不是spring项目),注意提供实体类和接口。
1、在bean层创建实体类,实体类会在服务之间调用,必须以流的形式,实现Serializable,同时生成set,get方法。
public class User implements Serializable { private int uid; private String uname; private String upwd; }
2、service层创建接口
public interface UserService { public String getUserNameByUid(int uid); }
三、内容提供者操作
1、在provider中调用数据库,所有需要引入mabatis和mysql依赖,同时为了调用实体类和接口需要引入公共组件,dubbo项目需要引入其依赖。当然还有web依赖,只展示dubbo组件依赖和公共组件依赖如下:
(1)公共组件依赖,是第一个项目中install到本地maven仓库的jar包。
<dependency> <groupId>cn.bdqn.doubbe-common</groupId> <artifactId>doubbe-common</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
(2)dubbo引入的是阿里的依赖
<dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>0.2.0</version> </dependency>
2、配置applicaion.properties文件
(1)dubbo的配置,protocol.port的端口与custumer一致,否则会报错,我就是在这儿错了半天。,同时注册中心的端口一定要与本地打开的zookeeper地址一致。
#项目端口 server.port=9780 #服务提供者所暴露的协议配置信息 dubbo.protocol.port = 20880 #项目名 dubbo.application.name=dubbo-provider #dubbo扫描的service层 dubbo.scan.base-packages=com.bdqn.doubbleuserprovider.service #dubbo在zookeeper的注册中心地址 dubbo.registry.address=zookeeper://127.0.0.1:2181
(2)mysql数据库配置,用户名,密码一定不要错了。
spring.datasource.url=jdbc:mysql://localhost:3306/insurance?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8 spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.jdbc.Driver
(3)配置.xml文件路径,这个路径用我们mybatis的xml必须一致,不配置会报Invalid bound statement (not found);
mybatis.mapper-locations=classpath:com/bdqn/doubbleuserprovider/mapper/*.xml
3、mapper的UserDao和UserMapper.xml配置
(1)UserDao的内容与公共组件中的Service的接口一致对应。
/** * 从数据库查询姓名 * @param uid * @return */ public String getUserNameByUid(@Param("uid") int uid);
(2)xml文件如下:namespace要与dao对应,相当于id值,该查询要有resultType,没有就报错了,我在这儿也踩了。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.bdqn.doubbleuserprovider.mapper.UserDao"> <select id="getUserNameByUid" resultType="String"> select uname from user where uid=#{uid}; </select> </mapper>
4、service层在provider中只写实现类就行了。
(1)@Component声明为组件。
(2)@Service注解来自dubbo,它的interfaceClass值表示来自哪个common接口。
@Component @Service(interfaceClass = UserService.class) public class UserServiceImpl implements UserService { @Autowired UserDao ud; @Override public String getUserNameByUid(int i) { return ud.getUserNameByUid(i); } }