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

上一篇我们将基础的微服务项目搭建完成,这一篇我们主要来看一下,服务之间如何去调用。

一、订单模块

(pom、application.yml 自己去配置啊,配置文件上一讲是有的)

首先我们去创建一个接口,创建订单的接口。

主要来看一下 CreateOrderDTO 的参数。

public class CreateOrderDTO {

	// 订单人 id (默认用户 a)
	private String userId;
	
	private List<DTO> commodityList;
	
	public String getUserId() {
		return userId;
	}

	public void setUserId(String userId) {
		this.userId = userId;
	}

	public List<DTO> getCommodityList() {
		return commodityList;
	}

	public void setCommodityList(List<DTO> 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<DTO> 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

最近网站已经做好,并且已经上线,欢迎各位留言~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

他 他 = new 他()

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值