利用springboot+dubbo,构建分布式微服务,全程注解开发(四)

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-apidianshang-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-apidianshang-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

利用springboot+dubbo,构建分布式微服务,全程注解开发(四)

  • 继续启动商品中心dianshang-platform-provider

利用springboot+dubbo,构建分布式微服务,全程注解开发(四)

  • 接着启动订单中心dianshang-business-provider

利用springboot+dubbo,构建分布式微服务,全程注解开发(四)

最后,我们来测试一下服务接口是否为我们预期的结果?

打开浏览器,输入http://127.0.0.1:8082/order/add?productId=1&userId=1测试创建订单接口,页面运行结果显示正常!

利用springboot+dubbo,构建分布式微服务,全程注解开发(四)我们再来看看数据库,订单是否生成?

利用springboot+dubbo,构建分布式微服务,全程注解开发(四)


ok!很清晰的看到,数据已经进去了,没啥问题!

我们再来测试一下在用户中心订单查询接口,输入http://127.0.0.1:8080/user/list?userId=1,页面运行结果如下!

利用springboot+dubbo,构建分布式微服务,全程注解开发(四)

到此,本地服务测试基本通过

上一篇:[译] 再谈 CSS 中的代码味道


下一篇:Java动态代理机制和实现原理详解