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 -分布式锁服务端怎么实现的更多相关文章

  1. .netcore 微服务快速开发框架 Anno&Viper -分布式锁是个什么鬼

    1.什么是锁 锁是为了解决多线程或者多进程资源竞争的问题. 同一进程的多个线程资源竞争可以用lock解决. lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区. 如果其他线 ...

  2. 解读Google分布式锁服务

    解读Google分布式锁服务  背景介绍 在2010年4月,Google的网页索引更新实现了实时更新,在今年的OSDI大会上,Google首次公布了有关这一技术的论文. 在此之前,Google的索引更 ...

  3. [转载] zookeeper 分布式锁服务

    转载自http://www.cnblogs.com/shanyou/archive/2012/09/22/2697818.html 分布式锁服务在大家的项目中或许用的不多,因为大家都把排他放在数据库那 ...

  4. Redis分布式锁服务(八)

    阅读目录: 概述 分布式锁 多实例分布式锁 总结 概述 在多线程环境下,通常会使用锁来保证有且只有一个线程来操作共享资源.比如: object obj = new object(); lock (ob ...

  5. Redis分布式锁服务(转)

    原文:http://www.cnblogs.com/mushroom/p/4752499.html 概述 在多线程环境下,通常会使用锁来保证有且只有一个线程来操作共享资源.比如: object obj ...

  6. redis实现分布式锁服务

    译自Redis官方文档 在多线程共享临界资源的场景下,分布式锁是一种非常重要的组件.许多库使用不同的方式使用redis实现一个分布式锁管理.其中有一部分简单的实现方式可靠性不足,可以通过一些简单的修改 ...

  7. DIOCP开源项目-利用队列+0MQ+多进程逻辑处理,搭建稳定,高效,分布式的服务端

    最近头脑里面一直在想怎么样让能让大家基于DIOCP上写出稳定的服务端程序.很多朋友问我,你DIOCP稳定吗,我可以用他来做三层服务器吗? 当时我是这样回答的,我只能保证DIOCP底层通信的稳定. 说实 ...

  8. Redis分布式锁服务

    阅读目录: 概述 分布式锁 多实例分布式锁 总结 概述 在多线程环境下,通常会使用锁来保证有且只有一个线程来操作共享资源.比如: object obj = new object(); lock (ob ...

  9. Zookeeper实现分布式锁服务(Chubby)

    在分布式系统中,如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰,来保证一致性,在这种情况下,便需要使用到分布式锁例如有N台服务器同时 ...

随机推荐

  1. ceph ---(ceph简介)

    ceph简介: Ceph是一种为优秀的性能.可靠性和可扩展性而设计的统一的.分布式文件系统.ceph 的统一体现在可以提供文件系统.块存储和对象存储,分布式体现在可以动态扩展.在国内一些公司的云环境中 ...

  2. springboot基础配置-->Properties配置

    Spring Boot项目中的application.properties配置文件一共可以出现在如下4个位置: 项目根目录下的config文件夹中. 项目根目录下. classpath下的config ...

  3. 图的连通性——Tarjan算法&割边&割点

    tarjan算法 原理: 我们考虑 DFS 搜索树与强连通分量之间的关系. 如果结点 是某个强连通分量在搜索树中遇到的第⼀个结点,那么这个强连通分量的其余结点肯定 是在搜索树中以 为根的⼦树中. 被称 ...

  4. BZOJ3998 弦论 【SAM】k小子串

    BZOJ3998 弦论 给一个字符串,问其第\(K\)小字串是什么 两种形式 1.不同起始位置的相同串只算一次 2.不同起始位置的相同串各算一次 首先建\(SAM\) 所有串的数量就是\(SAM\)中 ...

  5. P2762 太空飞行计划问题 (最小割)

    题意:n个实验 每个实验可获利ai元 做每个实验需要几个仪器 购买每个仪器有不同的花费 不同实验可能会用到同一个仪器 只用购买一次 求最大收益 题解:......................... ...

  6. Codeforces Round #670 (Div. 2) B. Maximum Product (暴力)

    题意:有一长度为\(n\)的序列,求其中任意五个元素乘积的最大值. 题解:先排序,然后乘积能是正数就搞正数,模拟一下就好了. 代码: int t; ll n; ll a[N]; int main() ...

  7. 接口测试框架Requests

    目录 Requests Requests安装 Requests常见接口请求方法构造 请求目标构造 header构造 cookie 构造请求体 Get Query请求 Form请求参数 JSON请求体构 ...

  8. Leetcode(712)-账户合并

    给定一个列表 accounts,每个元素 accounts[i] 是一个字符串列表,其中第一个元素 accounts[i][0] 是 名称 (name),其余元素是 emails 表示该帐户的邮箱地址 ...

  9. Bazinga means

    Bazinga means Bazinga https://www.dictionary.com/e/slang/bazinga/ refs xgqfrms 2012-2020 www.cnblogs ...

  10. LeetCode & linked list bug

    LeetCode & linked list bug add-two-numbers shit test /** * Definition for singly-linked list. * ...