Anno&Viper -分布式锁服务端怎么实现
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 -分布式锁服务端怎么实现的更多相关文章
- .netcore 微服务快速开发框架 Anno&Viper -分布式锁是个什么鬼
1.什么是锁 锁是为了解决多线程或者多进程资源竞争的问题. 同一进程的多个线程资源竞争可以用lock解决. lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区. 如果其他线 ...
- 解读Google分布式锁服务
解读Google分布式锁服务 背景介绍 在2010年4月,Google的网页索引更新实现了实时更新,在今年的OSDI大会上,Google首次公布了有关这一技术的论文. 在此之前,Google的索引更 ...
- [转载] zookeeper 分布式锁服务
转载自http://www.cnblogs.com/shanyou/archive/2012/09/22/2697818.html 分布式锁服务在大家的项目中或许用的不多,因为大家都把排他放在数据库那 ...
- Redis分布式锁服务(八)
阅读目录: 概述 分布式锁 多实例分布式锁 总结 概述 在多线程环境下,通常会使用锁来保证有且只有一个线程来操作共享资源.比如: object obj = new object(); lock (ob ...
- Redis分布式锁服务(转)
原文:http://www.cnblogs.com/mushroom/p/4752499.html 概述 在多线程环境下,通常会使用锁来保证有且只有一个线程来操作共享资源.比如: object obj ...
- redis实现分布式锁服务
译自Redis官方文档 在多线程共享临界资源的场景下,分布式锁是一种非常重要的组件.许多库使用不同的方式使用redis实现一个分布式锁管理.其中有一部分简单的实现方式可靠性不足,可以通过一些简单的修改 ...
- DIOCP开源项目-利用队列+0MQ+多进程逻辑处理,搭建稳定,高效,分布式的服务端
最近头脑里面一直在想怎么样让能让大家基于DIOCP上写出稳定的服务端程序.很多朋友问我,你DIOCP稳定吗,我可以用他来做三层服务器吗? 当时我是这样回答的,我只能保证DIOCP底层通信的稳定. 说实 ...
- Redis分布式锁服务
阅读目录: 概述 分布式锁 多实例分布式锁 总结 概述 在多线程环境下,通常会使用锁来保证有且只有一个线程来操作共享资源.比如: object obj = new object(); lock (ob ...
- Zookeeper实现分布式锁服务(Chubby)
在分布式系统中,如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰,来保证一致性,在这种情况下,便需要使用到分布式锁例如有N台服务器同时 ...
随机推荐
- SLAM01
上周末发现了一个巨大的问题,就是我们目前构建的室内定位的方法中,一个基本的假设是错的----这就非常尴尬了. 于是乎赶紧抱一波佛脚,学习一下slam里相关的问题是怎么解决的,找找灵感. 结果看了个开头 ...
- TCP/IP__TCP协议IP协议&IP地址
IP协议(Internet Protocol) 1. 定位:计算机网络间相互连接进行通信而定义的协议.在因特网中,它是能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在因特网上进 ...
- Java数组模拟队列 + 优化
队列介绍 队列是一个有序列表,可以用数组或是链表来实现. 遵循先入先出的原则. 即:先存入队列的数据,要先取出.后存入的要后取出 示意图:(使用数组模拟队列示意图) 数组模拟队列 队列本身是有序列表 ...
- Codeforces Round #654 (Div. 2)
比赛链接:https://codeforces.com/contest/1371 A. Magical Sticks 题意 有 $n$ 根小棍,长度从 $1$ 到 $n$,每次可以将两根小棍连接起来, ...
- hdu3564 Another LIS
Problem Description There is a sequence firstly empty. We begin to add number from 1 to N to the seq ...
- Panasonic Programming Contest (AtCoder Beginner Contest 186) E.Throne (数学,线性同余方程)
题意:有围着一圈的\(N\)把椅子,其中有一个是冠位,你在离冠位顺时针\(S\)把椅子的位置,你每次可以顺时针走\(K\)个椅子,问最少要走多少次才能登上冠位,或者走不到冠位. 题解:这题和洛谷那个青 ...
- hdu5317 RGCDQ
Problem Description Mr. Hdu is interested in Greatest Common Divisor (GCD). He wants to find more an ...
- 在WLS2下开发和部署NET Core3.1目录
前言 在youtube推送上看到WSL2的消息(https://www.youtube.com/watch?v=MrZolfGm8Zk&t=1s),觉得很棒.恰好最近在学习PowerShell ...
- 【.NET 与树莓派】让喇叭播放音乐
如果你和老周一样,小时候特别喜欢搞破坏(什么电器都敢拆),那下面这样小喇叭你一定见过. 这种喇叭其实以前很多录音机都用,包括上小学时买来做英语听力的便携录音机.嗯,就是放录音带的那种,录音带也叫磁带或 ...
- wordpress 插件安装 Too Many Requests
解决办法是在插件界面不直接点击安装/更新,右键新标签页打开链接,会有下载地址. 下载后上传插件即可.