65.Seata案例-完成下单和扣除库存代码

Sesta实现分布式事务控制

  • 本示例通过Seata中间件实现分布式事务,模拟电商中的下单和扣库存的过程
  • 我们通过订单微服务下单操作,然后订单微服务调用商品微服务扣除库存


    image

案例基本代码

修改order微服务
  • Controller
@Service
@Slf4j
public class OrderServiceImplFour{

    @Qualifier("service-product")
    @Autowired
    private ProductService productService;

    @Autowired
    private OrderDao orderDao;

    public Order createOrder(Integer pid) {
        log.info("接收到{}号商品的下单请求,接下来调用商品微服务查询此商品信息", pid);

        Product product = productService.findByPid(pid);

        if (product.getPid()==-100){
            Order order = new Order();
            order.setOid(-100L);
            order.setPname("下单失败");
            return order;
        }

        log.info("查询到{}号商品的信息,内容是:{}", pid, JSON.toJSONString(product));

        //下单(创建订单)
        Order order = new Order();
        order.setUid(1);
        order.setUsername("测试用户");
        order.setPid(pid);
        order.setPname(product.getPname());
        order.setPprice(product.getPprice());
        order.setNumber(1);

        //扣库存
        productService.reduceInventory(pid,order.getNumber());
        
        orderDao.save(order);
        log.info("创建订单成功,订单信息为{}", JSON.toJSONString(order));
        return order;
    }
}
  • ProductService
/**
 * value:指定那个微服务
 * fallback:指定当前feign接口的容错类
 */
@FeignClient(
        value = "service-product"
)
public interface ProductService {
    /**
     * 扣减库存
     * @param pid 商品标识
     * @param number 扣减数量
     */
    void reduceInventory(@RequestParam("pid") Integer pid,
                         @RequestParam("number") Integer number);
}
修改Product微服务
  • Controller
@RestController
@Slf4j
public class ProductController {

    @Autowired
    private ProductService productService;

    /**
     * 扣减库存
     * @param pid
     * @param number
     */
    @RequestMapping("/product/reduceInventory")
    public void reduceInventory(Integer pid, Integer number){
        productService.reduceInventory(pid,number);
    }
}
  • ProductService
@Service
public class ProductServiceImpl implements ProductService {

    @Autowired
    private ProductDao productDao;

    @Override
    public void reduceInventory(Integer pid, Integer number) {
        Product product = productDao.findById(pid).get();
        product.setStock(product.getStock()-number);
        productDao.save(product);
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。