之前一直做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);
    }
}

5、在启动类上加注解

(1)@SpringBootApplication 启动类注解

(2)@EnableDubbo  dubbo注解

(3)@MapperScan("com.bdqn.doubbleuserprovider.mapper")该注解指向mapper包,没有或者错误会报:我也是踩了。

//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内部加资源配置:

 <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引用服务。

server.port=8089
dubbo.protocol.port = 20880
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中的接口对应。

public interface UserConsumerService {

    public String getUserNameByUid(int uid);
}

4、实现service接口,在service的impl中创建。

(1)service注解来自spring框架

(2)@Reference来自dubbo,引用服务来自公共组件common。

@Service
public class UserConsumerServiceImpl implements UserConsumerService {
    @Reference
    UserService us;
    @Override
    public String getUserNameByUid(int uid) {
        return us.getUserNameByUid(uid);
    }
}

5、controller层,请求调用

(1)返回json格式的内容

@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依赖。因为它是内容提供者。

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

(3)同时在内容提供者的html文件中加声明。

<html lang="en" xmlns:th="http://www.thymeleaf.org">

四、结果展示

打开浏览器,访问地址就得到了结果。

五、总结

到此,我们就实现了一个简单的dubbo项目,欢迎大家关注公众号,一起交流技术。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐