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

  • 第1步:创建Module
  • 第2步:修改pom.xml
  • 第3步:写yml
  • 第4步:主启动类
  • 第5步:业务类
  • 第6步:测试

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

第1步:创建Module

1)我们在父工程下右键New->Module->Maven,修改JDK版本为自己版本,直接Next

2)设置GAV,子模块名称可以用-_隔开命名,建议带上该服务的使用的端口号,我这里是提供支付的模块,命名为cloud-provider-payment8001

3)确认模块名与模块保存目录,这里模块名会将-去掉,我们重新加上,然后finish

第2步:修改pom.xml

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

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

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

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

 <parent> <artifactId>mscloud</artifactId> <groupId>com.panziye.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> 

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> 

第3步:写yml

1)在cloud-provider-payment8001子模块的src->main->resources下新建名为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 

第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; } 

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

2)数据库

3)测试get

补充:实现热部署

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