分布式系统幂等性设计及其服务端和消费端代码实现JAVA

分布式Id获取

@DubboService(version="1.0.0",group="distributed-uuid-server")
public class DistributedServiceImpl implements DistributedService{
  @Autowired
  private Snowflakeconfig snowflakeConfig;
  Map<String,SnowFlake> snowFlakeHandlerMap = new ConcurrentHashMap<>();
  //使用由分布式发号器调用方自定义的数据中心ID和机器ID
  @Override
  public long nextId(final long datacenterId,final long machineId){
    final long sdatacenterId = datacenterId;
    final long smachineId = machineId;
    final String handler = sdatacenterId+"_"+smachineId;
    SnowFlake snowFlake;
    //缓存中获取snowFlake对象
    if(snowFlakeHandlerMap.containsKey(handler)){
      snowFlake = snowFlakeHandlerMap.get(handler);
      return snowFlake;
    }else{
      //如果没有命中缓存,则新建一个snowFlake对象,存储在本地缓存当中
      snowFlake = new SnowFlake(datacenterId,machineId);
      snowFlakeHandlerMap.putifAbsent(handler,snowFlake);
    return snowFLake.nextId();
    }
  }
  
  @Override
  public long nextId(){
    //从配置中心获取制定的数据中心Id和机器Id
    List<SnowFlakeInfo> config = snowFlakeCongig.getConfig();
    String localAddress = NetUtils.getLocalAddress();
    SnowFlakeInfo snowFlakeInfo = config.stream().filter(s->Objects.equals(s.getIp(),localAddress)).findFirst().orElse(null);
    long dataCenterId = Optional.ofNullable(snowFlakeInfo).map(SnowFlakeINfo::getDatacenterId).orElse(0L);
    long machineId = Optional.ofNullable(snowFlakeInfo).map(SnowFlakeInfo::getMachineId).orElse(0L);
    return nextId(dataCenterId,machineId);
  }
}

消费者服务

@RestController("/good")
public class GoodController{
  
  //依赖服务提供者
  @DubboReference(version="1.0.0",group="idempotent-design-user-server",retries=4,timeout=1)

  private GoodService goodService;
  //依赖分布式发号器服务
  @DubboReference
  private DistributeService distributeService;
  //幂等性设计全局相关
  @Autowired
  private NacosConfig nacosConfig;

  @PostMapping("/updateGoodsNum")
  @ResponseBody
  public DefaultResult<GoodsDTO> updateGoodsNum(@RequestPatam Stirng goodId){
    //获取分布式服务id
    long uuid = distributeService.nextId(7,8);
    GoodsServiceRequest<ProductBo> request
    = new GoodsServiceRequest<>();
    ProductBo b0 = new ProductBo();
    bo.setGoodsId(Long.valueOf(goodId));
    request.setRequestData(bo);
    if(nacosConfig.isMideng()){
      request.setUuid(uuid+"");
    }
    return goodService.updateGoodNum(request);

  }

}

服务提供

@DubboService(version="1.0.0",group="xxx")
public class GoodsServiceImpl implements GoodService{
...
//判断是否开启幂等校验
if(!StringUtils.isEmpty(goodsServiceRequest.getUuid())){
  long uuid = Long.parseLong(goodServiceRequest.getUuid());
  if(null != redisTemplate.opsForValue().get(uuid)){
    result.setData(new GoodDTO());
    result.setMessage("asdfs");
    return result;
  }else{
    redisTemplate.opsForValue().set(uuid,true,2,TimeUnit.SECONDS);
  }

}


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值