- 1、订单微服务
- 2、构建公共工程
- 2.1 建module
- 2.2 改pom
- 2.3 构建公共模块
- 2.4 maven打包发布到公共库
- 3、构建订单模块
- 3.1 建module
- 3.2 改pom
- 3.3 写yml/properties
- 3.4 主启动
- 3.5 业务类
- 3.5.1 创建数据库表
- 3.5.2 建立entities
- 3.5.3 构建dao
- 3.5.4 构建mapper
- 3.5.5 构建service
- 3.5.6 构建controller
- 3.6 测试
- 3.6.1 启动服务
- 3.6.3 测试创建订单
- 3.6.4 测试获取订单
- 4、构建消费订单模块
- 4.1 建module
- 4.2 改pom
- 4.3 写yml/properties
- 4.4 主启动
- 4.5 业务类
- 4.5.1 获取RestTemplate
- 4.5.2 构建controller类
- 4.6 测试消费订单模块
- 4.6.1 测试获取订单接口
- 4.6.1 测试创建订单接口
说明:本次spring cloud入门demo是做一个订单模块微服务。 1、订单微服务
本次入门demo的业务逻辑是调用订单微服务,也就是用户下单的时候,我们要调用订单微服务下单,同时我们也可以查看我们的订单。
因此订单微服务提供2个接口,一个是创建订单接口create,一个是查看订单接口get。
一开始为啥不直接开始创建订单模块?为啥不上来就开始创建实体类,controller,service这些?公共工程又是干什么的?
原因是,在创建订单模块的时候,我们会创建一个订单的实体类Payment。同理在消费订单模块中,我们还得创建这个订单实体类Payment。而以后的实际工作业务肯定远比这个demo复杂,不可能每个模块中都保存一份实体类,如果后面出现了两边不一致的情况怎么办呢?
因此第一步是先构建一个公共工程,把公用的先构建并发布出来,供其余服务使用。同理,以后一些公用的工具类等等都可以放在这个工程中。
接着在上一篇博文的基础上,建一个新module。
鼠标右键总工程cloud 2021 -> New -> Module,得到下图
选择Maven,jdk选择1.8,点击Next
填写工程名称:cloud-api-commons
点击Finish后,得到父工程cloud 2021和新建的module,如下图。注意红框中的pom文件是父工程cloud 2021的pom文件。后面的module会越来越多,不能混为一谈。
下图为2.1中新建的pom文件
添加依赖项如下:
注:如是第一次在IDEA中导入和使用lombok,那么需要先安装lombok插件。操作如下:
点击File -> Settings -> Plugins,在联网的状态下输入lombok,找到并安装上。
安装完成后,在pom文件处,鼠标右键 ->Maven -> Reload project。
我们这边没有填写版本号version,按照上一篇博文的介绍,这里会使用父工程cloud 2021中的版本1.16.18。如下图
由于无法解析maven显示无法解析1.16.18版本,因此我回到父工程处,将lombok的版本进行了修改,尝试改成1.14.0。
如下图,此时再编译cloud api commons模块时,没有再显示lombok的报错了。
本次demo的公共模块目前主要是实体类:包含订单类和公共返回类,因此需要需要在cloud api commons中新建一个包com.example.springcloud.entities
在实体中新建一个订单类:Payment
订单类中只有2个字段:id和订单号serial
在实体中新建一个公共返回类:CommonResult
接下来需要使用maven打包发布到公共库供其他模块调用公共部分。
先maven clean
然后mvn install,发布到本地库
接下来构建订单模块,如上一篇博文所述,订单服务只提供2个接口,即创建订单接口和查看订单接口。
其次,公共实体类一共也只有2个,都在第2节的cloud-api-commons中已经创建并发布到本地库中,我们只需要引入即可。
首先建一个提供服务的module模块:cloud-provider-payment-8001
该模块的端口号为8001
鼠标右键父工程cloud2021 -> New -> Module,得到下图
选择Maven,jdk选择1.8,点击Next,得到下图。
可以看到父工程为cloud2021,输入子模块名称:cloud-provider-payment-8001。
点击Finish,得到新构建的子模块:
这个时候我们可以先看下父工程cloud2021的pom文件,如下图,可以看到,父工程下面现在有2个子工程了,也就是我们在刚刚创建的2个子工程:
第二步是修改支付模块的pom文件,修改后的pom文件如下,
cloud2021 org.example.springcloud 1.0-SNAPSHOT 4.0.0 cloud-provider-payment8001 org.example.springcloud cloud-api-commons 1.0-SNAPSHOT org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator org.springframework.boot spring-boot-configuration-processor true org.mybatis.spring.boot mybatis-spring-boot-starter com.alibaba druid-spring-boot-starter 1.1.10 com.alibaba druid 1.1.10 mysql mysql-connector-java 5.1.47 org.springframework.boot spring-boot-starter-jdbc org.projectlombok lombok true 1.14.0 org.springframework.boot spring-boot-starter-test test
mvn编译成功的截图如下:
鼠标右键cloud-provider-payment-8001的resources文件夹 -> New -> File,新建application.properties:
application.properties的内容如下:
server.port=8001
spring.application.name=cloud-payment-service
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=org.gjt.mm.mysql.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springcloud?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123
mybatis.mapperLocations=classpath:mapper
public int create(Payment payment);
public Payment getPaymentById(@Param("id") Long id);
}
订单服务接口实现类PaymentServiceImpl,代码如下:
package com.example.springcloud.service.impl;
import com.example.springcloud.dao.PaymentDao;
import com.example.springcloud.entities.Payment;
import com.example.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);
}
}
3.5.6 构建controller
构建订单controller:PaymentController,代码如下:
package com.example.springcloud.controller;
import com.example.springcloud.entities.CommonResult;
import com.example.springcloud.entities.Payment;
import com.example.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(@RequestBody Payment payment) {
int result = paymentService.create(payment);
log.info("插入结果" + result);
if (result > 0) {
return new CommonResult(200, "插入数据库成功", result);
} else {
return new CommonResult(500, "插入数据失败");
}
}
@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(500, "未查询到该订单,查询id: " + id);
} else {
return new CommonResult(200, "查询成功", payment);
}
}
}
3.6 测试
3.6.1 启动服务
启动模块主启动类:PaymentMain8001。如下图,可以看到8001端口的订单服务已经启动。
创建订单类是post方法,使用postman发送一个创建订单请求,订单号是:cloth-00001
如上图所示,postman显示插入数据库成功。
如下图所示,在mysql里面确实看到了刚刚调用服务所插入的订单号:
通过查询数据库可以看到,id为3,我们可以再测试下获取订单接口:
到此,订单微服务就已经构建并测试完成。
构建消费订单模块:cloud-consumer-order-80,由于使用1024以下的端口则需要root权限,为了避免报错,我们设置消费订单模块的端口号为:8080
鼠标右键cloud2021 -> New -> Module,选择Maven,jdk选择1.8
此时,可以看到父工程下已经有3个子模块了:
消费订单模块的pom文件现在可以直接复制订单服务中的pom文件中用到的组件了,pom文件内容如下:
4.3 写yml/propertiescloud2021 org.example.springcloud 1.0-SNAPSHOT 4.0.0 cloud-consumer-order-80 8 8 org.example.springcloud cloud-api-commons 1.0-SNAPSHOT org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator org.springframework.boot spring-boot-configuration-processor true org.projectlombok lombok true 1.14.0 org.springframework.boot spring-boot-starter-test test
该服务的application.properties只需要填写服务的端口号:8080
由于我们的demo业务逻辑比较简单,因此消费订单模块的业务类中就不再需要Service,Mapper,Mysql等,因此刚刚的pom文件中也没有导入这些模块。
4.5.1 获取RestTemplate现在我们的消费订单模块要调用订单服务的接口时,由于两个模块可能部署在不同的服务器上面,因此我们需要构建远程调用Http服务的方法,此时可以使用RestTemplate。
RestTemplate提供了多种便捷访问远程http服务的方法,是一种简单便捷的访问restful服务模板类,是Spring提供的用于访问Rest服务的客户端模板工具集。
使用方式:一般仅使用3个参数:
url:rest请求地址
requestMap:请求参数
responseBean.class:http响应转换被转换成的对象类型
要获取RestTemplate,可以构建config类获取
OrderController类的代码如下:
package com.example.springcloud.controller;
import com.example.springcloud.entities.CommonResult;
import com.example.springcloud.entities.Payment;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
@RestController
@Slf4j
public class OrderController {
public static final String PAYMENT_URL = "http://localhost:8001";
@Resource
private RestTemplate restTemplate;
@GetMapping(value = "/consumer/payment/create")
public CommonResult create(Payment payment) {
return restTemplate.postForObject(PAYMENT_URL+"/payment/create", payment, CommonResult.class);
}
@GetMapping(value = "/consumer/payment/get/{id}")
public CommonResult getPayment(@PathVariable("id") Long id) {
return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id, CommonResult.class);
}
}
4.6 测试消费订单模块
启动订单服务:cloud-provider-payment-8001
和消费订单服务类:cloud-consumer-order-80
在订单接口模块中,已经创建了一个订单:{id=4, serial=cloth00001},所以我们先测试获取订单接口。
通过下图可以看到,我们调用8080端口的消费订单服务,已经成功获取到了3号订单的内容。
本次创建一个水果相关的订单:fruit-00001
由以上2图可以看到,通过8080端口,我们也成功地创建了接口。
到这里,我们就完成了spring cloud的入门demo,即通过8080端口模拟远程调用另一台服务器上的订单服务,从而完成创建订单和查看订单。



