不死的小强 .net core 微服务 快速开发框架 Viper 限流

1、Viper是什么?

  Viper 是.NET平台下的Anno服务框架的一个示例项目。入门简单安全稳定高可用全平台可监控。底层通讯可以随意切换thrift grpc。 自带服务发现、调用链追踪、Cron 调度、限流、事件总线、CQRS 、DDD、类似MVC的开发体验,插件化开发

  一个不可监控的微服务平台是可怕的,出了问题 难以准确定位问题的根源, Anno则提供了一套完整的监控体系,包括链路追踪、服务占用的系统资源、系统自身 CPU、内存、硬盘使用率实时可监控等等。

  今天要说的是.netcore 微服务Viper的限流,防止恶意攻击,做一个打不死的小强

不死的小强 .net core 微服务 快速开发框架 Viper 限流

github:
https://github.com/duyanming/Viper
文档地址:
https://duyanming.github.io/

体验地址:(体验用户为anno 密码123456 同一时间一个用户只能在一个终端登录用户多的时候可能发生强制退出的情况,稍后登录体验)

 

2、限流Anno.RateLimit

  限流用到两个库 Anno.RateLimit、IPAddressRange。Anno.RateLimit为限流组件,IPAddressRange为IP匹配组件。

IPAddressRange地址:https://github.com/jsakamoto/ipaddressrange

using NetTools; ... // rangeA.Begin is "192.168.0.0", and rangeA.End is "192.168.0.255". var rangeA = IPAddressRange.Parse("192.168.0.0/255.255.255.0"); rangeA.Contains(IPAddress.Parse("192.168.0.34")); // is True. rangeA.Contains(IPAddress.Parse("192.168.10.1")); // is False. rangeA.ToCidrString(); // is 192.168.0.0/24 // rangeB.Begin is "192.168.0.10", and rangeB.End is "192.168.10.20". var rangeB1 = IPAddressRange.Parse("192.168.0.10 - 192.168.10.20"); rangeB1.Contains(IPAddress.Parse("192.168.3.45")); // is True. rangeB1.Contains(IPAddress.Parse("192.168.0.9")); // is False. // Support shortcut range description. // ("192.168.10.10-20" means range of begin:192.168.10.10 to end:192.168.10.20.) var rangeB2 = IPAddressRange.Parse("192.168.10.10-20"); // Support CIDR expression and IPv6. var rangeC = IPAddressRange.Parse("fe80::/10"); rangeC.Contains(IPAddress.Parse("fe80::d503:4ee:3882:c586%3")); // is True. rangeC.Contains(IPAddress.Parse("::1")); // is False. // "Contains()" method also support IPAddressRange argument. var rangeD1 = IPAddressRange.Parse("192.168.0.0/16"); var rangeD2 = IPAddressRange.Parse("192.168.10.0/24"); rangeD1.Contains(rangeD2); // is True. // IEnumerable<IPAddress> support, it's lazy evaluation. foreach (var ip in IPAddressRange.Parse("192.168.0.1/23")) { Console.WriteLine(ip); } // You can use LINQ via "AsEnumerable()" method. var longValues = IPAddressRange.Parse("192.168.0.1/23") .AsEnumerable() .Select(ip => BitConvert.ToInt32(ip.GetAddressBytes(), 0)) .Select(adr => adr.ToString("X8")); Console.WriteLine(string.Join(",", longValues); // Constructors from IPAddress objects. var ipBegin = IPAddress.Parse("192.168.0.1"); var ipEnd = IPAddress.Parse("192.168.0.128"); var ipSubnet = IPAddress.Parse("255.255.255.0"); var rangeE = new IPAddressRange(); // This means "0.0.0.0/0". var rangeF = new IPAddressRange(ipBegin, ipEnd); var rangeG = new IPAddressRange(ipBegin, maskLength: 24); var rangeH = new IPAddressRange(ipBegin, IPAddressRange.SubnetMaskLength(ipSubnet)); // Calculates Cidr subnets var rangeI = IPAddressRange.Parse("192.168.0.0-192.168.0.254"); rangeI.ToCidrString(); // is 192.168.0.0/24

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zywpfs.html