超详细的springboot整合dubbo+mybatis

之前也找了很多关于springboot整合dubbo的案例,但是总是会有一些问题,总的来说这个是相对比较完整的,这个我是根据每层来分的,而不是根据功能模块,适合基础学习,废话不多说先看整体架构超详细的springboot整合dubbo+mybatis_第1张图片

步骤

1.创建一个普通的项目

这里使用的idea工具创建普通的maven项目,这一步需要注意的是什么模板都不用选直接next

超详细的springboot整合dubbo+mybatis_第2张图片
对于创建好的项目第一步当然就是它的pom文件的配置,这里需要注意的是modules标签里面需要放你创建的模块的名称,其他我都写有注释,可以自行了解

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.zk</groupId>
    <artifactId>boot_dubbo_restmanage</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
   <modules>
        <module>dubbo_api</module>
        <module>dubbo_provider</module>
        <module>dubbo_consumer</module>
    </modules>
    <!--springboot-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <!--声明版本号-->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <dubbo.version>2.5.5</dubbo.version>
        <zkClient.version>0.10</zkClient.version>
        <lombok.version>1.16.18</lombok.version>
        <springBoot.version>1.5.7</springBoot.version>
    </properties>
    <dependencies>
        <!--springboot的主要依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <!--<version>${springBoot.version}</version>-->
        </dependency>
        <!-- web应用  springmvc -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>-->
        <!-- 使用lombok实现JavaBean的get、set、toString、hashCode、equals等方法的自动生成  -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
            <scope>provided</scope>
        </dependency>
        <!-- Dubbo依赖 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>${dubbo.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--zookeeper的客户端依赖-->
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>${zkClient.version}</version>
        </dependency>
        <!-- 热加载 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <configuration>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <fork>true</fork>
                    <addResources>true</addResources>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

2.创建api子模块

这个模块的创建也可以使用普通项目,和上面一样直接创建maven项目,不用选择任何模板,这个模块主要是存放接口和实体类的


创建好之后我们第一步肯定还是要配置pom文件了,这里的pom文件没有什么特别需要注意的,唯一的能说一句的地方就是packaging标签声明的jar,标志着打包上传的时候会打成jar包,因为只有实体类和接口所以也没有什么需要添加的依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">


    <groupId>org.zk</groupId>
    <version>1.0-SNAPSHOT</version>
    <modelVersion>4.0.0</modelVersion>
    <packaging>jar</packaging>


    <artifactId>dubbo_api</artifactId>


    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.RELEASE</version>
        <relativePath/>
    </parent>


    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>



</project>

接着就是我们的实体类和接口的创建,先展示一下创建出来的目录结构,为了便于测试和学习只有一个接口和一个实体类。因为之前解决问题的时候看了好多文章上面都没有目录结构的展示,导致我踩了很多坑,所以先长个记性
超详细的springboot整合dubbo+mybatis_第3张图片
再看一下实体类接口中的内容
实体类(get,set方法我就不写了)

	package org.zk.entity;

import java.io.Serializable;

/**
 * 

* 人员表 *

* * @author Alicelonely * @since 2019-12-01 */
public class User implements Serializable { private Integer uid; private String uname; private String upwd; /** * 0普通1管理员 */ private Integer flag; /**被省略的get,set方法**/ }

UserService接口

package org.zk.service;

import org.zk.entity.User;

import java.util.List;

public interface UserService {

    List<User> getAllUser();
}

到这里第一个api模块已经建立完毕

3.建立provider模块(也就是生产者模块)

在这里创建项目就和上面不一样了需要特别注意,因为是springboot整合dubbo所以这里我们需要创建的是springboot的项目


这一步我建议和之前的目录结构一样
超详细的springboot整合dubbo+mybatis_第4张图片
这一步是选择需要的依赖,可以根据自己的需求选也可以不选,自己手动添加,不过自己手动添加的依赖可能会有依赖相互冲突的问题,这里又一个坑
超详细的springboot整合dubbo+mybatis_第5张图片
创建完毕之后第一件事仍然是pom文件的配置
这里有个地方需要特别注意就是在依赖中添加了所依赖的公共接口,也就是依赖中的artifactId标签的名字要和我们dubbo_api模块pom文件当中的artifactId内容相同,否则就会出现实现不了公共接口

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>org.zk</groupId>
    <artifactId>dubbo_provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>dubbo_provider</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <dubbo.version>2.5.5</dubbo.version>
        <zkClient.version>0.10</zkClient.version>
    </properties>

    <dependencies>

        <!-- 依赖公共接口 -->
        <dependency>
            <groupId>org.zk</groupId>
            <artifactId>dubbo_api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--spring-boot-starter 依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- Dubbo -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>${dubbo.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--zookeeper的客户端依赖-->
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>${zkClient.version}</version>
        </dependency>
        <!--mybaties-spring-boot-starter-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

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


        <!--mysql-connector-java-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.35</version>
        </dependency>
        <!-- alibaba的druid数据库连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.11</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

先看下大致的目录结构
超详细的springboot整合dubbo+mybatis_第6张图片
这一层需要用到依赖比较多,因为这一层包含dao层和service层,需要查询数据库还需要实现公共接口
首先需要配置,springboot中已经很少使用xml文件,所以这里我用yml这种潇洒的风格配置
当然在这里也有一个坑,就是password,这里我把密码加上了引号,yml文件的格式虽然潇洒,但是规则很严谨,如果说你的密码很长,建议还是加上引号,否则访问的时候生产者就会报以下异常在这里插入图片描述消费者会报以下异常

server:
  port: 8082
  servlet:
    context-path: /
spring:
  datasource:
    name: test
    url: jdbc:mysql://127.0.0.1:3306/restaurant
    username: root
    password: "000000"
    # 使用druid数据源
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver
    filters: stat
    maxActive: 20
    initialSize: 1
    maxWait: 60000
    minIdle: 1
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 300000
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: true
    maxOpenPreparedStatements: 20

#Mybatis配置
mybatis:
  typeAliasesPackage: org.zk.entity
  mapperLocations: classpath:mapper/*.xml
  #打印Mybatis的sql语句
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

然后我们在resources创建dubbo的xml配置文件,如果此时报红那就说明路径有问题或者pom文件有问题,更具体点的话就是生产者的pom文件有问题,不要问为什么

<?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: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://code.alibabatech.com/schema/dubbo
    http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!--应用名-->
    <dubbo:application name="dubbo_provider"/>

    <!--注册到zk-->
    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>

    <!--扫描dubbo的生产者的service-->
    <dubbo:annotation package="org.zk.dubbo_provider.service"/>

    <!--使用dubbo协议的20880端口-->
    <dubbo:protocol name="dubbo" port="20880"/>

    <!--声明实现类-->
    <bean id="userService" class="org.zk.dubbo_provider.service.impl.UserServiceImpl"/>

    <!--将实现类和接口关联-->
    <dubbo:service interface="org.zk.service.UserService" ref="userService"/>


</beans>   

接下来就是mapper,为了便于学习,只演示单表查询,查全部,这个xml文件是我用mybatis-plus自动生成的文件,之后我会再发关于mybatis-plus自动生成代码的文章

<?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="org.zk.dubbo_provider.dao.UserMapper">

    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="org.zk.entity.User">
        <id column="uid" property="uid" />
        <result column="uname" property="uname" />
        <result column="upwd" property="upwd" />
        <result column="flag" property="flag" />
    </resultMap>
    <!--查询所有-->
    <select id="getAllUser" resultMap="BaseResultMap">
        select * from user
    </select>
</mapper>

紧接着就是dao层的创建

package org.zk.dubbo_provider.dao;

import org.zk.entity.User;

import java.util.List;

public interface UserMapper {

    List<User> getAllUser();
}

然后是实现公共接口,这里要注意@Service注解可是dubbo的注解,当然你也可以在dubbo的配置文件中加

package org.zk.dubbo_provider.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import org.zk.dubbo_provider.dao.UserMapper;
import org.zk.entity.User;
import org.zk.service.UserService;

import javax.annotation.Resource;
import java.util.List;

@Service(timeout = 10000)
public class UserServiceImpl implements UserService {

    @Resource
    private UserMapper userMapper;

    @Override
    public List<User> getAllUser() {
        return userMapper.getAllUser();
    }

    public UserMapper getUserMapper() {
        return userMapper;
    }

    public void setUserMapper(UserMapper userMapper) {
        this.userMapper = userMapper;
    }
}

别激动还有一步需要做,没错就是springboot的启动类,注释我就不解释了,光看就能看明白了

package org.zk.dubbo_provider;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;

@SpringBootApplication
@ImportResource("classpath:dubbo_provider.xml")
@MapperScan("org.zk.dubbo_provider.dao")
public class DubboProviderApplication {

    public static void main(String[] args) {
        System.out.println("生产者已经启动");
        SpringApplication.run(DubboProviderApplication.class, args);
    }
}

至此生产者创建完成

4.建立consumer模块(也就是消费者模块)

这一步创建和生产者一样都是创建springboot项目,在这里我就不啰嗦了,直接看pom文件,这里也需要引入公共依赖接口

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>


    <groupId>org.zk</groupId>
    <artifactId>dubbo_consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>dubbo_consumer</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <dubbo.version>2.5.5</dubbo.version>
        <zkClient.version>0.10</zkClient.version>
    </properties>


    <dependencies>
        <!-- 依赖公共接口 -->
        <dependency>
            <groupId>org.zk</groupId>
            <artifactId>dubbo_api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--spring mvc-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- Dubbo -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>${dubbo.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--zookeeper的客户端依赖-->
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>${zkClient.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!--spring boot的启动插件-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

再看一下消费者的目录结构

超详细的springboot整合dubbo+mybatis_第7张图片
这里的yml配置就比较简单了,因为它只涉及到控制层

server:
  port: 8081
  servlet:
    context-path: /

然后就是dubbo_consumer.xml文件的配置,这里唯一同上面不同的我也加上了注释

<?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: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://code.alibabatech.com/schema/dubbo
    http://code.alibabatech.com/schema/dubbo/dubbo.xsd">


    <dubbo:application name="dubbo_consumer"/>

    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>

    <dubbo:protocol name="dubbo" port="20880"/>
    <!--声明需要的服务接口 -->
    <dubbo:reference id="userService" interface="org.zk.service.UserService" check="false"/>
    <!--使用注解的方式暴露接口-->
    <dubbo:annotation package="org.zk"/>
</beans>

然后是conroller层

package org.zk.dubbo_consumer.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.zk.entity.User;
import org.zk.service.UserService;

import javax.annotation.Resource;
import java.util.List;

@RestController
public class UserController {

    @Resource
    private UserService userService;

    @RequestMapping("/getAllUser")
    public List<User> getAllUsers() {
        return userService.getAllUser();
    }
    public UserService getUserService() {
        return userService;
    }

    public void setUserService(UserService userService) {
        this.userService = userService;
    }
}

最后就是在启动类中加上@ImportResource(“classpath:dubbo_consumer.xml”)注解就可以了,然后先启动zookeeper,当然每个人的目录都不同,然后在idea当中先启动生产者,再启动消费者
超详细的springboot整合dubbo+mybatis_第8张图片
启动之后我们再启动tomcat,因为我们需要访问注册中心,看是否注册,当然启动之前你需要把超详细的springboot整合dubbo+mybatis_第9张图片
放在tomcat的workapps下面
dubbo-admin-2.5.10.war
链接: https://pan.baidu.com/s/1v6IYVvDITqgs_nns2PcdPQ
提取码:un81

如果tomcat启动成功没有报错就可以直接访问http://localhost:8080/dubbo-admin-2.5.10/
会有弹窗提示输入账号密码,一般情况账号:root,密码:root。输入之后这里就会显示注册的具体情况
超详细的springboot整合dubbo+mybatis_第10张图片
最后我们再访问一下我们控制层的看能不能拿到数据,这里注意我们直接访问8081端口,因为消费者这层设置的端口是8081.http://localhost:8081/getAllUser
超详细的springboot整合dubbo+mybatis_第11张图片
这里sql也打印出来了
超详细的springboot整合dubbo+mybatis_第12张图片
源码地址:https://gitee.com/lituoqu/springboot_dubbo_mybatis

你可能感兴趣的:(springboot分布式)