前言

Nacos 作为微服务领域的基础设施,一直以来以服务发现和配置管理两大核心功能著称。在 3.0 版本中,Nacos 新增了第三个重要功能 - 分布式锁,进一步完善了其微服务治理能力。本文将深入介绍这一新特性的使用方法、实现原理及最佳实践。

功能特性

Nacos 3.0 分布式锁具有以下特点:

  • 轻量级:无需额外部署 Redis 或 ZooKeeper
  • 高可用:基于 Nacos 集群实现,天然支持高可用
  • 性能优异:采用异步非阻塞模型
  • 使用简单:开箱即用,支持注解和编程式使用
  • 可扩展:提供 SPI 扩展机制

快速开始

1. 添加依赖

<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-client</artifactId>
    <version>3.0.0</version>
</dependency>

2. 配置 Nacos 服务

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      username: nacos
      password: nacos

3. 使用分布式锁

注解方式

@NacosLock(name = "order-lock-", key = "#orderId")
public void processOrder(String orderId) {
    // 业务处理逻辑
}

编程式使用

@Autowired
private NacosLockService lockService;

public void businessMethod() {
    String lockKey = "business-lock";
    try {
        if (lockService.tryLock(lockKey, 5, TimeUnit.SECONDS)) {
            // 获取锁成功,执行业务逻辑
            try {
                // 处理业务
            } finally {
                lockService.unlock(lockKey);
            }
        }
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    }
}

实现原理

Nacos 分布式锁基于 CP 协议实现,主要包含以下核心组件:

  1. Lock Manager: 负责锁的创建、获取和释放
  2. Lock Protocol: 基于 Raft 协议实现的一致性保证
  3. Lock Storage: 分布式锁状态存储

工作流程:

  1. Client 发起加锁请求
  2. Leader 节点接收请求并同步到 Follower
  3. 达成共识后完成加锁
  4. 返回加锁结果

性能对比

与主流分布式锁方案对比:

特性Nacos LockRedis LockZooKeeper Lock
一致性CPAPCP
性能极高中等
可靠性中等
部署成本中等
使用难度简单简单较复杂

高级特性

1. 锁续期

@NacosLock(name = "long-task-lock", watchDogTimeout = 30000)
public void longRunningTask() {
    // 长时间运行的任务
}

2. 公平锁

@NacosLock(name = "fair-lock", fair = true)
public void fairLockMethod() {
    // 公平锁保证先来先得
}

3. SPI 扩展

Nacos 分布式锁提供了灵活的 SPI 扩展机制,主要通过以下几个核心接口和类来实现:

1. 实现 LockFactory 接口

public class CustomLockFactory implements LockFactory {
    @Override
    public String getLockType() {
        // 返回自定义锁类型标识
        return "custom-lock";
    }
    
    @Override
    public AtomicLock createLock(LockInfo lockInfo) {
        // 创建自定义的锁实现
        return new CustomAtomicLock(lockInfo);
    }
}

2. 实现 AbstractAtomicLock 抽象类

public class CustomAtomicLock extends AbstractAtomicLock {
    
    public CustomAtomicLock(LockInfo lockInfo) {
        super(lockInfo);
    }
    
    @Override
    public Boolean lock(LockService lockService) throws NacosException {
        // 实现自定义加锁逻辑
        return lockService.remoteTryLock(this);
    }
    
    @Override
    public Boolean unLock(LockService lockService) throws NacosException {
        // 实现自定义解锁逻辑
        return lockService.remoteReleaseLock(this);
    }
}

3. 注册 SPI 服务

resources/META-INF/services 目录下创建文件: com.alibaba.nacos.lock.factory.LockFactory,内容为自定义工厂的全限定类名:

com.pig4cloud.nacos.test.CustomLockFactory

4. 使用自定义锁

@Autowired
private NacosLockService lockService;

public void businessMethod() {
    LockInfo lockInfo = new LockInfo();
    lockInfo.setLockType("custom-lock"); // 使用自定义的锁类型
    lockInfo.setKey("business-key");
    
    try {
        if (lockService.tryLock(lockInfo)) {
            try {
                // 业务逻辑
            } finally {
                lockService.unlock(lockInfo);
            }
        }
    } catch (NacosException e) {
        // 异常处理
    }
}

通过 SPI 扩展机制,你可以:

    1. 实现自定义的锁获取和释放策略
    1. 添加自定义的锁状态监控
    1. 扩展锁的行为(如添加重试机制)
    1. 集成其他分布式锁实现(如 Redis、ZooKeeper)

总结

Nacos 3.0 分布式锁为微服务架构提供了一个优秀的解决方案。它不仅易用性好,而且性能优异,是构建分布式系统的理想选择。在实际使用中,需要结合业务场景合理使用,遵循最佳实践,以获得最佳效果。

参考资料