从零搭建Spring boot +dubbo+zookeeper +Mybatis(二)

这章会利用maven进行分模块,并且引入dubbo和spring-boot,废话不多说,就开始一步步的搭建。

分模块

首先新建一个maven项目(其实目前好像更流行用gradle,虽然在android中我使用过,但仅仅是用gradle模块管理,以及引入一些包文件,具体的大作用还是没仔细了解,有兴趣的小伙伴可以去了解使用)项目目录如下图所示。因为我这个是作为一个父模块,并不需要src。我们这边可以直接删掉src,保留也可以,问题不大。


新的maven项目.png

然后我们将子模块添加到父模块下,我们分别需要一个提供者,一个消费者和一个基础模块。创建完成后文件目录如图显示


项目目录.png

我们在项目的pom.xml文件中添加需要的jar包。使用dependencyManagement标签,子项目pom不会自动使用父pom中的jar包,如果需要使用,就要给出groupId和artifactId,无需给出version
<?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>com.zym.test</groupId>
    <artifactId>SpringBoot_Dubbo_Demo</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>SpringBoot_Dubbo_Consumer</module>
        <module>SpringBoot_Dubbo_Provider</module>
        <module>SpringBoot_Dubbo_Common</module>
    </modules>
    <!-- 设置我们项目的一些版本属性 -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.7</java.version>
        <dubbo.version>2.5.5</dubbo.version>
        <zkclient.version>0.10</zkclient.version>
        <lombok.version>1.16.18</lombok.version>
        <spring-boot.version>1.5.7.RELEASE</spring-boot.version>
    </properties>
    <!-- 声明一些项目依赖管理,方便我们的依赖版本管理 -->
    <dependencyManagement>
        <dependencies>
            <!-- Springboot依赖 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
                <version>${spring-boot.version}</version>
            </dependency>

            <!-- Springboot-web依赖 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>${spring-boot.version}</version>
            </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>
            </dependency>

            <!-- zookeeper的客户端依赖 -->
            <dependency>
                <groupId>com.101tec</groupId>
                <artifactId>zkclient</artifactId>
                <version>${zkclient.version}</version>
            </dependency>

        </dependencies>
    </dependencyManagement>

</project>

接着基础模块都要被消费者和提供者模块引用。我们对基础模块的pom.xml导入需要的jar文件。以及创建基础模块存放的文件夹。现在我们仅仅将domin和service接口作为基础提供给消费者和提供者使用。在基础模块中引用lombok,一个非常好用减少get set 的编写,并且不影响速度。给出common项目的目录结构以及pom.xml。

Common项目的.pom.xml:

<?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">
    <parent>
        <artifactId>SpringBoot_Dubbo_Demo</artifactId>
        <groupId>com.zym.test</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>SpringBoot_Dubbo_Common</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</project>
Common项目的目录结构.png

然后我们分别在两个模块中的pom.xml文件中引用基础模块,并且引入需要的jar包。

SpringBoot_Dubbo_Consumer pom.xml:

<?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">
    <parent>
        <artifactId>SpringBoot_Dubbo_Demo</artifactId>
        <groupId>com.zym.test</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>SpringBoot_Dubbo_Consumer</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.zym.test</groupId>
            <artifactId>SpringBoot_Dubbo_Common</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-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
        </dependency>
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

SpringBoot_Dubbo_Provider 的pom.xml:

<?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">
    <parent>
        <artifactId>SpringBoot_Dubbo_Demo</artifactId>
        <groupId>com.zym.test</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>SpringBoot_Dubbo_Provider</artifactId>
    <dependencies>
        <dependency>
            <groupId>com.zym.test</groupId>
            <artifactId>SpringBoot_Dubbo_Common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
        </dependency>
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
        </dependency>
        <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>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>
</project>

这样我们就将需要的Jar包以及各个模块之间的关系搭建完了,接着就是各个子项目中搭建配置文件了,比如提供者肯定需要去实现service然后去数据库查询数据返回给消费者所以提供者肯定需要配置mybatis以及dubbo的文件配置。我们这边使用springboot,因为基本上都封装好了,配置就很简单了。我们先新增一个application.yml,具体配置如下,这边直接将mybatis的配置写在配置文件里了,就不需要像ssm一样需要xml文件配置了。
application.yml:

server:
  port: 8082
  context-path: /
spring:
 datasource:
        name: test
        url: jdbc:mysql://127.0.0.1:3306/test
        username: root
        password: 123456
        # 使用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
        validationQuery: select 'x'
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
        poolPreparedStatements: true
        maxOpenPreparedStatements: 20
        mybatis:
          type-aliases-package:  domain

同时,我们需要在项目中配置dubbo,让该项目成为提供者。
SpringBoot_Dubbo_Provider 的 spring-dubbo.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="provider"/>
    <!-- 注册中心的ip地址 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
    <!-- 扫描注解包路径,多个包用逗号分隔,不填pacakge表示扫描当前ApplicationContext中所有的类 -->
    <dubbo:annotation package="service.mpl"/>
</beans>

Springboot是使用类来作为启动器的,所以我们启动添加一个启动器ProviderApplication.java,在启动器中将dubbo的配置文件引用,并且去扫描mapper包。

SpringBoot_Dubbo_Provider ProviderApplication.java:

@SpringBootApplication
@ImportResource({"classpath:config/spring-dubbo.xml"})
@MapperScan("mapper")
public class ProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
        try {
            System.in.read();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这样SpringBoot_Dubbo_Provider这个项目就完成配置了。这是SpringBoot_Dubbo_Provider的项目结构

SpringBoot_Dubbo_Provider项目结构.png

接下来完成SpringBoot_Dubbo_Consumer 需要的项目配置。消费者需要实现的是将返回的数据显示给前端.(这里涉及到如果你的项目是前后端分离的话,那你的项目就应该直接返回json格式数据就好,可以直接使用springboot的@RestController。但是如果你使用的模板引擎或者是jsp那就要根据自己选择方式去做,具体的话就不展现了.自行百度). 下面为该项目的项目结构以及dubbo的配置XML.


SpringBoot_Dubbo_Consumer 项目结构.png

SpringBoot_Dubbo_Consumer 的 spring-dubbo.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="consumer"/>
    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
    <dubbo:annotation package="controller"/>
</beans>

同样我们也要为这个项目写一个启动器。在启动器中加载dubbo配置文件 。这里提供者和消费者两个项目不能使用相同的端口号,所以消费者这边端口我使用的是8081 提供者为8082。因为消费者这边只是配置了一个端口号所以就不给出配置代码了。

SpringBoot_Dubbo_Consumer 的ConsumerApplication .java:

@SpringBootApplication
@ImportResource({"classpath:config/spring-dubbo.xml"})
public class ConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}

这样,所有的配置我们都完成了,接着就是添加我们要的业务逻辑以及相关代码了。这里,我就简单的从数据库根据ID查一个user信息为例子。

首先根据下面脚本创建user表

CREATE TABLE t_user(
  user_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
  user_name VARCHAR(255) NOT NULL ,
  password VARCHAR(255) NOT NULL ,
  phone VARCHAR(255) NOT NULL
) ENGINE=INNODB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8;

然后将表的映射java类,放在SpringBoot_Dubbo_Common的domin中,并且在service的包中添加一个userService接口。
User.java:

@Data
public class User implements Serializable {
    private Integer userId;

    private String userName;

    private String password;

    private String phone;
}

userService.java


/**
 * 用户接口
 *
 * @author zym
 * @create 2018-06-19 14:10
 **/
public interface UserService {
    User findUser();
}

在SpringBoot_Dubbo_Provider的mapper包中添加UserMapper.java。(本来应该有mapper.xml文件,我这边不知道什么原因,总是说找不到我的xml文件,我这边就写成了注解形式)
UserMapper.java:

public interface UserMapper {
    @Results(id = "userMap", value = {
            @Result(column = "user_id", property = "userId"),
            @Result(column = "phone", property = "phone"),
            @Result(column = "user_name", property = "userName"),
            @Result(column = "password", property = "password")})
    @Select("SELECT * FROM t_user")
    List<User> getAll();

    @Select("SELECT * FROM t_user WHERE user_id = #{id}")
    @ResultMap("userMap")
    User getOne(Long id);

}

并且在SpringBoot_Dubbo_Provider的impl中实现UserService接口
UserServiceImpl.java:

@Service(version = "1.0.0")
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;
    
    @Override
    public User findUser() {

        return  userMapper.getOne(1L);
    }

}

SpringBoot_Dubbo_Consumer中添加UserController,像普通的springmvc一样,只是在RPC调用的时候需要带上注解。这样就完成了所有的代码

@RestController
@RequestMapping("/user")
public class UserController {
    @Reference(version = "1.0.0")
    private UserService userService;



    @GetMapping("getUser")
    public User user() {
        return userService.findUser();
    }
}

执行程序发现运行失败,发现不能把启动类直接放在java文件下,新建了com.test包将之前的包都扔在了这下面,更改下配置中的包路径。先启动Provider再启动Consumer。

返回结果.png

成功读取到数据,我们再到dubbo-admin的web看下,发现一个消费者和一个提供者。分别点击提供者和消费者发现有我们代码中注册的userService了。这样就完成了整个dubbo项目的搭建。
dubbo-admin的应用管理.png

源码已经上传到了github上源码

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 121,148评论 16 134
  • 0 准备 安装注册中心:Zookeeper、Dubbox自带的dubbo-registry-simple;安装Du...
    七寸知架构阅读 13,168评论 0 89
  • 1、准备 在分析探索Dubbo架构原理之前,我们需要准备一下环境,用于后面我们来分析dubbo的架构。 1.1 Z...
    墨渊丶阅读 2,273评论 1 20
  • 2018年4月20日,今天是小儿子出生的第11天,还和往常一样给他换好尿不湿然后满足他的胃,可今天唯一的不一样...
    Aicny阅读 94评论 0 0
  • 开青旅的收获除了上篇提到的,让人将心灵打开容纳更多人与事之外,还体现在其他的一些方面。 开青旅让人更具责任意识。以...
    露影晨夕阅读 164评论 1 2