软件开发进阶技能之分布式与高并发(三)

简介: 教程来源 本节详解分布式系统核心机制:第七部分聚焦分布式锁,对比Redis(含Redisson)、ZooKeeper、数据库三种实现,强调安全性与可靠性;第八部分阐述微服务治理,涵盖注册发现、配置中心、负载均衡及Sentinel熔断降级限流,助力构建高可用分布式架构。

第七部分:分布式锁 —— 共享资源的安全访问

在分布式环境中,多个进程(或线程)需要互斥地访问共享资源(如库存扣减、定时任务执行),就需要分布式锁。

7.1 基于 Redis 的分布式锁
Redis 的 SET NX EX 命令可以实现简单的锁。

基础版本:

String lockKey = "lock:product:1001";
String requestId = UUID.randomUUID().toString();
// 设置键和值,只有不存在时才成功,并设置过期时间 30 秒
Boolean success = redis.setnx(lockKey, requestId, 30, TimeUnit.SECONDS);
if (success) {
    try {
        // 执行业务逻辑
    } finally {
        // 释放锁:使用 Lua 脚本保证原子性(先判断再删除)
        String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
        redis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));
    }
}

问题:单点故障。如果 Redis 主从切换,锁可能丢失。Redlock(Redis 作者提出)使用多个独立 Redis 节点,多数派加锁,但争议较大(时钟漂移、GC 停顿导致锁失效)。

推荐:使用 Redisson 框架,它封装了看门狗(Watchdog)自动续期机制,避免锁过期任务未完成。

RLock lock = redisson.getLock("myLock");
lock.lock(10, TimeUnit.SECONDS);
try {
    // ...
} finally {
    lock.unlock();
}

7.2 基于 ZooKeeper 的分布式锁
ZooKeeper 通过临时顺序节点实现锁:每个客户端在锁节点下创建临时顺序节点,序号最小的获得锁。监听前一个节点的删除事件,实现公平锁。

优点:强一致性(ZAB 协议),无单点问题,自带心跳检测防止死锁。缺点:性能比 Redis 低(适合并发量不太高的场景)。

7.3 基于数据库的唯一索引
利用数据库唯一键约束作为锁:执行 INSERT INTO distributed_lock(lock_key, node_id) VALUES ('key', 'node1'),成功表示获得锁,删除即释放。性能差,但简单可靠。

第八部分:服务治理与微服务 —— 管理分布式系统的“千军万马”

当服务数量膨胀到几十上百个,需要一套治理体系来管理服务注册、发现、配置、路由、容错、监控。

8.1 服务注册与发现
服务启动时将自己的地址注册到注册中心(如 Nacos、Eureka、Consul、ZooKeeper),消费者从注册中心获取提供者列表,实现动态感知。

Nacos 使用示例(Spring Cloud Alibaba):

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
@RestController
public class ConsumerController {
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/call")
    public String call() {
        // 使用服务名调用,Ribbon 进行负载均衡
        return restTemplate.getForObject("http://service-provider/hello", String.class);
    }
}

8.2 配置中心
集中管理各环境配置,修改配置动态生效(无需重启)。Nacos Config、Apollo、Consul Key/Value 都是主流。

Apollo 示例:

@Value("${timeout:100}")
private int timeout;

// 配置自动热更新
@ApolloConfigChangeListener
public void onChange(ConfigChangeEvent changeEvent) {
    // 刷新相关 Bean
}

8.3 服务调用与负载均衡
除了 RestTemplate + Ribbon,也可以使用声明式 HTTP 客户端 Feign:

@FeignClient(name = "user-service", fallback = UserFallback.class)
public interface UserClient {
    @GetMapping("/user/{id}")
    User getUser(@PathVariable("id") Long id);
}

8.4 熔断、降级、限流 —— Hystrix / Sentinel
这三种手段是保障分布式系统韧性的核心模式。

熔断(Circuit Breaker)
当某个服务调用失败率达到阈值(如 50%),断路器打开,后续请求直接快速失败或走降级逻辑,避免级联故障。经过一段时间,允许少量请求通过测试服务是否恢复(半开状态)。

降级(Fallback)
当服务不可用或系统负载过高时,提供有损的替代响应(如返回缓存数据、友好提示)。降级可在客户端或服务端实现。

限流(Rate Limiting)
限制单位时间内的请求数量,超过阈值则拒绝服务(返回 429 Too Many Requests)或排队等待。常见算法:令牌桶、漏桶、计数器。

Sentinel 实战

@SentinelResource(value = "getUser", blockHandler = "handleBlock", fallback = "getUserFallback")
public User getUser(Long id) {
    // 业务逻辑
}

public User handleBlock(Long id, BlockException ex) {
    // 限流或熔断时的处理
    return new User(-1L, "系统繁忙");
}

public User getUserFallback(Long id, Throwable t) {
    // 所有异常的处理(包括业务异常)
    return new User(-1L, "服务降级");
}

配置限流规则:

List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource("getUser");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(100);  // 每秒 100 QPS
rules.add(rule);
FlowRuleManager.loadRules(rules);

来源:
https://rvtst.cn/

相关文章
|
18天前
|
人工智能 自然语言处理 文字识别
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
Qwen3.7-Max是阿里云百炼面向智能体时代推出的新一代旗舰模型,对标GPT-5.5、Claude Opus 4.7等闭源旗舰。该模型支持百万级token上下文窗口,具备顶级推理能力、多模态搜索与视觉理解增强、流式输出低延迟响应等核心优势,覆盖编程、办公、长周期自主执行等复杂场景。同时支持OpenAI接口兼容,便于系统快速迁移。用户可通过Token Plan团队或节省计划等订阅方式灵活调用,适合企业级高要求场景使用。
6837 30
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
|
3天前
|
数据采集 人工智能 前端开发
让 Coding Agent 从黑盒到透明:阿里云 Agent 观测审计数据采集实践
AI Agent 规模化落地带来执行黑盒、行为难追溯、成本难度量三大难题。阿里云基于 OTel 标准,面向 Coding Agent、个人通用助理和框架型 Agent,推出 LoongSuite Pilot、插件及探针等无侵入采集方案,让 Agent 实现可看见、可分析、可审计、可治理。
605 138
|
3天前
|
人工智能 弹性计算 运维
阿里云发布堡垒机智能运维Agent,运维交互进入自然语言新时代
支持自然语言运维,提升效率与安全双保障。
1145 0
|
10天前
|
人工智能 安全 定位技术
CodeGraph深度解析 让Claude Code工具调用直降七成的核心原理与实操教程
如今以Claude Code为代表的AI编程智能体已经成为开发者日常编码、项目重构、漏洞修复的必备工具。但在长期使用过程中,几乎所有开发者都会遇到同一个明显痛点:AI虽然具备强大的代码生成与分析能力,却常常陷入盲目探索的循环中。
1173 1
|
13天前
|
存储 定位技术 数据库
CodeGraph 如何让 Claude Code减少 7 成工具调用?
CodeGraph 为 Coding Agent 提供本地代码知识图谱,把函数、类、调用链和框架路由提前整理成“项目地图”,减少盲目搜索和文件读取。它不是新 Agent,而是上下文基础设施,让 Agent 更快找到正确代码路径,平均减少 7 成工具调用。
1273 3
|
11天前
|
人工智能 弹性计算 安全
阿里云618活动时间、活动入口、优惠活动详细解读
2026年阿里云618创新加速季已全面开启,作为年度力度最大的云产品促销活动,本次大促覆盖轻量应用服务器、ECS云服务器、GPU云服务器、数据库、AI算力、安全服务、CDN等全品类产品,推出5亿元算力补贴、新用户限时秒杀、普惠满减、企业专享、免费试用、云大使返佣等多重福利,个人开发者、中小企业、AI团队均可享受专属低价。本文将系统梳理2026年阿里云618活动的完整时间节点、官方参与入口、各类优惠细则、使用规则、热门产品推荐及实操代码,帮助用户精准参与、高效省钱,以最低成本完成上云部署。
982 5
|
9天前
|
人工智能 自然语言处理 安全
Vibe Coding 实战:别盲目跟风,先分清 vibe coding 适合什么场景
本文系统总结vibe coding实战经验:明确其适用场景(原型、小工具、标准化模块),剖析5步落地流程(场景判定→结构化提示词→目录初始化→分模块生成→自动化校验),指出四大常见误区,并推荐适配工具Trae。强调“场景匹配+规则前置”是提效关键,避免盲目套用。
806 1