微服务提供者支付模块实现—SpringCloud(H版)微服务学习教程(4)

Java技术 潘老师 3年前 (2021-03-22) 1615 ℃ (0) 扫码查看

本节我们主要实现微服务提供者支付模块的实现,对外提供可调用的Restful风格的接口,并对所有请求响应以json格式统一返回。一般创建一个新模块(Module)我们都遵循以下步骤:

  • 第1步:创建Module
  • 第2步:修改pom.xml
  • 第3步:写yml
  • 第4步:主启动类
  • 第5步:业务类
  • 第6步:测试
提示:如果你不知道什么是Restful风格请参考:
Restful风格——SpringMVC框架系列教程(3)

文章目录 1.restful风格介绍: 2.举例: 4.SpringMVC中如何发送Restful请求 5.表 […]

下面我们使用以上几步来实现该模块的创建。

第1步:创建Module

1)我们在父工程下右键New->Module->Maven,修改JDK版本为自己版本,直接Next
微服务提供者支付模块实现—SpringCloud(H版)微服务学习教程(4)
2)设置GAV,子模块名称可以用-_隔开命名,建议带上该服务的使用的端口号,我这里是提供支付的模块,命名为cloud-provider-payment8001
微服务提供者支付模块实现—SpringCloud(H版)微服务学习教程(4)
3)确认模块名与模块保存目录,这里模块名会将-去掉,我们重新加上,然后finish
微服务提供者支付模块实现—SpringCloud(H版)微服务学习教程(4)

第2步:修改pom.xml

1)在修改子模块的pom.xml之前,我们先查看父模块mscloudpom.xml,发现多了如下代码:

<modules>
    <module>cloud-provider-payment8001</module>
</modules>

表明父工程下有一个名为cloud-provider-payment8001子模块。

从字面意思来说,module就是模块,而pom.xml中的modules也正是这个意思,用来管理同个项目中的各个模块

2)我们打开cloud-provider-payment8001pom.xml发现下面有如下代码:

<parent>
     <artifactId>mscloud</artifactId>
     <groupId>com.panziye.springcloud</groupId>
     <version>1.0-SNAPSHOT</version>
</parent>
parent用来指定父工程的GAV坐标(即父pom中声明的坐标)。在多模块(module)的项目中,有很多模块中的pom中存在相同的引用,如果此时声明一个父pom文件,将公用的依赖提取到父pom文件中(即使用标签),将大大减少其他pom文件中的依赖的配置

3)现在我们正式修改cloud-provider-payment8001子模块的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>mscloud</artifactId>
        <groupId>com.panziye.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-provider-payment8001</artifactId>
    <dependencies>

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

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

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

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <!-- 此版本号也可定义在父pom中-->
            <version>1.2.5</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

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

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

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

    </dependencies>

</project>
注意:如果你删除某个子模块再新建同名子模块,会发现无法继承父工程,可以参考如下文章:
IDEA删除Maven项目子模块后再重建无法识别导致Module报错

文章目录 一、问题说明 二、问题解决 一、问题说明 有个学生在使用IDEA创建好Maven聚合项目时,然后将其 […]

第3步:写yml

1)在cloud-provider-payment8001子模块的src->main->resources下新建名为application.yml文件,一般建好之后,文件图标会是一个小绿叶,如果你的不是小绿叶,可参考:

IDEA搭建微服务子Module中application.yml没有绿叶也没自动提示

在使用IDEA搭建微服务项目时,子Module中application.yml没有绿叶标志,而是显示红色的,而 […]

2)在application.yml中配置如下代码:

server:
  port: 8001

spring:
  application:
    name: cloud-payment-service
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/dbcloud?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false
    username: root
    password: 123456

mybatis:
  mapperLocations: classpath:mapper/*.xml
  type-aliases-package: com.panziye.springcloud.entities
注意:
1)一定要注意yml的书写格式规范,特别小心缩进和空格
2)数据库库名、用户名、密码都换成自己的

第4步:主启动类

1)在cloud-provider-payment8001子模块的src->main->java下新建名为com.panziye.springcloud的包,在包中新建名为PaymentMain8001的主启动类,具体如下:

package com.panziye.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

第5步:业务类

1)在dbcloud数据库新建payment表:

CREATE TABLE `payment` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `serial` varchar(200),
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

2)新建Payment主实体类
com.panziye.springcloud包中新建entities包,在entities包新建Payment主实体类,代码如下:

package com.panziye.springcloud.entities;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Payment implements Serializable {
    private Long id;
    private String serial;

}
注意:这里使用了lombok插件及其注解,务必要先安装好lombok插件,如果你不了解lombok,请参考:
Lombok入门使用教程及其优缺点详解

在Java开发中,因工作需要,你可能会学习或被迫去学习Lombok这个工具,这玩意用起来可以说是贼爽,很方便, […]

3)新建CommonResult JSON主体类
entities包新建CommonResultJSON主体类,用于统一响应(这里简化只有两个响应码),代码如下:

package com.panziye.springcloud.entities;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommonResult<T> {
    private Integer code;
    private String message;
    private T data;

    public CommonResult(Integer code, String message) {
        this(code,message,null);
    }

}

4)新建Dao
com.panziye.springcloud包中新建dao包,在dao包中新建PaymentDao接口,如下:

package com.panziye.springcloud.dao;

import com.panziye.springcloud.entities.Payment;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

@Mapper
public interface PaymentDao {
    int create(Payment payment);
    Payment getPaymentById(@Param("id") Long id);
}

5)新建映射文件
cloud-provider-payment8001子模块的src->main->resources下新建名为mapper的文件夹,用于存放mybatis的mapper映射文件,在mapper目录下新建PaymentMapper.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.panziye.springcloud.dao.PaymentDao">
    <insert id="create" parameterType="Payment" useGeneratedKeys="true" keyProperty="id">
        insert into payment (serial) values (#{serial})
    </insert>

    <resultMap id="BaseResultMap" type="com.panziye.springcloud.entities.Payment">
        <id column="id" property="id" jdbcType="BIGINT"></id>
        <result column="serial" property="serial" jdbcType="VARCHAR"></result>
    </resultMap>
    <select id="getPaymentById" parameterType="Long" resultMap="BaseResultMap">
        select * from payment where id = #{id}
    </select>
</mapper>

6)新建service接口和实现类
com.panziye.springcloud包中新建service包,在service包下新建impl,分别在serviceservice.impl中新建PaymentService接口和PaymentServiceImpl实现类:
i)PaymentService接口

package com.panziye.springcloud.service;

import com.panziye.springcloud.entities.Payment;

public interface PaymentService {
    //新增
    int create(Payment payment);
    //获取
    Payment getPaymentById(Long id);
}

ii)PaymentServiceImpl实现类

package com.panziye.springcloud.service.impl;

import com.panziye.springcloud.dao.PaymentDao;
import com.panziye.springcloud.entities.Payment;
import com.panziye.springcloud.service.PaymentService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
public class PaymentServiceImpl implements PaymentService {
    @Resource
    private PaymentDao paymentDao;

    @Override
    public int create(Payment payment) {
        return paymentDao.create(payment);
    }

    @Override
    public Payment getPaymentById(Long id) {
        return paymentDao.getPaymentById(id);
    }
}

7)新建controller类
com.panziye.springcloud包中新建controller包,在controller包新建PaymentController如下:

package com.panziye.springcloud.controller;

import com.panziye.springcloud.entities.CommonResult;
import com.panziye.springcloud.entities.Payment;
import com.panziye.springcloud.service.PaymentService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

@RestController
@Slf4j
public class PaymentController {
    @Resource
    private PaymentService paymentService;

    @PostMapping(value = "/payment/create")
    public CommonResult create(Payment payment){
        int result = paymentService.create(payment);
        log.info("插入数据库结果==="+result);
        if(result>0){
            return new CommonResult(200,"插入数据库成功",result);
        }else{
            return new CommonResult(444,"插入数据库失败");
        }
    }

    @GetMapping(value = "/payment/get/{id}")
    public CommonResult getPaymentById(@PathVariable("id") Long id){
        Payment payment = paymentService.getPaymentById(id);
        log.info("查询数据库结果==="+payment);
        if(payment != null){
            return new CommonResult(200,"查询数据库成功",payment);
        }else{
            return new CommonResult(444,"查询不到数据");
        }
    }
}

第6步:测试

最后我们启动子模块项目(运行PaymentMain8001主启动类),前提是要保证mysql数据库服务已经启动好,然后我们使用postman工具测试createget,postman工具官网下载:点击去下载,测试结果如下:
1)测试create
微服务提供者支付模块实现—SpringCloud(H版)微服务学习教程(4)
2)数据库
微服务提供者支付模块实现—SpringCloud(H版)微服务学习教程(4)
3)测试get
微服务提供者支付模块实现—SpringCloud(H版)微服务学习教程(4)

补充:实现热部署

为了每次修改代码不需要手工重新启动项目,我们可以配置热部署实现,具体可参考:

SpringBoot中Maven聚合工程(微服务)如何开启热部署?

文章目录 第1步:添加依赖 第2步:配置插件 第3步:勾选设置 第4步:AutoMake 第5步:重启 第6步 […]


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/java/2614.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】