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

2024-03-17 09:59

本文主要是介绍打不死的小强 .net core 微服务 快速开发框架 Viper 限流,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

来源

https://www.cnblogs.com/duyanming/p/13846451.html

1、Viper是什么?

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

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

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

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

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

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

 Anno.RateLimit限流组件的使用

   Anno.RateLimit支持令牌桶和漏桶两种算法

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Anno.RateLimit;namespace ConsoleTest
{/// <summary>/// 限流测试/// </summary>public class RateLimitTest{/// <summary>/// 限流测试/// </summary>public void Handle(){var service = LimitingFactory.Build(TimeSpan.FromSeconds(1),LimitingType.TokenBucket, 20, 5);Console.Write("请输入线程数:");long.TryParse(Console.ReadLine(), out long th);for (int i = 0; i < th; i++){var t = Task.Factory.StartNew(() =>{while (true){var result = service.Request();//如果返回true,说明可以进行业务处理,否则需要继续等待if (result){Console.WriteLine($"{DateTime.Now}--{Task.CurrentId}---ok");//业务处理......}elseThread.Sleep(100);}}, TaskCreationOptions.LongRunning);}}}
}

3、Viper限流

  下图是用Jmeter测试线上http://140.143.207.244/ 的截图,下图红色部分为限流直接返回失败的记录,调用方为 NewApi目标服务为NewApi可以看到范围的信息为Trigger current limiting,

通过限流保证Viper成为一个打不死的小强

配置Viper的限流

{"Target": {"AppName": "ApiGateway","IpAddress": "127.0.0.1","Port": 7010,"TraceOnOff": true},"Limit": {"Enable": true,"TagLimits": [{"channel": "*","router": "*","timeSpan": "1",//限流周期单位秒"rps": 100,//周期内通过的请求个数"limitSize": 100//令牌桶,漏桶池子大小}],"IpLimit": {//ip限流"timeSpan": 1,//限流周期单位秒"rps": 100,//周期内通过的请求个数"limitSize": 100//池子大小},"White": [//白名单 用法可以参考IPAddressRange"0.0.0.1","192.168.1.2","192.168.2.18"],"Black": [//黑名单"0.0.0.2","192.168.3.18"]}
}

Limit.Enable:是否启用限流

Limit.TagLimits:根据Tag限流

channel: Anno.Plugs.Logic//请求tag 必须参数
router: Platform      //模块名称(没有Module) 必须参数
method: GetFunc      //模块方法 必须参数
profile: fSFhFv5d4ZlC/JTz1EvoBDNWTr+sNtAhKWTuykqfZHU2oB8/W7aUayqsXmFJXPlR
uname: yrm

Limit.IpLimit:根据客户端Ip限流

Limit.White:白名单

Limit.IpLimit:黑名单

 关于更多的Viper限流细节可参考github:https://github.com/duyanming/Viper/blob/master/Viper/Extensions/Middleware/DymWebHostBuilderExtensions.cs

 以上分享了,Viper网关的限流。后面分享每个微服务如何通过注解方式限流、以及请求缓存、ViperService的 全局过滤器、模块过滤器、方法过滤器。

过滤器类型有,授权过滤器、异常过滤器、Action过滤器。Anno.EngineData.Filters

两种常用算法

令牌桶(Token Bucket)和漏桶(leaky bucket)是 最常用的两种限流的算法。

令牌桶主要是控制注入的速度,漏桶则是控制出的速度。

漏桶算法

令牌桶算法

关于更多限流只是可参考:

张善友博客:https://www.cnblogs.com/shanyou/p/4280546.html

凌晨三点半:https://www.cnblogs.com/vveiliang/p/9049393.html

 Viper

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

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

关于Viper的更多内容,随后更新。敬请关注。开源不易,感谢Star。

这篇关于打不死的小强 .net core 微服务 快速开发框架 Viper 限流的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/818624

相关文章

Linux中SSH服务配置的全面指南

《Linux中SSH服务配置的全面指南》作为网络安全工程师,SSH(SecureShell)服务的安全配置是我们日常工作中不可忽视的重要环节,本文将从基础配置到高级安全加固,全面解析SSH服务的各项参... 目录概述基础配置详解端口与监听设置主机密钥配置认证机制强化禁用密码认证禁止root直接登录实现双因素

Spring 框架之Springfox使用详解

《Spring框架之Springfox使用详解》Springfox是Spring框架的API文档工具,集成Swagger规范,自动生成文档并支持多语言/版本,模块化设计便于扩展,但存在版本兼容性、性... 目录核心功能工作原理模块化设计使用示例注意事项优缺点优点缺点总结适用场景建议总结Springfox 是

java向微信服务号发送消息的完整步骤实例

《java向微信服务号发送消息的完整步骤实例》:本文主要介绍java向微信服务号发送消息的相关资料,包括申请测试号获取appID/appsecret、关注公众号获取openID、配置消息模板及代码... 目录步骤1. 申请测试系统2. 公众号账号信息3. 关注测试号二维码4. 消息模板接口5. Java测试

解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题

《解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题》:本文主要介绍解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4... 目录未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘打开pom.XM

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加

Linux如何快速检查服务器的硬件配置和性能指标

《Linux如何快速检查服务器的硬件配置和性能指标》在运维和开发工作中,我们经常需要快速检查Linux服务器的硬件配置和性能指标,本文将以CentOS为例,介绍如何通过命令行快速获取这些关键信息,... 目录引言一、查询CPU核心数编程(几C?)1. 使用 nproc(最简单)2. 使用 lscpu(详细信

Python的端到端测试框架SeleniumBase使用解读

《Python的端到端测试框架SeleniumBase使用解读》:本文主要介绍Python的端到端测试框架SeleniumBase使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录SeleniumBase详细介绍及用法指南什么是 SeleniumBase?SeleniumBase

Python中对FFmpeg封装开发库FFmpy详解

《Python中对FFmpeg封装开发库FFmpy详解》:本文主要介绍Python中对FFmpeg封装开发库FFmpy,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、FFmpy简介与安装1.1 FFmpy概述1.2 安装方法二、FFmpy核心类与方法2.1 FF

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间