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

news2024/9/21 20:49:25

引言: 

集合上两期.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("删除失败&

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1948141.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

react18+

主要是围绕函数式组件讲&#xff0c;18主要用就是函数式组件&#xff0c;学习前先熟悉下原生js的基本使用&#xff0c;主要是事件 1、UI操作 1.1、书写jsx标签语言 基本写法和原生如同一则&#xff0c;只是放在一个方法里面返回而已&#xff0c;我们称这样的写法为函数式组件…

牛客JS题(三)文件扩展名

注释很详细&#xff0c;直接上代码 涉及知识点&#xff1a; 正则表达式可选链操作符 题干&#xff1a; 我的答案 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /></head><body><script>/*** 可能…

Vue前端页面嵌入mermaid图表--流程图

一、安装Mermaid 首先&#xff0c;你需要在你的项目中安装Mermaid。可以通过npm或yarn来安装&#xff1a; npm install mermaid --save # 或者 yarn add mermaid结果如图&#xff1a; 二、Vue 方法一&#xff1a;使用pre标签 使用ref属性可以帮助你在Vue组件中访问DOM元素 …

JAVA同城服务场馆门店预约系统支持H5小程序APP源码程序

&#x1f525;同城服务场馆门店预约系统&#xff1a;一键预约&#xff0c;便捷生活新体验&#xff01;&#x1f389; &#x1f31f;告别排队等待&#xff0c;预约新风尚&#x1f31f; 你还在为去游泳馆、健身房或是瑜伽馆排队等待而烦恼吗&#xff1f;同城服务场馆门店预约系统…

渲染技术如何帮助设计内容实现从平面到立体的转换

随着数字艺术和视觉特效的飞速发展&#xff0c;三维建模与渲染技术在影视、游戏、广告、工业设计、建筑可视化等多个领域展现出了其不可或缺的重要性。这一技术不仅实现了从平面到立体的跨越&#xff0c;还极大地丰富了视觉表达的层次感和真实感。 三维建模&#xff1a;构建虚…

模拟电子技术-实验四 二极管电路仿真

实验四 二极管电路仿真 一&#xff0e;实验类型 验证性实验 二&#xff0e;实验目的 1、验证二极管的单向导电性 2、验证二极管的稳压特性。 三&#xff0e;实验原理 二极管的单向导电性&#xff1a; 四、实验内容 1、二极管参数测试仿真实验 1&#xff09;仪表仿真…

【Linux】线程互斥和同步

目录 线程互斥 相关概念 互斥量mutex 互斥量的接口 初始化互斥量 销毁互斥量 互斥量加锁/解锁 可重入VS线程安全 概念 可重入与线程安全的联系 可重入与线程安全的区别 死锁 死锁的四个必要条件 避免死锁 避免死锁的算法 线程同步 条件变量 条件变量函数 初始…

【已解决】ModuleNotFoundError: No module named ‘numpy’

【已解决】ModuleNotFoundError: No module named ‘numpy’ 在Python编程中&#xff0c;遇到“ModuleNotFoundError: No module named ‘numpy’”这样的错误提示并不罕见。这个错误意味着Python解释器无法在你的环境中找到名为numpy的模块。numpy是Python中一个非常重要的库…

ElasticSearch(四)— 数据检索与查询

一、基本查询语法 所有的 REST 搜索请求使用_search 接口&#xff0c;既可以是 GET 请求&#xff0c;也可以是 POST请求&#xff0c;也可以通过在搜索 URL 中指定索引来限制范围。 _search 接口有两种请求方法&#xff0c;一种是基于 URI 的请求方式&#xff0c;另一种是基于…

JavaScript第一天

变量的基本使用 更新变量 let age 18age 19 用户名输入案例&#xff1a; let uname prompt(请输入姓名) document.write(uname) 这样在提示框中输入姓名之后&#xff0c;就会在网页中显示出来 当输入之后不在网页中显示的时候&#xff0c;可能是变量名写错了&#xf…

C++笔记---缺省参数和函数重载

1. 缺省参数 1.1 定义 缺省参数是声明或定义函数时为函数的参数指定一个缺省值&#xff08;默认值&#xff09;。在调用该函数时&#xff0c;如果没有指定实参 则采用该形参的缺省值&#xff0c;否则使用指定的实参&#xff0c;缺省参数分为全缺省和半缺省参数。 void Func(…

Linux源码阅读笔记14-IO体系结构与访问设备

IO体系结构 与外设通信通常称为输入输出&#xff0c;一般缩写为I/O。在实现外设IO的时候&#xff0c;内核必须处理三个可能出现的问题&#xff1a; 必须根据具体的设备类型和模型&#xff0c;使用各种方法对硬件寻址。内核必须向用户应用程序和系统工具提供访问各种设备的方法…

【Git多人协作开发】同一分支下的多人协作开发模式

目录 0.前言场景 1.开发者1☞完成准备工作&协作开发 1.1创建dev分支开发 1.2拉取远程dev分支至本地 1.3查看分支情况和分支联系情况 1.4创建本地dev分支且与远程dev分支建立联系 1.5在本地dev分支上开发file.txt 1.6推送push至远程仓库 2.开发者2☞完成准备工作&…

性能测试工具、负载测试工具、缺陷跟踪工具推荐

负载测试工具 - 有助于对站点或应用程序进行性能/负载测试 1&#xff09;WebLOAD WebLOAD 是一款出色的测试工具&#xff0c;提供了许多强大的脚本功能&#xff0c;有助于测试复杂场景。该工具支持从 Selenium 到移动端、从企业应用到网络协议的数百种技术。使用这款工具可以…

Java | Leetcode Java题解之第279题完全平方数

题目&#xff1a; 题解&#xff1a; class Solution {public int numSquares(int n) {if (isPerfectSquare(n)) {return 1;}if (checkAnswer4(n)) {return 4;}for (int i 1; i * i < n; i) {int j n - i * i;if (isPerfectSquare(j)) {return 2;}}return 3;}// 判断是否为…

nVisual综合布线预标签解决方案

1 跳线变更前编制标签编码、打印标签、粘贴标签费时费力&#xff1b; 2 无标签、假标签、标签错误问题造成后期无法查询线缆连接关系&#xff1b; 1 跳线出厂时在跳线两端预粘贴条码标签&#xff0c;为每条跳线设置唯一ID&#xff1b; 2 跳线变更完成后&…

MySQL练手 --- 1251. 平均售价

题目链接&#xff1a;1251. 平均售价 思路&#xff1a; 由题意可知&#xff0c;Prices表和UnitsSold表&#xff0c;表的连接关系为一对一&#xff0c;连接字段&#xff08;匹配字段&#xff09;为product_id 要求&#xff1a;查找每种产品的平均售价。而Prices表含有价格还有…

Vue与ASP.NET Core Web Api设置localhost与本地ip地址皆可访问

Vue的设置 我们创建并启动一个Vue项目&#xff0c;如下所示&#xff1a; 打开cmd&#xff0c;输入ipconfig查询本地ip地址&#xff1a; 想通过本地ip地址访问&#xff0c;把localhost改成本地ip地址&#xff0c;发现打不开&#xff1a; 这是因为Vue项目默认只有localhost&…

二级医院LIS系统源码,医学检验系统,支持DB2,Oracle,MS SQLServer等主流数据库

系统概述&#xff1a; LIS系统即实验室信息管理系统。LIS系统能实现临床检验信息化&#xff0c;检验科信息管理自动化。其主要功能是将检验科的实验仪器传出的检验数据经数据分析后&#xff0c;自动生成打印报告&#xff0c;通过网络存储在数据库中&#xff0c;使医生能够通过医…

Stage模型应用程序包结构

目录 官网地址 官网结构图 开发态包结构 工程目录结构 配置文件 module.json5配置文件 app.json5配置文件 官网地址 官网地址 包结构 官网结构图 开发态包结构 在DevEco Studio上创建一个项目工程&#xff0c;并尝试创建多个不同类型的Module&#xff08;类似一个一个的页…