本节我们主要实现微服务提供者支付模块的实现,对外提供可调用的Restful风格的接口,并对所有请求响应以json格式统一返回。一般创建一个新模块(Module)我们都遵循以下步骤:
[list]第1步:创建Module
第2步:修改pom.xml
第3步:写yml
第4步:主启动类
第5步:业务类
第6步:测试[/list]
[v_tips]提示:如果你不知道什么是Restful风格请参考:[/v_tips]
[neilian ids=2321]
下面我们使用以上几步来实现该模块的创建。
第1步:创建Module
1)我们在父工程下右键New->Module->Maven,修改JDK版本为自己版本,直接Next

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

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

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

程序员导航
优网导航旗下整合全网优质开发资源,一站式IT编程学习与工具大全网站
cloud-provider-payment8001
表明父工程下有一个名为cloud-provider-payment8001子模块。
[v_blue]从字面意思来说,module就是模块,而pom.xml中的modules也正是这个意思,用来管理同个项目中的各个模块[/v_blue]
2)我们打开cloud-provider-payment8001的pom.xml发现下面有如下代码:
mscloud com.panziye.springcloud 1.0-SNAPSHOT
[v_blue]parent用来指定父工程的GAV坐标(即父pom中声明的坐标)。在多模块(module)的项目中,有很多模块中的pom中存在相同的引用,如果此时声明一个父pom文件,将公用的依赖提取到父pom文件中(即使用
3)现在我们正式修改cloud-provider-payment8001子模块的pom.xml如下:
mscloud com.panziye.springcloud 1.0-SNAPSHOT 4.0.0 cloud-provider-payment8001 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator org.mybatis.spring.boot mybatis-spring-boot-starter com.alibaba druid-spring-boot-starter 1.2.5 mysql mysql-connector-java org.springframework.boot spring-boot-starter-jdbc org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test
[v_warn]注意:如果你删除某个子模块再新建同名子模块,会发现无法继承父工程,可以参考如下文章:[/v_warn]
[neilian ids=2021]
第3步:写yml
1)在cloud-provider-payment8001子模块的src->main->resources下新建名为application.yml文件,一般建好之后,文件图标会是一个小绿叶,如果你的不是小绿叶,可参考:
[neilian ids=2550]
2)在application.yml中配置如下代码:

AI 工具导航
优网导航旗下AI工具导航,精选全球千款优质 AI 工具集
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
[v_warn]注意:
1)一定要注意yml的书写格式规范,特别小心缩进和空格
2)数据库库名、用户名、密码都换成自己的[/v_warn]
第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;
}
[v_warn]注意:这里使用了lombok插件及其注解,务必要先安装好lombok插件,如果你不了解lombok,请参考:[/v_warn]
[neilian ids=696]
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{ 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如下:
insert into payment (serial) values (#{serial})
6)新建service接口和实现类
在com.panziye.springcloud包中新建service包,在service包下新建impl,分别在service和service.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工具测试create和get,postman工具官网下载:点击去下载,测试结果如下:
1)测试create

2)数据库

3)测试get

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



