Dubbo+Springboot远程服务CRUD操作

该博客介绍了如何使用Dubbo+Springboot+zookeeper+Maven搭建一个简单的业务demo,涉及单车平台维修记录的增删改查。通过创建maven父工程及三个子工程(consumer、provider、common),实现了服务消费者的调用和服务提供者的实现。通用工程包含了实体类、service接口,而服务端和消费者端分别实现了dao层、service层、controller层,以及各自的配置和启动类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、demo介绍

采用Dubbo+Springboot+zookeeper+Maven,简单实现业务demo的效果图,单车平台的显示和条件查询维修记录,和维修记录的增删改
在这里插入图片描述

demo实现描述

maven创建pom聚合工程将服务调用和服务提供分离(即服务消费者和服务提供者),zookeeper作为注册中心,dubbo实现服务的提供和调用。

此处将工程分为三个子工程完成,分别的任务是:

consumer消费者:负责controller层,调用服务

provider提供者:负责具体的服务实现提供,service层和dao层

common通用工程:避免代码的冗余,负责整合consumer和provider的公共部分,实体类、工具类和service接口

 

二、项目环境搭建

 

1、创建maven父工程

创建maven父工程bikedubbodemo
 

2、分别创建三个子工程

服务端工程:bike-provider

消费者端工程:bike-consumer

通用工程:bike-common

3、jar包引入

父工程的pom.xml管理公共版本号

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>0.2.0</version>
        </dependency>
        <!--分页-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.2.3</version>
        </dependency>
    </dependencies>
</dependencyManagement>

通用工程bike-common的pom.xml管理提供者和消费者公共的jar包

<dependencies>
    <dependency>
        <groupId>com.alibaba.boot</groupId>
        <artifactId>dubbo-spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper-spring-boot-starter</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

服务端工程bike-provider的pom.xml首先引入通用工程,服务端需要和数据库打交道,因此需要mysql驱动包和mybatis核心包,注意此处mysql驱动包的大版本和安装的版本相差不要太大,否则会报错

<dependencies>
    <dependency>
        <artifactId>bike-common</artifactId>
        <groupId>com.booy.bikedubbodemo</groupId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>1.3.1</version>
    </dependency>
    <!-- mysql驱动包 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
        <version>5.1.29</version>
    </dependency>
</dependencies>
<!--配置资源文件扫描,否则Mapper-->
<build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.*</include>
            </includes>
        </resource>
    </resources>
</build>

消费者端工程bike-consumer的pom.xml首先引入通用工程,消费者端要负责前端页面模板引擎,因此需要引入thymeleaf包

<dependencies>
    <dependency>
        <artifactId>bike-common</artifactId>
        <groupId>com.booy.bikedubbodemo</groupId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <!--thymeleaf包,注意小版本差异也大-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
</dependencies>

三、通用工程bike-common

1、实体类

平台实体类Platform

package com.booy.bike.pojo;

import java.io.Serializable;

//平台实体类
public class Platform implements Serializable {
    private Integer id;
    private String name;

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

维修实体类Record

package com.booy.bike.pojo;

import java.io.Serializable;
import java.util.Date;

public class Record implements Serializable{
    private Integer id;
    private Platform platform;
    private String num;
    private String detail;
    private Date createdDate;
    private Integer status;

    public Integer getId() {
        return id;
    }

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

    public Platform getPlatform() {
        return platform;
    }

    public void setPlatform(Platform platform) {
        this.platform = platform;
    }

    public String getNum() {
        return num;
    }

    public void setNum(String num) {
        this.num = num;
    }

    public String getDetail() {
        return detail;
    }

    public void setDetail(String detail) {
        this.detail = detail;
    }

    public Date getCreatedDate() {
        return createdDate;
    }

    public void setCreatedDate(Date createdDate) {
        this.createdDate = createdDate;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

}

搜索条件封装成类RecordSearch

import org.springframework.format.annotation.DateTimeFormat;

import java.util.Date;

public class RecordSearch extends Record {
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date start;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date end;
    private Integer platId;

    public Date getStart() {
        return start;
    }

    public void setStart(Date start) {
        this.start = start;
    }

    public Date getEnd() {
        return end;
    }

    public void setEnd(Date end) {
        this.end = end;
    }

    public Integer getPlatId() {
        return platId;
    }

    public void setPlatId(Integer platId) {
        this.platId = platId;
    }
}

事务返回的状态类

package com.booy.bike.pojo;

import java.io.Serializable;

public class DubboResult implements Serializable {
    private boolean success;
    private String message;

    public DubboResult(boolean success, String message) {
        this.success = success;
        this.message = message;
    }

    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

2、service接口

平台查询接口PlatformService

package com.booy.bike.service;

import com.booy.bike.pojo.Platform;

import java.util.List;

public interface PlatformService {
    List<Platform> getPlatformList();
}

自行车维修数据的CRUD接口

package com.booy.bike.service;

import com.booy.bike.pojo.DubboResult;
import com.booy.bike.pojo.Record;
import com.booy.bike.pojo.RecordSearch;
import com.github.pagehelper.PageInfo;

public interface RecordService {
    PageInfo<Record> getRecordList(RecordSearch search, Integer pageNum, Integer pageSize);

    Record getRecordById(Integer id);

    DubboResult addRecord(Record record);

    DubboResult updateRecord(Record record);

    DubboResult deleteRecord(Integer id);

}

四、服务端bike-provider

1、dao层

平台查询dao接口

package com.booy.bike.dao;

import com.booy.bike.pojo.Platform;

import java.util.List;

public interface PlatformDAO {
    List<Platform> getPlatformList();
}

相对应的mapper映射

<?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.booy.bike.dao.PlatformDAO">
    <select id="getPlatformList" resultType="Platform">
        select id,name from platform
    </select>
</mapper>

维修数据的dao层接口

package com.booy.bike.dao;

import com.booy.bike.pojo.Record;
import com.booy.bike.pojo.RecordSearch;

import java.util.List;

public interface RecordDAO {
    List<Record> getRecordList(RecordSearch search);

    //修改回填
    Record getRecordById(Integer id);
    int updateRecord(Record record);

    int addRecord(Record record);
    int deleteRecord(Integer id);
}

相对应的mapper映射

<?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.booy.bike.dao.RecordDAO">

    <resultMap id="recordMap" type="Record">
        <id property="id" column="ID"/>
        <result property="num" column="num"/>
        <result property="detail" column="detail"/>
        <result property="createdDate" column="created_date"/>
        <result property="status" column="status"/>
        <result property="platform.id" column="plat_id"/>
        <result property="platform.name" column="name"/>
    </resultMap>

    <select id="getRecordList" resultMap="recordMap">
        SELECT
        r.ID,
        num,
        detail,
        created_date,
        status,
        plat_id,
        p.name
        FROM record r
        INNER JOIN platform p ON p.id = r.plat_id
        <where>
            <if test="start!=null">created_date &gt;= #{start}</if>
            <if test="end!=null">and created_date &lt;=#{end}</if>
            <if test="status!=null">and status =#{status}</if>
            <if test="platId!=null">and plat_id =#{platId}</if>
            <if test="num!=null and num!=''">and num=#{num}</if>
        </where>
    </select>


    <insert id="addRecord" parameterType="Record" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO record (num, detail, created_date, status, plat_id)
        VALUES (#{num}, #{detail}, #{createdDate}, #{status}, #{platform.id})
    </insert>

    <update id="updateRecord" parameterType="Record">
        update record
        <set>
            <if test="num!=null and num!=''">num=#{num},</if>
            <if test="detail!=null and detail!=''">detail=#{detail},</if>
            <if test="status!=null">status =#{status},</if>
            <if test="platform!=null and platform.id!=null">plat_id =#{platform.id},</if>
        </set>
        where id=#{id}
    </update>

    <delete id="deleteRecord" parameterType="int">
        DELETE FROM record
        WHERE ID = #{id}
    </delete>

    <select id="getRecordById" parameterType="int"  resultMap="recordMap">
        SELECT
            id,
            num,
            detail,
            created_date,
            status,
            plat_id
        FROM record
        WHERE id = #{id}
    </select>
</mapper>

2、service接口实现类

平台查询接口具体实现PlarformServiceImpl

package com.booy.bike.service;

import com.alibaba.dubbo.config.annotation.Service;
import com.booy.bike.dao.PlatformDAO;
import com.booy.bike.pojo.Platform;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;

@Service
public class PlarformServiceImpl implements PlatformService {
    @Autowired
    private PlatformDAO platformDAO;

    @Override
    public List<Platform> getPlatformList() {
        return platformDAO.getPlatformList();
    }
}

维修数据的CRUD具体实现RecordServicImpl

package com.booy.bike.service;

import com.alibaba.dubbo.config.annotation.Service;
import com.booy.bike.dao.RecordDAO;
import com.booy.bike.pojo.DubboResult;
import com.booy.bike.pojo.Record;
import com.booy.bike.pojo.RecordSearch;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;

@Service
public class RecordServicImpl implements RecordService {

    @Autowired
    private RecordDAO recordDAO;

    @Override
    public PageInfo<Record> getRecordList(RecordSearch search, Integer pageNum, Integer pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        return new PageInfo<>(recordDAO.getRecordList(search), 5);
    }

    @Override
    public Record getRecordById(Integer id) {
        return recordDAO.getRecordById(id);
    }

    @Override
    public DubboResult addRecord(Record record) {
        try {
            int res = recordDAO.addRecord(record);
            System.out.println(1);
            return new DubboResult(res > 0, null);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println(2);
            return new DubboResult(false, e.getMessage());

        }
    }

    @Override
    public DubboResult updateRecord(Record record) {
        try {
            int res = recordDAO.updateRecord(record);
            return new DubboResult(res > 0, null);
        } catch (Exception e) {
            e.printStackTrace();
            return new DubboResult(false, e.getMessage());
        }
    }

    @Override
    public DubboResult deleteRecord(Integer id) {
        try {
            int res = recordDAO.deleteRecord(id);
            return new DubboResult(res > 0, null);
        } catch (Exception e) {
            e.printStackTrace();
            return new DubboResult(false, e.getMessage());
        }
    }
}

3、配置文件

spring:
  datasource:
    driverClassName: com.mysql.jdbc.Driver
    username: root
    password: 123456
    url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8
mybatis:
  mapper-locations: classpath*:com/booy/bike/dao/mapper/*.xml
  type-aliases-package: com.booy.bike.pojo
dubbo:
  application:
    name: bike-provider
  #    协议
  protocol:
    name: dubbo
    port: 20880
  registry:
    address: zookeeper://localhost:2181
  scan:
    base-packages: com.booy.bike.service
server:
  port: 8080

4、启动类

package com.booy.bike;

import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableDubbo//启动Dubbo服务
@MapperScan(basePackages = "com.booy.bike.dao")
public class ProviderStarter {
    public static void main(String[] args) {
        SpringApplication.run(ProviderStarter.class);
    }
}

五、消费者端bike-consumer

1、controller

package com.booy.bike.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.booy.bike.pojo.Platform;
import com.booy.bike.pojo.Record;
import com.booy.bike.pojo.RecordSearch;
import com.booy.bike.service.PlatformService;
import com.booy.bike.service.RecordService;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.Date;
import java.util.List;


@Controller
public class BikeController {

    @Reference
    private PlatformService platformService;

    @Reference
    private RecordService recordService;

    @RequestMapping("list.html")
    public String list(RecordSearch recordSearch, Integer pageNum, Model model) {
        if (pageNum == null || pageNum < 1) {
            pageNum = 1;
        }
        List<Platform> platforms = platformService.getPlatformList();
        model.addAttribute("platforms", platforms);
        PageInfo<Record> pageInfo = recordService.getRecordList(recordSearch, pageNum, 2);
        model.addAttribute("pageInfo", pageInfo);
        return "list";
    }

    @RequestMapping("edit.html")
    public String edit(Integer id, Model model) {
        if (id != null) {
            Record record = recordService.getRecordById(id);
            model.addAttribute("record", record);
        }
        List<Platform> platforms = platformService.getPlatformList();
        model.addAttribute("platforms", platforms);
        return "edit";
    }

    @RequestMapping("save.html")
    public String save(Record record) {
        if(record.getId()==null){
            record.setCreatedDate(new Date());
            recordService.addRecord(record);
        }else{
            recordService.updateRecord(record);
        }
        return "redirect:list.html";
    }

    @RequestMapping("delete.html")
    public String delete(Integer id){
        recordService.deleteRecord(id);
        return "redirect:list.html";
    }
}

2、配置文件

dubbo:
  application:
    name: bike-consumer
  registry:
    address: zookeeper://localhost:2181
  consumer:
    timeout: 5000
server:
  port: 8082
spring:
  mvc:
    view:
      suffix: .html

3、启动类

package com.booy.bike;

import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableDubbo
public class ConsumerStarter {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerStarter.class);
    }
}

剩下的就是前端页面的文件了

项目文件地址:https://download.csdn.net/download/booy123/12602679
项目文件结构图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值