Anno&Viper -分散式鎖服務端怎麼實現

杜燕明發表於2021-02-23

 1、Anno簡介

  Anno是一個微服務框架引擎。入門簡單安全穩定高可用全平臺可監控、依賴第三方框架少。底層通訊RPC(Remote Procedure Call)採用穩定可靠經過無數成功專案驗證過的跨語言的thrift grpc。 自帶服務註冊發現健康檢查(不依賴於Etcd、Consul、Zookeeper)、呼叫鏈追蹤、Cron 排程、限流、事件匯流排。外掛化開發,業務模組以CQRS 、DDD作為指導思想。

  一個不可監控的微服務平臺是可怕的,出了問題 難以準確定位問題的根源, Anno則提供了一套完整的監控體系,包括鏈路追蹤服務佔用的系統資源、系統自身 CPU、記憶體、硬碟使用率實時可監控等等。

github Anno:https://github.com/duyanming/Anno.Core  

gitee      :https://gitee.com/duyanming/anno.core

體驗地址:http://140.143.207.244/Home/Login

2、Anno分散式鎖服務端怎麼實現

  上一章節我們瞭解了分散式鎖是為了解決什麼問題以及客戶端怎麼使用,今天我們來看一下分散式鎖協調中心是怎麼實現的。不足之處望大佬們多多指正。如果還不瞭解怎麼使用可以檢視上一章節《.netcore 微服務快速開發框架 Anno&Viper -分散式鎖是個什麼鬼

首先我們需要一個分散式鎖服務端的入口類 DLockCenter

虛擬碼:

 public static class DLockCenter
    {
        private static List<LockerQueue> _lockerQueues = new List<LockerQueue>();
        private static readonly object Lock = new object();
     //進入分散式鎖
     public static EngineData.ActionResult Enter(LockInfo info)
        {
            var locker = _lockerQueues.Find(l => l.MLoker.Key == info.Key);  
        ............
return locker.Enter(info); }
    //釋放分散式鎖
public static void Free(LockInfo info) { _lockerQueues.Find(l => l.MLoker.Owner == info.Owner)?.Free(); } /// <summary> /// 定時任務檢測分散式鎖是否超時, 超時直接拋棄 /// </summary> public static void Detection() { if (_lockerQueues.Count > 0) { _lockerQueues.Where(l=>l.MLoker.IsTimeOut&&l.MLoker.Type!=ProcessType.Free).ToList().ForEach(l=>l.Detection()); } } }

 _lockerQueues:維護了一個分散式鎖的列表。

 釋放超時鎖:

 分散式鎖外掛在載入的時候啟動一個定時任務檢測超時的分散式鎖。

public class DLockBootstrap: IPlugsConfigurationBootstrap
    {
        private static readonly CronDaemon CronDaemon = new CronDaemon();
        public void ConfigurationBootstrap()
        {
            //分散式鎖啟動配置
            /*
             * 每個一段時間檢測是否有鎖超時,超時則釋放鎖
             */
            CronDaemon.AddJob("* * * * * ? *", DLockCenter.Detection);
            if (CronDaemon.Status == DaemonStatus.Stop)
            {
                CronDaemon.Start();
            }
        }

        public void PreConfigurationBootstrap()
        {
            //throw new NotImplementedException();
        }
    }

分散式鎖服務Module:

 /// <summary>
    /// 分散式鎖服務
    /// </summary>
    public class DLockModule : BaseModule
    {
        [AnnoInfo(Desc = "分散式鎖服務 獲取鎖[DLKey][TimeOut:5000][Owner]")]
        public ActionResult EnterLock()
        {
            var dlKey = RequestString("DLKey");
            var timeOut = RequestInt32("TimeOut")??5000;
            var owner = RequestString("Owner");
            var locker=new  LockInfo()
            {
                Key = dlKey,
                Time = timeOut,
                Owner=owner,
                EnterTime=DateTime.Now,
                Type=ProcessType.Enter
            };
            var rlt = DLockCenter.Enter(locker);
            return rlt;
        }
        [AnnoInfo(Desc = "分散式鎖服務 釋放鎖[DLKey][Owner]")]
        public ActionResult DisposeLock()
        {
            var dlKey = RequestString("DLKey");
            var owner = RequestString("Owner");
            var locker = new LockInfo();
            locker.Key = dlKey;
            locker.Owner = owner;
            DLockCenter.Free(locker);
            return new ActionResult(true, null, null, "DisposeLock Message");
        }
    }  

 

關於分散式鎖詳細原始碼請檢視:https://github.com/duyanming/Anno.Core/tree/master/samples/Packages/Anno.Plugs.DLockService

 

Anno核心原始碼:https://github.com/duyanming/Anno.Core  

Viper示例專案:https://github.com/duyanming/Viper  

體驗地址:http://140.143.207.244/Home/Login

QQ交流群:478399354 

Anno&Viper -分散式鎖服務端怎麼實現

 

相關文章