线程安全是同时执行,导致数据重复计算,比如减去库存问题;解决方案:如果加锁,锁还是基于jvm,那么分布式还是会存在线程安全问题;分布式锁,基于rollkeeper,
利用UPDATE tb_stock SET stock = stock - #{num} WHERE sku_id = #{id} AND stock >= #{num};数据库的条件库存减去一;mysql查询是行锁,更新是表锁,sync之后将是表锁;
不在java代码中做并发的考虑而是使用mysql;
Feign使用demo:
订单服务代码:
GoodsApi类的 goodsService.decreaseStock(cartDTOS);
@FeignClient("item-service")//创建对象和HTTP调用
public interface GoodsClient extends GoodsApi{
}
生产者的代码
public interface GoodsApi {
@PostMapping("stock/decrease")
void decreaseStock(@RequestBody List<CartDTO> cartDTOS);
}
web内
@PostMapping("stock/decrease")
public ResponseEntity<Void> decreaseStock(@RequestBody List<CartDTO> cartDTOS){
goodsService.decreaseStock(cartDTOS);//
return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
}
并发问题,同时执行,可以靠着数据库去实现;分布式事务问题:跨域服务的事务,异步不会回滚;需要保证事务的一致性,解决分布式的事务三种方案:
1:分步执行,先确定没有异常,主体接收客体们的消息,然后主体发送消息让客体门提交到数据库;
2:提交补偿业务:
主体接收客体men的消息后,有异常则执行客体们的补偿业务;不再回滚业务,还有可能补偿失败而执行的重试问题,
3:mq的异步确保,消息不丢失之下的消费者的不断重试直到成功;
将对象转为xml格式;
将作为参数的xml转为对象时,可以
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.9.5</version>
</dependency>
@PostMapping(value = "pay",produces = "application/xml")//声明返回结果为xml类型
public Map<String,String> hello(@RequestBody Map<String,String> result){//在pom文件中引入了xml解析器
未支付、支付成功、支付失败;前端的定时任务不断的在查,微信可能调用多次通知;
部署到docker、即虚拟机,先打包
git pull origin
第三步:打包代码
mvn clean package
tail -f ../logs/talentweb.log