Apollo源码解析——锁定Namespace

本文介绍了一种配置管理系统中实现配置锁定的方法,通过数据库层面的唯一性约束确保配置修改与发布互斥,避免同一配置被同一用户修改及发布。


一、概述

锁定Namespace,可以设置 ConfigDBServerConfig"namespace.lock.switch" true,开启后
配置的修改和发布是互斥的,就是你修改了配置,但是发布需要另外一个人来发布。

二、页面流程

这里我们在页面上创建一个配置项
在这里插入图片描述
会请求后台的item接口
在这里插入图片描述

另外一个人发布刚刚添加的配置项
在这里插入图片描述
会请求后台的release接口
在这里插入图片描述

2.代码流程

  1. 这里直接到adminservice模块的ItemController ,patrol模块的流程后续会讲。
  1. 这里会发现方法上增加了一个注解 @PreAcquireNamespaceLock,与之对应存在一个切面来切这个注解。
  @PreAcquireNamespaceLock
  @PostMapping("/apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/items")
  public ItemDTO create(@PathVariable("appId") String appId,
                        @PathVariable("clusterName") String clusterName,
                        @PathVariable("namespaceName") String namespaceName, @RequestBody ItemDTO dto) {
   
   
    // 将 ItemDTO 转换成 Item 对象
    Item entity = BeanUtils.transform(Item.class, dto);

    //创建 ConfigChangeContentBuilder 对象
    ConfigChangeContentBuilder builder = new ConfigChangeContentBuilder();
    //校验对应的 Item 是否已经存在。若是,抛出异常
    Item managedEntity = itemService.findOne(appId, clusterName, namespaceName, entity.getKey());
    if (managedEntity != null) {
   
   
      throw new BadRequestException("item already exists");
    }
    //保存Item对象
    entity = itemService.save(entity);
    //添加到 ConfigChangeContentBuilder
    builder.createItem(entity);
    //将 item 转换成 ItemDTO对象
    dto = BeanUtils.transform(ItemDTO.class, entity);

    //创建commit对象
    Commit commit = new Commit();
    commit.setAppId(appId);
    commit.setClusterName(clusterName);
    commit.setNamespaceName(namespaceName);
    commit.setChangeSets(builder.build());
    commit.setDataChangeCreatedBy(dto.getDataChangeLastModifiedBy());
    commit.setDataChangeLastModifiedBy(dto.getDataChangeLastModifiedBy());
    commitService.save(commit);

    return dto;
  }
  1. NamespaceAcquireLockAspect

这里直接调用acquireLock尝试锁定

@Aspect
@Component
public class NamespaceAcquireLockAspect {
   
   
  private static final Logger logger = LoggerFactory.getLogger(NamespaceAcquireLockAspect.class);

  private final NamespaceLockService namespaceLockService;
  private final NamespaceService namespaceService;
  private final ItemService itemService;
  private final BizConfig bizConfig;

  public NamespaceAcquireLockAspect(
      final NamespaceLockService namespaceLockService,
      final NamespaceService namespaceService,
      final ItemService itemService,
      final BizConfig bizConfig) {
   
   
    this.namespaceLockService = namespaceLockService;
    this.namespaceService = namespaceService;
    this.itemService = itemService;
    this.bizConfig = bizConfig;
  }


  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值