架构师_程序员

查看: 80|回复: 0
打印 上一主题 下一主题

[资料] 【架构篇】.net/c# 基于 Consul 实现分布式配置之Key/Value存储

[复制链接]
跳转到指定楼层
楼主
发表于 2020-10-16 18:18:06 | 只看该作者
分布式应用中,经常需要修改配置属性,例如:更新数据库连接字符串、更新缓存地址等。如果应用不多的话,可以手动修改,一旦应用比较多的话,分布式配置就显得非常重要,本文讲解 .net/c# 基于 Consul 实现分布式配置之Key/Value存储架构。

安装 Consul

简介

Consul是一个服务发现和注册的工具,其具有分布式、高扩展性能特点。

Consul主要包含如下功能:

  • 服务发现: 支持 http 和 dns 两种协议的服务注册和发现方式。
  • 监控检查: 支持多种方式的健康检查。
  • Key/Value存储: 支持通过HTTP API实现分布式KV数据存储。
  • 多数据中心支持:支持任意数量数据中心。


安装

下载地址:

https://www.consul.io/downloads.html

本文使用 Windows 10 x64 作为测试环境。

下载解压后,使用cmd命令运行,代码如下:

  1. consul agent -dev
复制代码


dev表示开发模式运行,使用-client 参数可指定允许客户端使用什么ip去访问,例如-client 127.0.0.1 表示可以使用,开发模式下,不会持久化数据。

(dev模式,生产环境建议cluster模式)



可以访问: http://127.0.0.1:8500/ui/dc1/services 查看,如下图:



KV 接口

api文档地址:

https://www.consul.io/api/kv.html

首先,我使用在线网页,新建了一个key/value键值对。

通过 GET 请求 /v1/kv/:key 路径获取值。

http://127.0.0.1:8500/v1/kv/test



[
    {
        "LockIndex": 0,
        "Key": "test",
        "Flags": 0,
        "Value": "aXRzdnNlLmNvbQ==",
        "CreateIndex": 194,
        "ModifyIndex": 194
    }
]


  • CreateIndex 是表示条目创建时间的内部索引值。
  • ModifyIndex是修改此密钥的最后一个索引。该索引对应X-Consul-Index于响应中返回的标头值,并且可以通过设置?index查询参数将其用于建立阻塞查询。您甚至可以针对KV商店的整个子树执行阻塞查询:如果?recurse提供了查询,则返回的值X-Consul-Index对应ModifyIndex于前缀中的最新值,使用阻塞查询 ?index将等待直到该前缀中的任何键被更新。
  • LockIndex是已成功获取锁中密钥的次数。如果持有锁,则Session密钥将提供拥有该锁的会话。
  • Key 只是条目的完整路径。
  • Flags是一个不透明的无符号整数,可以附加到每个条目。客户可以选择使用此选项,但是对于他们的应用来说很有意义。
  • Value 是base64编码的数据Blob。


.NET/C# Key/Value 读写

首先,新建一个.net 4.6.1的项目,使用nuget安装必要的包,如下:

  1. Install-Package Consul -Version 0.7.2.6
复制代码


代码如下:

  1. using Consul;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;

  7. namespace Consul_Demo
  8. {
  9.     class Program
  10.     {
  11.         private const string api = "http://127.0.0.1:8500";
  12.         static void Main(string[] args)
  13.         {
  14.             Console.WriteLine(SetValue("itsvse", "123456"));
  15.             Console.WriteLine(SetValue("itsvse", "http://www.itsvse.com 小渣渣"));

  16.             Console.WriteLine(GetValue("itsvse"));
  17.             Console.WriteLine(GetValue("itsvsE"));//区分大小写,大小写不一致,获取数据失败
  18.             Console.WriteLine(GetValue("test"));
  19.             Console.WriteLine("ok");
  20.             Console.ReadKey();
  21.         }

  22.         static string GetValue(string key)
  23.         {
  24.             using (var client = new ConsulClient(x => x.Address = new Uri(api)))
  25.             {
  26.                 var ret = client.KV.Get(key).Result;
  27.                 if (ret.StatusCode == System.Net.HttpStatusCode.OK)
  28.                 {
  29.                     return Encoding.UTF8.GetString(ret.Response.Value, 0,
  30.                 ret.Response.Value.Length);
  31.                 }
  32.             }
  33.             return null;
  34.         }

  35.         static bool SetValue(string key,string value)
  36.         {
  37.             using (var client = new ConsulClient(x => x.Address = new Uri(api)))
  38.             {
  39.                 var putPair = new KVPair(key)
  40.                 {
  41.                     Value = Encoding.UTF8.GetBytes(value)
  42.                 };
  43.                 var ret = client.KV.Put(putPair).Result;
  44.                 if (ret.StatusCode == System.Net.HttpStatusCode.OK)
  45.                 {
  46.                     return true;
  47.                 }
  48.             }
  49.             return false;
  50.         }
  51.     }
  52. }
复制代码


效果图如下:



  • key键区分大小写
  • 重复的key,value值会被覆盖


(完)




上一篇:使用十年的电脑在家用记事本调试 .NET 程序
下一篇:【架构篇】ASP.NET Core 基于 Consul 动态配置热更新
帖子永久地址: 

架构师_程序员 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与架构师_程序员享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和架构师_程序员的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、架构师_程序员管理员和版主有权不事先通知发贴者而删除本文

码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2020-10-28 19:49

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表