当前位置: 首页 > news >正文

中国互联网协会官方网站贵阳网站建设费用

中国互联网协会官方网站,贵阳网站建设费用,碑林区营销型网站建设,php网站开发建设在 Kubernetes 为主流注册发现的今天,给出如何在 Spring Boot 中基于 ZooKeeper 实现服务注册/发现、分布式锁、配置中心以及集群协调的完整代码与最佳实践。所有示例均可直接复制运行。 1. ZooKeeper 架构与核心原理 1.1 角色 Leader:处理写请求&…

在 Kubernetes 为主流注册发现的今天,给出如何在 Spring Boot 中基于 ZooKeeper 实现服务注册/发现、分布式锁、配置中心以及集群协调的完整代码与最佳实践。所有示例均可直接复制运行。


1. ZooKeeper 架构与核心原理

1.1 角色

  • Leader:处理写请求,广播事务(ZAB 协议)。
  • Follower / Observer:处理读请求,Follower 参与选举,Observer 仅扩展读能力。

1.2 一致性协议:ZAB(ZooKeeper Atomic Broadcast)

  1. 所有写请求统一由 Leader 生成全局递增的 zxid
  2. 两阶段提交(Proposal → ACK → Commit)。
  3. 崩溃恢复阶段:根据 zxid 选举新 Leader,保证已 Commit 的事务不丢失。

1.3 数据模型

/
├── services
│   ├── user-service
│   │   ├── 192.168.1.10#8080  (EPHEMERAL_SEQUENTIAL)
│   │   └── 192.168.1.11#8080
│   └── order-service
├── configs
│   └── application.yml
└── locks├── pay_lock_0000000001 (EPHEMERAL_SEQUENTIAL)└── pay_lock_0000000002
  • EPHEMERAL:会话断则节点自动删除,天然适合心跳/服务实例。
  • SEQUENTIAL:节点名后缀自增,用于公平锁、队列。

2. Spring Boot 集成 ZooKeeper

场景:K8s 已有 Service 发现,但团队需要异构语言互通强一致配置分布式锁,于是引入 ZooKeeper。

2.1 依赖

<dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>5.5.0</version>
</dependency>
<dependency><groupId>org.apache.curator</groupId><artifactId>curator-x-discovery</artifactId><version>5.5.0</version>
</dependency>
<dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>5.5.0</version>
</dependency>

2.2 自动配置(Spring Boot 3.x)

@Configuration
@EnableConfigurationProperties(ZkProps.class)
public class ZkConfig {@Bean(initMethod = "start", destroyMethod = "close")public CuratorFramework curator(ZkProps p) {return CuratorFrameworkFactory.builder().connectString(p.getUrl()).sessionTimeoutMs(30_000).connectionTimeoutMs(10_000).retryPolicy(new ExponentialBackoffRetry(1000, 3)).build();}@Beanpublic ServiceDiscovery<InstanceDetails> discovery(CuratorFramework client) throws Exception {ServiceDiscovery<InstanceDetails> sd = ServiceDiscoveryBuilder.builder(InstanceDetails.class).client(client).basePath("/services").serializer(new JsonInstanceSerializer<>(InstanceDetails.class)).build();sd.start();return sd;}
}

2.3 服务注册(应用启动时自动注册)

@Component
@RequiredArgsConstructor
public class ZkRegistrar implements ApplicationRunner {private final ServiceDiscovery<InstanceDetails> discovery;private final ZkProps props;@Overridepublic void run(ApplicationArguments args) throws Exception {InstanceDetails payload = new InstanceDetails(props.getProfile());ServiceInstance<InstanceDetails> instance = ServiceInstance.<InstanceDetails>builder().name(props.getAppName()).id(props.getPodIp() + ":" + props.getPort()).address(props.getPodIp()).port(props.getPort()).payload(payload).build();discovery.registerService(instance);}
}

2.4 服务发现(负载均衡示例)

@Component
@RequiredArgsConstructor
public class ZkLoadBalancer {private final ServiceDiscovery<InstanceDetails> discovery;public InstanceDetails choose(String serviceName) throws Exception {Collection<ServiceInstance<InstanceDetails>> instances =discovery.queryForInstances(serviceName);if (instances.isEmpty()) throw new IllegalStateException("No instances");// 轮询return instances.stream().skip(ThreadLocalRandom.current().nextInt(instances.size())).findFirst().orElseThrow().getPayload();}
}

3. 分布式锁:Curator Recipes

Curator 提供 InterProcessMutex(可重入)、InterProcessSemaphoreMutex(不可重入)等实现。

3.1 配置

@Bean
public InterProcessMutex payLock(CuratorFramework client) {return new InterProcessMutex(client, "/locks/pay");
}

3.2 业务中使用

@Service
@RequiredArgsConstructor
public class PayService {private final InterProcessMutex payLock;public void pay(String orderId) throws Exception {if (payLock.acquire(10, TimeUnit.SECONDS)) {try {// 幂等扣款逻辑} finally {payLock.release();}} else {throw new RuntimeException("获取锁超时");}}
}

3.3 高级:读写锁

@Bean
public InterProcessReadWriteLock rwLock(CuratorFramework client) {return new InterProcessReadWriteLock(client, "/locks/rw");
}

4. 配置中心(动态刷新)

4.1 存储

/configs/application.yml

4.2 监听与热更新

@Component
@RequiredArgsConstructor
public class ConfigWatcher {private final CuratorFramework client;private final Environment env;@PostConstructpublic void watch() throws Exception {TreeCache cache = TreeCache.newBuilder(client, "/configs").build();cache.getListenable().addListener((cf, event) -> {if (event.getType() == TreeCacheEvent.Type.NODE_UPDATED) {String path = event.getData().getPath();if (path.endsWith("application.yml")) {byte[] data = event.getData().getData();// 这里触发 Spring Environment 刷新((ConfigurableEnvironment) env).getPropertySources().replace("zk-config", new MapPropertySource("zk-config",new Yaml().load(new String(data))));}}});cache.start();}
}

5. 最佳实践与注意事项

维度建议
部署3 或 5 节点奇数集群,独立 SSD,JVM 堆 4-8G,开启快照自动清理。
会话会话超时 < 客户端 GC 时间;避免长时间 STW。
节点数据节点 < 1MB,子节点 < 10 万;使用 Observer 扩展读。
锁路径独立;锁内逻辑幂等、可重试;设置超时避免死锁。
K8sStatefulSet 部署 ZooKeeper;Headless Service 使 Pod 稳定 DNS。
迁移若未来迁到 etcd,可通过 Curator-to-etcd Bridge 逐步替换。

6. 小结

功能K8s 原生ZooKeeper 方案优势
服务发现CoreDNS跨语言、精细权重、健康检查可扩展
分布式锁强一致、可重入、读写锁
配置中心ConfigMap监听粒度细、版本化、变更审计
集群协调Leader 选举、队列、屏障(Barrier)

K8s 为主的今天,ZooKeeper 并非过时,而是作为强一致协调层的补充,特别适合金融交易、库存扣减、大规模异构系统


参考阅读

  • Curator 官方文档
  • ZooKeeper Internals

如需进一步探讨性能压测脚本K8s Operator 部署方案,欢迎留言!

http://www.dtcms.com/a/544097.html

相关文章:

  • 制作公司网站的步骤wordpress 换首页
  • 网站改造设计方案苏州网站制作公司
  • 做网站前期费用建设网站多钱
  • 河南网站建设公司哪家好免费学习的网站平台
  • 网站申请书13岁开网络科技公司
  • 视频播放网站开发vs怎么添加图片做网站
  • 广东省两学一做网站vs2010网站开发 视频
  • 嘉兴h5建站下载中心官方网站建设银行
  • 安徽省驻房城乡建设官方网站手机app编程教程
  • 网站地图建设成都的设计院
  • 网站认证中心官网上海房产网站建设
  • 东莞企业网站推广多少钱营销型网站如何策划
  • 微信朋友圈网站广告怎么做阿里云服务器上做网站
  • 防水自己如何建设网站微信公共平台开发
  • 做网站失败google推广有效果吗
  • 定制网站建设公司哪家好海外推广都有哪些渠道
  • 中国能源建设集团有限公司网站个人网页简历
  • 网站布局设计排版外销网站建设
  • 佛山企业网站优化doc导入wordpress
  • 福建路桥建设有限公司网站wordpress主题 改网址
  • 交易所网站开发实战手机app设计网站建设
  • 网站设计布局企业网站开发怎么样
  • 怎么做网站主导航石河子网站制作
  • 专业设计服务网站网站备案本人承诺
  • dede网站地图xml保山手机网站建设
  • 网站建设技术网站建设贵州省网站备案
  • o2o 电商网站 微商城 pptphp众筹网站程序源码
  • 网站轮播代码百度seo和sem的区别
  • 网站首页关键字方案易营宝mip网站建设
  • 营销型网站具备的二大能力百度推广优化怎么做