上一篇我们将基础的微服务项目搭建完成,这一篇我们主要来看一下,服务之间如何去调用。
一、订单模块 (pom、application.yml 自己去配置啊,配置文件上一讲是有的)
首先我们去创建一个接口,创建订单的接口。
文章图片
【Spring|Spring Cloud(2020.0.3) | 从入门到入土 - 3. 微服务远程调用】主要来看一下 CreateOrderDTO 的参数。
public class CreateOrderDTO { // 订单人 id (默认用户 a)
private String userId;
private List commodityList;
public String getUserId() {
return userId;
} public void setUserId(String userId) {
this.userId = userId;
} public List getCommodityList() {
return commodityList;
} public void setCommodityList(List commodityList) {
this.commodityList = commodityList;
} public static class DTO {
// 商品 id
private String commodityId;
// 商品数量
private Integer commodityCount;
public String getCommodityId() {
return commodityId;
}public void setCommodityId(String commodityId) {
this.commodityId = commodityId;
}public Integer getCommodityCount() {
return commodityCount;
}public void setCommodityCount(Integer commodityCount) {
this.commodityCount = commodityCount;
} }
}
其实很简单,接着我们来循环这个 DTO,去创建订单。
文章图片
来看上面的代码。其实这里我们就需要用到商品模块给我们提供一个服务,通过商品主键id,然后找到商品,返回商品价格。
我们先去商品模块将这个接口定义好。
文章图片
接口定义好之后,我们来看看如何去进行远程调用!
二、远程调用接口 远程接口调用,我们这里是用的 RestTemplate。
这个东西是 SpringBoot 给我们带的一个 HTTP 协议,支持 RestFul 接口的远程调用模式。
RestTemplate 可以发送 POST、GET、PUT 等,多种协议,说白了,这玩意其实就是模拟了 httpClient。
我们这里来简单用一下,后期我们不会深入学习它,有兴趣的同学可以自己去找一些资料进行学习。
使用的话,我们就在订单模块的启动类中,添加一个 Bean。
文章图片
三、引入 RestTemplate 这里我们在订单模块中引入 RestTemplate。
@RestController
@RequestMapping("/orders")
public class OrderController { @Autowired
private OrderService orderService;
@Autowired
private OrderDetailService orderDetailService;
@Autowired
private RestTemplate restTemplate;
@PostMapping("/createOrder")
public Result createOrder(@RequestBody CreateOrderDTO createOrderDTO) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
Date date = new Date();
// 存储订单
Orders orders = new Orders();
orders.setCreateDt(date);
orders.setNo(sdf.format(new Date()));
orders.setUserId(createOrderDTO.getUserId());
orderService.save(orders);
// 生成订单详情
List commodityList = createOrderDTO.getCommodityList();
for(CreateOrderDTO.DTO dto : commodityList) {
// 商品 id
String commodityId = dto.getCommodityId();
OrderDetail orderDetail = new OrderDetail();
orderDetail.setOrderId(orders.getId());
orderDetail.setCommodityId(commodityId);
orderDetail.setCommodityCount(dto.getCommodityCount());
// TODO 这里需要去查询商品的价格,然后乘以数量,得到价钱。
BigDecimal price = restTemplate.getForObject("http://localhost:1000/commodity/getCommodityPrice/" + commodityId, BigDecimal.class);
orderDetail.setCommodityPirce(price.multiply(BigDecimal.valueOf(dto.getCommodityCount())).setScale(2, BigDecimal.ROUND_FLOOR));
orderDetailService.save(orderDetail);
}return Result.success();
}
}
可以发现很简单, getForObject 方法需要提供两个参数,一个是要请求的 url,还有一个是接口返回值类型。
写完之后,我们来测试一下,!!!记得也要启动商品模块,不然远程调用会失败的。
我们这里使用 Postman 进行测试,不会的自己去学习一下。
文章图片
来看一下数据库
文章图片
文章图片
是没有问题的,商品 b 是辣条,我们购买了 2 个,一个辣条 2.5,金额是 5 元。另外一个是棒棒糖,一个 0.5 元,我们购买了 5 个,金额是 2.5元。
这样的话,我们就通过远程调用实现了我们的创建订单。
这一讲就讲到这里,有问题可以联系我:QQ 2100363119,欢迎大家访问我的个人网站:https://www.lemon1234.com
最近网站已经做好,并且已经上线,欢迎各位留言~~
推荐阅读
- 云原生|【微服务~远程调用】RestTemplate基本操作快速入门
- 微服务|微服务(nacos配置管理&&feign远程调用&&Gateway服务网关)
- 微服务springcloud|SpringCould 快速入门二(nacos配置和Fegin远程调用)
- springMVC
- springboot|springboot框架(9):SSMP综合开发
- 跑通SpringBoot + dubbo + zookeeper
- java|纯 Java 撸个后台管理系统,这框架用起来贼好
- spring|SpringCloud微服务全家桶
- Springboot+thymeleaf+IDEA——在html内写变量时,IDEA 在每个变量下有红色的波浪线,如何解决