Skip to content

xvmingyuan/shop

Repository files navigation

微服务模式订单支付系统

应用技术: SpringBoot
         Mybatis
         Dubbo
         RocketMQ
         Zookeeper
         MySQL
应用工具: Twitter-Snowflake
         RestTemplate

注意事项:

1. mybatis 逆向工程数据表名字不能太通用,容易引起于系统表名冲突
    正例:  shop_user
    反例:  user 
    
2. mybatis 逆向工程 *.xml文件生成是追加式添加,在重新生成 *.xml 时,建议删除原 *.xml
    xml内容重复,会抛出异常:java.lang.IllegalArgumentException: Result Maps collection already contains
    
3. pojo类 需要继承Serializable,才可以使用dubboRPC通信

4. mapper接口 需要添加注解 @Mapper
 
5. service.impl 服务需要添加:
    @Component :添加注解 'spring @Service' , 使用原因: 避免与dubbo @Service冲突
    @Service(interfaceClass = xxxxxxService.class) :该 service 为dubbo service
    
6. application 需要添加Dubbo配置 @EnableDubboConfiguration

7. 微服务模式下 dubbo.protocol端口不能重复,否则启动报错

8. 库存回退和扣减均存在并发问题,解决:
    方案1: 数据库乐观锁
    方案2: MQ+数据库乐观锁
    方案3: 引入分布式锁(Redis Zookeeper) (未使用)
    
9. 8中解决方案2存在库存不足时,需要通过MQ异步通知订单服务问题

10. RocketMQ分布式事务:
    方案1: rocketmq-client (推荐)
    方案2: rocketmq-spring-boot-starter(2.0.3) (事务有问题,未解决..)
    
    方案2问题测试:
        rocketMQTemplate.sendMessageInTransaction 方法发送的消息,
        在继承RocketMQLocalTransactionListener的类下方法
        executeLocalTransaction中的,RocketMQLocalTransactionState.ROLLBACK 状态回滚无效,
        消息仍然会被投递到方法 checkLocalTransaction,经过测试
        在checkLocalTransaction 执行RocketMQLocalTransactionState.ROLLBACK也不能回滚消息,
        消息被发送到队列,导致消费者消费了回滚消息.
        
    同类方案1中测试:
        TransactionMQProducer 的继承 TransactionListener的类下方法
        executeLocalTransaction中的,LocalTransactionState.ROLLBACK_MESSAGE 回滚消息,
        并不会将消息投递到方法 checkLocalTransaction,
        在消费者端消费不到回滚消息

About

SpringBoot Dubbo RocketMQ订单支付系统

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages