SpringBoot + Dubbo + Mybatis 实现分布式服务

版权声明:原创文章欢迎转载,转载请备注来源:https://blog.csdn.net/weixin_41986096 欢迎关注微信公众号摘星族 https://blog.csdn.net/weixin_41986096/article/details/83867918

SpringBoot + Dubbo + Mybatis 实现分布式服务

springboot   springboot  springboot    springboot  springboot  

往前回顾:

上一节简单的介绍了Spring + Dubbo 如何简单的实现分布
式服务确定了在服务提供主要包括两部分,
一个是暴露服务,
一个是服务实现,
暴露服务:即我们平常开发中所使用的的接口。
服务实现:与我们平常的服务一样,对接口进行实现,
比较特别的是,我们这里需要使用到Dubbo 的 @Service
 注解在配置方面,为了防止端口冲突,我们各自定义了
服务端口注解:server.port=6660和server.port=6661
通过spring.dubbo.scan扫描使用的dubbo接口所在包位置
再有就是引用了些许SpringBoot官方的包。

项目构建

注:项目构建通过: http://start.spring.io/ 快速构建web 项目,
具体操作可以参考《SpringBoot使用SpringDataJPA完成数据查询 -Demo》
SpringBoot + Dubbo 可以参考《SpringBoot 整合Dubbo构建分布式服务》
在基础环境确定好了之后,我们项目的目录结构如下:

**上图所示,我们项目主要分为了四个模块,
   一部分是生产者:hdd-doorplate-dubbo-server,
   一部分是消费者:hdd-doorplate-dubbo-client,
   一部分是工具类:hdd-doorplate-common,
   一部分是实体类:hdd-doorplate-entity。

hdd

与上节父pom的配置相同
这里没有什么改动

详见《SpringBoot 整合Dubbo构建分布式服务》

hdd-doorplate-entity

首先我们需要新建一个hdd-doorplate-entity 用来存放PoJo的实体类,方便其他项目或者模块依赖

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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>hdd</artifactId>
        <groupId>com.herbert.hdd</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <packaging>jar</packaging>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>hdd-doorplate-entity</artifactId>
</project>

建立实体类Doorplate

package com.herbert.hdd.doorplate.entity;

import java.io.Serializable;

/**
 * Created by Herbert on 2018/11/8.
 */
public class Doorplate implements Serializable{
    private String id;

    private String name;

    private String address;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

hdd-doorplate-dubbo-server

在上节的配置中加入MyBatis的配置信息

详见《SpringBoot 整合Dubbo构建分布式服务》

pom文件加入依赖,主要是在加上Spring Boot Mybatis 依赖

<?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.herbert.hdd</groupId>
    <artifactId>hdd-doorplate-dubbo-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <name>hdd-doorplate-dubbo-server</name>
    <description>Doorplate project for Spring Boot</description>


    <!-- Spring Boot 启动父依赖 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.1.RELEASE</version>
    </parent>

    <!-- 集中定义版本号 -->
    <properties>
        <mybatis-spring-boot>1.2.0</mybatis-spring-boot>
        <mysql-connector>5.1.39</mysql-connector>
        <dubbo-spring-boot>1.0.0</dubbo-spring-boot>
    </properties>

    <dependencies>

        <!-- Spring Boot Dubbo 依赖 -->
        <dependency>
            <groupId>io.dubbo.springboot</groupId>
            <artifactId>spring-boot-starter-dubbo</artifactId>
            <version>${dubbo-spring-boot}</version>
        </dependency>

        <!-- Spring Boot Web 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- Spring Boot Test 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- Spring Boot Mybatis 依赖 -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>${mybatis-spring-boot}</version>
        </dependency>

        <!-- MySQL 连接驱动依赖 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql-connector}</version>
        </dependency>

        <dependency>
            <groupId>com.herbert.hdd</groupId>
            <artifactId>hdd-doorplate-entity</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <!-- Junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

</project>

配置文件

server.port=6660
## Dubbo 服务提供者配置
spring.dubbo.application.name=provider
spring.dubbo.registry.address=zookeeper://127.0.0.1:2182
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
spring.dubbo.scan=com.herbert.hdd.doorplate.dubbo

## 数据源配置
spring.datasource.url=jdbc:mysql://localhost:3306/herbert?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=herbrt
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

## Mybatis 配置 
## mybatis.typeAliasesPackage 为实体对象所在的包,跟数据库表一一对应
## mybatis.mapperLocations 为mapper文件的位置

mybatis.typeAliasesPackage=com.herbert.hdd.doorplate.entity
mybatis.mapperLocations=classpath:mapper/*.xml

Mapper文件配置

在resources文件下建立mapper文件
然后在mapper文件下写mapper.xml文件

<?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.herbret.hdd.doorplate.dubbo.dao.DoorplateDao">
    <resultMap id="BaseResultMap" type="com.herbret.hdd.doorplate.entity.Doorplate">
        <result column="id" property="id" />
        <result column="name" property="name" />
        <result column="address" property="address" />
    </resultMap>

    <parameterMap id="Doorplate" type="com.herbert.hdd.doorplate.entity.Doorplate"/>

    <sql id="Base_Column_List">
        id,name,address
    </sql>

    <select id="findById" resultMap="BaseResultMap" parameterType="java.lang.String">
        select
        <include refid="Base_Column_List" />
        from doorplate
        where id = #{id}
    </select>

</mapper>

建立mapper工作空间映射DAO

package com.herbert.hdd.doorplate.dubbo.dao;

import com.herbert.hdd.doorplate.entity.Doorplate;
import org.apache.ibatis.annotations.Param;

/**
 * Created by Herbert on 2018/11/8.
 */
public interface DoorplateDao {

    Doorplate findById(@Param("id") String id);
}

添加dubbo服务层接口以及实现

DoorplateServer 接口

package com.herbert.hdd.doorplate.dubbo;

import com.herbert.hdd.doorplate.entity.Doorplate;

import java.util.List;

/**
 * Created by Herbert on 2018/11/7.
 *
 * 程序业务 Dubbo 服务层
 *
 */

public interface DoorplateServer {

    /**
     *  查询信息
     * @return
     */
    List<String> list();

   /**
     *  根据ID查询信息
     * @return
     */
    Doorplate listById(String id);

}

DoorplateServerImpl 实现

package com.herbert.hdd.doorplate.dubbo.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.herbert.hdd.doorplate.dubbo.DoorplateServer;
import com.herbert.hdd.doorplate.dubbo.dao.DoorplateDao;
import com.herbert.hdd.doorplate.entity.Doorplate;

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

/**
 * Created by Herbert on 2018/11/7.
 */

// 注册为 Dubbo 服务
@Service(version = "1.0.0")
public class DoorplateServerImpl implements DoorplateServer {

    @Resource
    private DoorplateDao doorplateDao;

    @Override
    public List<String> list() {
        List<String> list = new ArrayList<String>();
        list.add("城市中心运动公园");
        return list;
    }

    @Override
    public Doorplate listById(String id) {
        Doorplate doorplate =doorplateDao.findById(id);
        return doorplate;
    }
}

程序启动入口添加注解扫描@MapperScan

package com.herbert.hdd;

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

// Spring Boot 应用的标识

@SpringBootApplication
// mapper 接口类扫描包配置
@MapperScan("com.herbert.hdd.doorplate.dubbo.dao")
public class HddDoorplateDubboProviderApplication {

    public static void main(String[] args) {
        // 程序启动入口
        // 启动嵌入式的 Tomcat 并初始化 Spring 环境及其各 Spring 组件
        SpringApplication.run(HddDoorplateDubboProviderApplication.class, args);
    }
}

hdd-doorplate-dubbo-client

dubbo服务层接口

package com.herbert.hdd.doorplate.dubbo;

import com.herbert.hdd.doorplate.entity.Doorplate;

import java.util.List;

/**
 * Created by Herbert on 2018/11/7.
 */
public interface DoorplateServer {

    List<String> list();

    Doorplate listById(String id);
}

服务调用

我们需要实现一个RESTful 接口,提供给用户调用:

package com.herbert.hdd.doorplate.dubbo.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.herbert.hdd.doorplate.dubbo.DoorplateServer;
import com.herbert.hdd.doorplate.entity.Doorplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;


/**
 * Created by Herbert on 2018/11/7.
 */
@RestController
@RequestMapping("/user")
public class DoorpalteController {

    @Reference(version = "1.0.0")
    DoorplateServer doorplateServer;

    @RequestMapping("/list")
    public List<String> list(){
        List<String> list =doorplateServer.list();
        System.out.println(list.toString());
        return list;
    }

    @RequestMapping("/listById")
    public Doorplate list(String id){
        Doorplate doorplate =doorplateServer.listById(id);
        System.out.println(doorplate.toString());
        return doorplate;
    }
}

另外,我们还可以在需要使用到生产者中的方法,则需要创建一个接口,然后再调用时,使用 @Reference 注解进行引用也可以直接引用

数据库数据

测试

与上节测试方法一致
这里没有什么改动

详见《SpringBoot 整合Dubbo构建分布式服务》

结果

注意事项

1:在建立hdd-doorplate-entity的时候,所有的实体类记得实现Serializable接口,它的对象才是可序列化的。因此如果要序列化某些类的对象,这些类就必须实现Serializable接口
2:mybatis.typeAliasesPackage  typeAliasesPackage:它一般对应我们的实体类所在的包,这个时候会自动取对应包中不包括包名的简单类名作为包括包名的别名。多个package之间可以用逗号或者分号等来进行分隔。(value的值一定要是包的全名)
3:如果Mapper.xml与Mapper.class在同一个包下且同名,spring扫描Mapper.class的同时会自动扫描同名的Mapper.xml并装配到Mapper.class。如果Mapper.xml与Mapper.class不在同一个包下或者不同名,就必须使用配置mapperLocations指定mapper.xml的位置。此时spring是通过识别mapper.xml中的

 <mapper namespace="com.herbert.hdd.doorplate.dubbo.dao.DoorplateDao">

namespace的值来确定对应的Mapper.class的。
4: 记得在启动类加 mapper 接口类扫描包配置@MapperScan("com.herbert.hdd.doorplate.dubbo.dao")

 欢迎关注公众号:

猜你喜欢

转载自blog.csdn.net/weixin_41986096/article/details/83867918