コード例 #1
0
        public string GetServer(string ServiceName, bool needWatch = true)
        {
            Google.Protobuf.ByteString key = Google.Protobuf.ByteString.CopyFromUtf8($"/EtcdDiscovery/{ServiceName}");

            var req = new Etcdserverpb.RangeRequest()
            {
                Key = key
            };
            var result = _client.GetAsync(ServiceName).Result;

            if (result.Kvs != null && result.Kvs.Count > 0)
            {
                lock (klst)
                {
                    if (needWatch && klst.Contains(key))
                    {
                        klst.Add(key);
                    }
                }
                return(result.Kvs[0].Value.ToStringUtf8());
            }
            else
            {
                return(null);
            }
        }
コード例 #2
0
        public bool Update(string ServiceName, string SrvInfo)
        {
            try
            {
                var haskey = false;
                var newkey = Google.Protobuf.ByteString.CopyFromUtf8($"/EtcdDiscovery/{ServiceName}");
                lock (watchers)
                {
                    haskey = watchers.Any(c => c.key == newkey);
                }

                if (!haskey)
                {
                    return(false);
                }

                Etcdserverpb.LeaseGrantRequest request = new Etcdserverpb.LeaseGrantRequest();
                request.TTL = _locklease;
                var lease = _client.LeaseGrant(request);

                var newval = Google.Protobuf.ByteString.CopyFromUtf8(SrvInfo);
                //set new data
                _client.PutAsync(new Etcdserverpb.PutRequest()
                {
                    Key   = newkey,
                    Value = newval,
                    Lease = lease.ID
                }).Wait();
                lock (watchers)
                {
                    watchers.Add(new zkDiscoveryWatcher()
                    {
                        key   = newkey,
                        value = newval
                    });
                }
                var newver = _client.GetAsync($"/EtcdDiscovery/{ServiceName}").Result?.Kvs[0].Version;
                return(true);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
コード例 #3
0
ファイル: Client.cs プロジェクト: zhj149/ContainerBase
        public LockModel Lock(string lockname)
        {
            LockModel @lock = new LockModel();

            Etcdserverpb.RangeResponse oldlockers = null;
            //use local cache speed up.
            lock (_lockerList)
            {
                var locallst = _lockerList.Where(c => c.Name == lockname).ToList();
                if (locallst.Count > 0)
                {
                    @lock.Result = LockResult.LockExists;
                    @lock.Id     = locallst.FirstOrDefault().Id;
                    return(@lock);
                }
            }
            //confirm lock not exists.
            try
            {
                oldlockers = _client.GetAsync($"/locks/{lockname}").Result;
            }
            catch (Exception ex)
            {
                @lock.Id     = 0;
                @lock.Result = LockResult.Fail;
                lock (_client)
                {
                    _client = bestClient(_clients);
                }
                return(@lock);
            }

            //return lockid to locker .
            if (oldlockers?.Kvs.Count > 0)
            {
                @lock.Id     = long.Parse(oldlockers.Kvs.FirstOrDefault().Value.ToStringUtf8());
                @lock.Result = LockResult.LockExists;
            }
            else
            {
                //creat lock id
                TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
                @lock.Id     = (long)ts.TotalMilliseconds;
                @lock.Result = LockResult.Success;
                try
                {
                    Etcdserverpb.LeaseGrantRequest request = new Etcdserverpb.LeaseGrantRequest();
                    request.TTL = _locklease;
                    var lease = _client.LeaseGrant(request);
                    Etcdserverpb.PutRequest put = new Etcdserverpb.PutRequest();
                    put.Key   = Google.Protobuf.ByteString.CopyFromUtf8(($"/locks/{lockname}"));
                    put.Value = Google.Protobuf.ByteString.CopyFromUtf8(@lock.Id.ToString());
                    put.Lease = lease.ID;
                    _client.Put(put);
                    //add to cache and srv .
                    _client.Put($"/locks/{lockname}", @lock.Id.ToString());
                    lock (_lockerList)
                    {
                        _lockerList.Add(new ZkLockerWatcher()
                        {
                            Event = null, Id = @lock.Id, Name = lockname
                        });
                    }
                }
                catch (Exception ex)
                {
                    lock (_client)
                    {
                        _client = bestClient(_clients);
                    }
                    @lock.Result = LockResult.Fail;
                }
            }
            return(@lock);
        }