etcdctl user add user1
# 创建一个自定义角色
etcdctl role add readwrite
# 为该角色赋予读写权限,仅对指定路径(如 `/config/`)
etcdctl role grant-permission readwrite readwrite /config/
# 将用户赋予这个角色
etcdctl user grant-role user1 readwrite
# 以 user1 用户的身份操作 etcd
etcdctl --user=user1:password get /config/appsetting
yaml 启用认证
command:
- etcd
- --auth-token=simple
安装dotnet-etcd
> dotnet-etcd 7.1.1 7.1.1
声明帮助类
usingdotnet_etcd;usingEtcdserverpb;usingGoogle.Protobuf;usingGrpc.Core;namespacecoreETCD{publicclassETCDHelper{privatereadonlyEtcdClient etcdClient;privateAuthenticateResponse authenticateResponse;publicETCDHelper(){
etcdClient =newEtcdClient("http://192.168.214.133:30379",configureChannelOptions:(options =>{
options.Credentials = ChannelCredentials.Insecure;}));
authenticateResponse = etcdClient.Authenticate(newEtcdserverpb.AuthenticateRequest(){
Name ="ellis",
Password ="ellis",});// 观察字段CRUD时间
etcdClient.WatchAsync("name", print,newGrpc.Core.Metadata(){newGrpc.Core.Metadata.Entry("token",authenticateResponse.Token)});}publicasyncTask<PutResponse>PutConfig(string key,stringvalue){returnawait etcdClient.PutAsync(key,value,newGrpc.Core.Metadata(){newGrpc.Core.Metadata.Entry("token",authenticateResponse.Token)});}publicasyncTask<string>GetConfig(string key){returnawait etcdClient.GetValAsync(key,newGrpc.Core.Metadata(){newGrpc.Core.Metadata.Entry("token",authenticateResponse.Token)});}publicasyncTask<Dictionary<string,string>>GetRange(string key){RangeResponse result =await etcdClient.GetRangeAsync(key,newGrpc.Core.Metadata(){newGrpc.Core.Metadata.Entry("token",authenticateResponse.Token)});Dictionary<string,string> dict =newDictionary<string,string>();// 遍历并输出键值对foreach(var kv in result.Kvs){
dict.Add(kv.Key.ToStringUtf8(), kv.Value.ToStringUtf8());}return dict;}publicasyncTask<DeleteRangeResponse>DeleteKey(string key){returnawait etcdClient.DeleteAsync(key,newGrpc.Core.Metadata(){newGrpc.Core.Metadata.Entry("token",authenticateResponse.Token)});}// ----------------------------------// Print function that prints key and value from the minimal watch// response data privatestaticvoidprint(WatchEvent[] response){foreach(WatchEvent e1 in response){
Console.WriteLine($"{e1.Key}:{e1.Value}:{e1.Type}");}}}}
DI
builder.Services.AddSingleton<ETCDHelper>();
controller
usingMicrosoft.AspNetCore.Http;usingMicrosoft.AspNetCore.Mvc;usingMicrosoft.Extensions.Options;namespacecoreETCD.Controllers{[Route("api/[controller]/[action]")][ApiController]publicclassETCDController:ControllerBase{privatereadonlyETCDHelper _etcdHelper;publicETCDController(ETCDHelper etcdHelper){
_etcdHelper = etcdHelper;}[HttpGet]publicasyncTask<IActionResult>GetValue([FromQuery]string key){varvalue= _etcdHelper.GetConfig(key).Result;returnOk(value);}[HttpGet]publicasyncTask<IActionResult>GetRangeValue([FromQuery]string key){varvalue= _etcdHelper.GetRange(key).Result;returnOk(value);}[HttpGet]publicasyncTask<IActionResult>PutValue([FromQuery]string key,[FromQuery]stringvalue){var result = _etcdHelper.PutConfig(key,value).Result;returnOk(result);}[HttpDelete]publicasyncTask<IActionResult>DeleteKey([FromQuery]string key){var result = _etcdHelper.DeleteKey(key).Result;returnOk(result);}}}
罗列etcd已经存储的配置
etcdctl --user=username:password get "" --prefix --keys-only