一、概述
锁定
Namespace,可以设置ConfigDB的ServerConfig的"namespace.lock.switch"为true,开启后
配置的修改和发布是互斥的,就是你修改了配置,但是发布需要另外一个人来发布。
二、页面流程
这里我们在页面上创建一个配置项

会请求后台的item接口

另外一个人发布刚刚添加的配置项

会请求后台的release接口

2.代码流程
- 这里直接到
adminservice模块的ItemController,patrol模块的流程后续会讲。
- 这里会发现方法上增加了一个注解
@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;
}
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;
}

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

被折叠的 条评论
为什么被折叠?



