在dianshang-business-provider
模块中,编写OrderApi
接口实现类,如下:
@Service(interfaceClass = OrderApi.class) @Component public class OrderProvider implements OrderApi { @Autowired private OrderService orderService; @Override public List<OrderVo> queryOrderByUserId(String userId) { QueryWrapper<Order> queryWrapper = new QueryWrapper<Order>(); queryWrapper.eq("user_id",userId); List<Order> sourceList = orderService.list(queryWrapper); if(!CollectionUtils.isEmpty(sourceList)){ List<OrderVo> voList = new ArrayList<>(); for (Order order : sourceList) { OrderVo vo = new OrderVo(); BeanUtils.copyProperties(order, vo); voList.add(vo); } return voList; } return null; } }
至此,3个项目的服务暴露接口已经开发完成!接下来我们来编写怎么进行远程调用!
5.6、远程调用
5.6.1、编写创建订单服务
在dianshang-business-provider
模块中,编写创建订单接口之前,先依赖dianshang-business-api
和dianshang-user-api
,如下:
<!--商品服务接口暴露 api--> <dependency> <groupId>org.project.demo</groupId> <artifactId>dianshang-platform-api</artifactId> <version>1.0.0</version> </dependency> <!--用户服务接口暴露 api--> <dependency> <groupId>org.project.demo</groupId> <artifactId>dianshang-user-api</artifactId> <version>1.0.0</version> </dependency>
在dianshang-business-provider
模块中,编写创建订单服务,如下:
@RestController @RequestMapping("/order") public class OrderController { @Autowired private OrderService orderService; @Autowired private OrderDetailService orderDetailService; @Reference(check =false) private ProductApi productApi; @Reference(check =false) private UserApi userApi; /** * 新增 */ @JwtIgnore @RequestMapping(value = "/add") public boolean add(String productId,String userId){ LocalAssert.isStringEmpty(productId,"产品Id不能为空"); LocalAssert.isStringEmpty(userId,"用户Id不能为空"); ProductVo productVo = productApi.queryProductInfoById(productId); LocalAssert.isObjectEmpty(productVo,"未查询到产品信息"); UserVo userVo = userApi.findUserById(userId); LocalAssert.isObjectEmpty(userVo,"未查询到用户信息"); Order order = new Order(); order.setOrderId(IdGenerator.uuid()); order.setOrderNo(System.currentTimeMillis() + ""); order.setOrderPrice(productVo.getProductPrice()); order.setUserId(userId); order.setOrderTime(new Date()); orderService.save(order); OrderDetail orderDetail = new OrderDetail(); orderDetail.setOrderDetailId(IdGenerator.uuid()); orderDetail.setOrderId(order.getOrderId()); orderDetail.setProductId(productId); orderDetail.setSort(1); orderDetailService.save(orderDetail); return true; } }
其中的@Reference
注解,是属于org.apache.dubbo.config.annotation.Reference
下的注解,表示远程依赖服务。
参数参数check =false
表示启动服务时,不做远程服务状态检查,这样设置的目的就是为了防止当前服务启动不了,例如用户中心项目没有启动成功,但是订单中心又依赖了用户中心,如果,此时订单中心启动会报错!
5.6.2、编写用户查询自己的订单信息
同样的,在dianshang-user-provider
模块中,编写用户查询自己的订单信息接口之前,先依赖dianshang-business-api
和dianshang-user-api
,如下:
<dependency> <groupId>org.project.demo</groupId> <artifactId>dianshang-business-api</artifactId> <version>1.0.0</version> </dependency> <dependency> <groupId>org.project.demo</groupId> <artifactId>dianshang-user-api</artifactId> <version>1.0.0</version> </dependency>
在dianshang-user-provider
模块中,编写用户查询自己的订单信息接口,如下:
@RestController @RequestMapping("/user") public class UserController { @Reference(check =false) private OrderApi orderApi; /** * 通过用户ID,查询订单信息 * @param userId * @return */ @RequestMapping("/list") public List<OrderVo> queryOrderByUserId(String userId){ return orderApi.queryOrderByUserId(userId); } }
至此,远程服务调用,编写完成!
六、服务测试
在将项目部署在服务器之前,咱们先本地测试一下,看服务是否都可以跑通?
- 启动用户中心
dianshang-user-provider
- 继续启动商品中心
dianshang-platform-provider
- 接着启动订单中心
dianshang-business-provider
最后,我们来测试一下服务接口是否为我们预期的结果?
打开浏览器,输入http://127.0.0.1:8082/order/add?productId=1&userId=1
测试创建订单接口,页面运行结果显示正常!
我们再来看看数据库,订单是否生成?
ok!很清晰的看到,数据已经进去了,没啥问题!
我们再来测试一下在用户中心订单查询接口,输入http://127.0.0.1:8080/user/list?userId=1
,页面运行结果如下!
到此,本地服务测试基本通过!