Spring|Spring Cloud(2020.0.3) | 从入门到入土 - 3. 微服务远程调用

上一篇我们将基础的微服务项目搭建完成,这一篇我们主要来看一下,服务之间如何去调用。
一、订单模块 (pom、application.yml 自己去配置啊,配置文件上一讲是有的)
首先我们去创建一个接口,创建订单的接口。
Spring|Spring Cloud(2020.0.3) | 从入门到入土 - 3. 微服务远程调用
文章图片

【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,去创建订单。
Spring|Spring Cloud(2020.0.3) | 从入门到入土 - 3. 微服务远程调用
文章图片

来看上面的代码。其实这里我们就需要用到商品模块给我们提供一个服务,通过商品主键id,然后找到商品,返回商品价格。
我们先去商品模块将这个接口定义好。
Spring|Spring Cloud(2020.0.3) | 从入门到入土 - 3. 微服务远程调用
文章图片

接口定义好之后,我们来看看如何去进行远程调用!
二、远程调用接口 远程接口调用,我们这里是用的 RestTemplate。
这个东西是 SpringBoot 给我们带的一个 HTTP 协议,支持 RestFul 接口的远程调用模式。
RestTemplate 可以发送 POST、GET、PUT 等,多种协议,说白了,这玩意其实就是模拟了 httpClient。
我们这里来简单用一下,后期我们不会深入学习它,有兴趣的同学可以自己去找一些资料进行学习。
使用的话,我们就在订单模块的启动类中,添加一个 Bean。
Spring|Spring Cloud(2020.0.3) | 从入门到入土 - 3. 微服务远程调用
文章图片

三、引入 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 进行测试,不会的自己去学习一下。
Spring|Spring Cloud(2020.0.3) | 从入门到入土 - 3. 微服务远程调用
文章图片

来看一下数据库
Spring|Spring Cloud(2020.0.3) | 从入门到入土 - 3. 微服务远程调用
文章图片

Spring|Spring Cloud(2020.0.3) | 从入门到入土 - 3. 微服务远程调用
文章图片

是没有问题的,商品 b 是辣条,我们购买了 2 个,一个辣条 2.5,金额是 5 元。另外一个是棒棒糖,一个 0.5 元,我们购买了 5 个,金额是 2.5元。
这样的话,我们就通过远程调用实现了我们的创建订单。

这一讲就讲到这里,有问题可以联系我:QQ 2100363119,欢迎大家访问我的个人网站:https://www.lemon1234.com
最近网站已经做好,并且已经上线,欢迎各位留言~~

    推荐阅读