之前一直做spring boot框架,mybatis做持久层,mysql做数据库,搭建环境时,各种问题,不是数据库没连上,就是mapper文件未扫描成功,这次就着搭建dubbo项目,总结一下。
一、环境准备
1、下载好zookeeper,进入conf目录将zoo_sample.cfg改名为zoo.cfg,然后将其打开配置dataDir和dataLogDir,找个空文件就行了,例如:
代码语言:javascript复制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方法。
代码语言:javascript复制public class User implements Serializable {
private int uid;
private String uname;
private String upwd;
}
2、service层创建接口
代码语言:javascript复制public interface UserService {
public String getUserNameByUid(int uid);
}
三、内容提供者操作
1、在provider中调用数据库,所有需要引入mabatis和mysql依赖,同时为了调用实体类和接口需要引入公共组件,dubbo项目需要引入其依赖。当然还有web依赖,只展示dubbo组件依赖和公共组件依赖如下:
(1)公共组件依赖,是第一个项目中install到本地maven仓库的jar包。
代码语言:javascript复制 <dependency>
<groupId>cn.bdqn.doubbe-common</groupId>
<artifactId>doubbe-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
(2)dubbo引入的是阿里的依赖
代码语言:javascript复制 <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地址一致。
代码语言:javascript复制#项目端口
server.port=
#服务提供者所暴露的协议配置信息
dubbo.protocol.port =
#项目名
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数据库配置,用户名,密码一定不要错了。
代码语言:javascript复制spring.datasource.url=jdbc:mysql://localhost:3306/insurance?serverTimezone=GMT+8&useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
(3)配置.xml文件路径,这个路径用我们mybatis的xml必须一致,不配置会报Invalid bound statement (not found);
代码语言:javascript复制mybatis.mapper-locations=classpath:com/bdqn/doubbleuserprovider/mapper/*.xml
3、mapper的UserDao和UserMapper.xml配置
(1)UserDao的内容与公共组件中的Service的接口一致对应。
代码语言:javascript复制 /**
* 从数据库查询姓名
* @param uid
* @return
*/
public String getUserNameByUid(@Param("uid") int uid);
(2)xml文件如下:namespace要与dao对应,相当于id值,该查询要有resultType,没有就报错了,我在这儿也踩了。
代码语言:javascript复制<?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接口。
代码语言:javascript复制@Component
@Service(interfaceClass = UserService.class)
public class UserServiceImpl implements UserService {
@Autowired
UserDao ud;
@Override
public String getUserNameByUid(int i) {
return ud.getUserNameByUid(i);
}
}
5、在启动类上加注解
(1)@SpringBootApplication 启动类注解
(2)@EnableDubbo dubbo注解
(3)@MapperScan("com.bdqn.doubbleuserprovider.mapper")该注解指向mapper包,没有或者错误会报:我也是踩了。
代码语言:javascript复制//Field ud in com.bdqn.doubbleuserprovider.service.UserServiceImpl
// required a bean of type 'com.bdqn.doubbleuserprovider.mapper.UserDao' that could not be found.
6、在pom文件中,还需要进一步的配置,在build内部加资源配置:
代码语言:javascript复制 <resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.html</include>
<include>**/*</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
否则会报下面错误:
Invalid bound statement (not found):
三、消费者操作
1、由于消费者不需要操作数据库,所有只需要引入dubbo,web和公共组件即可。与provider的依赖一致。
2、配置文件application.properties中,这次扫描service中的实现类,因为在其中使用@Reference引用服务。
代码语言:javascript复制server.port=
dubbo.protocol.port =
dubbo.application.name=dubbo-consumer
dubbo.scan.base-packages=com.bdqn.mycustomer.service.impl
dubbo.registry.address=zookeeper://127.0.0.1:2181
3、在service层中,创建customer接口与common中的接口对应。
代码语言:javascript复制public interface UserConsumerService {
public String getUserNameByUid(int uid);
}
4、实现service接口,在service的impl中创建。
(1)service注解来自spring框架
(2)@Reference来自dubbo,引用服务来自公共组件common。
代码语言:javascript复制@Service
public class UserConsumerServiceImpl implements UserConsumerService {
@Reference
UserService us;
@Override
public String getUserNameByUid(int uid) {
return us.getUserNameByUid(uid);
}
}
5、controller层,请求调用
(1)返回json格式的内容
代码语言:javascript复制@RestController
public class UserController {
@Autowired
UserConsumerService service;
@RequestMapping(value = "getuser/{uid}",method = RequestMethod.GET)
public String getUserNameByUid(@PathVariable("uid") String uid){
return service.getUserNameByUid(Integer.valueOf(uid));
}
}
(2)如果要返回html视图,需要在provider项目中加thymeleaf依赖。因为它是内容提供者。
代码语言:javascript复制<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
(3)同时在内容提供者的html文件中加声明。
代码语言:javascript复制<html lang="en" xmlns:th="http://www.thymeleaf.org">
四、结果展示
打开浏览器,访问地址就得到了结果。
五、总结
到此,我们就实现了一个简单的dubbo项目