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

.Net Core 微服务之Consul(三)-KV存储分布式锁

引言: 

集合上两期.Net Core 微服务之Consul(一)(.Net Core 微服务之Consul(一)-CSDN博客) 。.Net Core 微服务之Consul(二)-集群搭建)(.Net Core 微服务之Consul(二)-集群搭建-CSDN博客)

目录

一. Consul KV 存储

1. KV 存储介绍

1.1 数据模型

1.2 一致性和持久性

1.3 事务支持

1.4 版本控制

1.5 Watch 支持

1.6 ACL(访问控制列表)

2. .Net Core使用Consul进行KV存储

二. Consul 分布式锁

1. Consul 分布式锁简介

1.1 锁实现原理

1.2 锁的自动过期

1.3 锁的可重入性

1.4 Watch 支持

1.5 分布式系统中的应用场景

2. 分布式锁常见问题

2.1 分布式系统中的死锁

2.1.1 死锁的定义

2.1.2 死锁的原因

2.1.3 死锁的表现

2.1.4 Consul 死锁中的分布式锁解决方案

2.1.5 Consul 分布式锁原理

2.2 惊群效应

2.2.1 影响与问题

2.2.2 Consul 惊群中的分布式锁解决方案

2.3 脑裂 

2.3.1 脑裂的原因

2.3.2 Consul 脑裂中的解决方案

3. .Net Core使用Consul分布式锁

总结

在分布式系统中,Consul 的 KV 存储和分布式锁功能是其非常重要的组成部分,本文将深入探讨这两个功能的实现细节、使用场景以及最佳实践。

一. Consul KV 存储

Consul 的 KV 存储是一个简单而强大的键值存储系统,被广泛用于分布式系统中的配置管理和共享数据。以下是关于 Consul KV 存储的一些关键点:

1. KV 存储介绍

1.1 数据模型

Consul 的 KV 存储提供了类似文件系统的键值存储模型,其中每个键都是一个路径,类似于 /path/to/key,而每个键对应的值可以是任意的字节序列。这种灵活性使得它不仅可以存储配置数据,还可以用于共享任意类型的数据。

1.2 一致性和持久性

Consul KV 存储提供强一致性和持久性。这意味着一旦数据被写入,它会被复制到 Consul 集群中的多个节点,并且在数据更新时保证所有节点都能读取到最新的数据版本。

1.3 事务支持

Consul 提供原子事务支持,允许在一个事务中执行多个操作,例如设置键值、获取键值、检查并操作等。这对于需要保证操作原子性的场景非常有用,可以避免因并发操作而导致的数据不一致问题。

1.4 版本控制

每个键值对都有一个版本号,这使得可以轻松地比较和控制数据的变更历史。版本控制对于跟踪配置更改或者实现乐观锁等机制非常有帮助。

1.5 Watch 支持

Consul 提供 Watch 功能,允许客户端监视特定键或前缀的更改。这使得应用程序可以实时响应配置变更而不需要轮询,从而降低了系统的资源消耗。

1.6 ACL(访问控制列表)

Consul 的 KV 存储支持 ACL,可以细粒度地控制谁可以读取或写入特定的键值对。这种安全机制对于保护敏感数据和限制特定服务的访问权限至关重要。

2. .Net Core使用Consul进行KV存储

  [Route("api/[controller]")][ApiController]public class KVController : ControllerBase{protected ConsulOptions _options { get; set; }protected ILogger<KVController> _logger { get; set; }public KVController(IOptionsMonitor<ConsulOptions> options, ILogger<KVController> logger){_options = options.CurrentValue;_logger = logger;}[HttpPost]public async Task KVPut(){using (ConsulClient client = new ConsulClient(x =>{x.Address = new Uri(_options.ConsulAddress);})){var ws = await client.KV.Put(new KVPair("kvtest") { Value = Encoding.UTF8.GetBytes("100") });if (ws.StatusCode is HttpStatusCode.OK)_logger.LogInformation("添加成功");else_logger.LogError("添加失败");}}[HttpGet]public async Task KVGet(){using (ConsulClient client = new ConsulClient(x =>{x.Address = new Uri(_options.ConsulAddress);})){var qr = await client.KV.Get("kvtest");if (qr.StatusCode is HttpStatusCode.OK)_logger.LogInformation($"查询成功-{Encoding.UTF8.GetString(qr.Response.Value)}");else_logger.LogError("查询失败");}}[HttpDelete]public async Task KVDelete(){using (ConsulClient client = new ConsulClient(x =>{x.Address = new Uri(_options.ConsulAddress);})){var wr = await client.KV.Delete("kvtest");if (wr.StatusCode is HttpStatusCode.OK)_logger.LogInformation("删除成功");else_logger.LogError("删除失败&

相关文章:

  • ARM编程指令一
  • STM32--HAL库--定时器篇
  • 堆的基本实现
  • mysql中提供的函数
  • 独孤思维:长线副业,越做越香
  • C语言常见字符函数和字符串函数精讲
  • connect的非阻塞模式
  • Discourse 如何通过终端工具访问 PGSQL
  • 多模态
  • Android APP 音视频(02)MediaProjection录屏与MediaCodec编码
  • java找不到符号解决办法
  • 《Programming from the Ground Up》阅读笔记:p75-p87
  • css更改图片颜色
  • ReadAgent,一款具有要点记忆的人工智能阅读代理
  • Vue3点击按钮实现跳转页面并携带参数
  • 【5+】跨webview多页面 触发事件(二)
  • Android Studio:GIT提交项目到远程仓库
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • IDEA 插件开发入门教程
  • Sass 快速入门教程
  • Solarized Scheme
  • spring security oauth2 password授权模式
  • windows下如何用phpstorm同步测试服务器
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 配置 PM2 实现代码自动发布
  • 使用parted解决大于2T的磁盘分区
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 我的zsh配置, 2019最新方案
  • 异常机制详解
  • 终端用户监控:真实用户监控还是模拟监控?
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (2)从源码角度聊聊Jetpack Navigator的工作流程
  • (3)STL算法之搜索
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (solr系列:一)使用tomcat部署solr服务
  • (二)JAVA使用POI操作excel
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (实测可用)(3)Git的使用——RT Thread Stdio添加的软件包,github与gitee冲突造成无法上传文件到gitee
  • (一)Neo4j下载安装以及初次使用
  • (转)原始图像数据和PDF中的图像数据
  • ****三次握手和四次挥手
  • .NET Core 中的路径问题
  • .net操作Excel出错解决
  • .NET处理HTTP请求
  • ?.的用法
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)
  • [BSidesCF 2019]Kookie1
  • [BZOJ]4817: [Sdoi2017]树点涂色
  • [c++] 什么是平凡类型,标准布局类型,POD类型,聚合体