<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          打不死的小強(qiáng) .net core 微服務(wù) 快速開(kāi)發(fā)框架 Viper 限流

          共 6189字,需瀏覽 13分鐘

           ·

          2020-10-24 11:32

          1、Viper是什么?

            Viper 是.NET平臺(tái)下的Anno微服務(wù)框架的一個(gè)示例項(xiàng)目。入門(mén)簡(jiǎn)單安全穩(wěn)定高可用全平臺(tái)可監(jiān)控。底層通訊可以隨意切換thrift?grpc?自帶服務(wù)發(fā)現(xiàn)、調(diào)用鏈追蹤、Cron 調(diào)度、限流、事件總線、CQRS 、DDD、類(lèi)似MVC的開(kāi)發(fā)體驗(yàn),插件化開(kāi)發(fā)

            一個(gè)不可監(jiān)控的微服務(wù)平臺(tái)是可怕的,出了問(wèn)題?難以準(zhǔn)確定位問(wèn)題的根源, Anno則提供了一套完整的監(jiān)控體系,包括鏈路追蹤服務(wù)占用的系統(tǒng)資源、系統(tǒng)自身?CPU、內(nèi)存、硬盤(pán)使用率實(shí)時(shí)可監(jiān)控等等。

            今天要說(shuō)的是.netcore 微服務(wù)Viper的限流,防止惡意攻擊,做一個(gè)打不死的小強(qiáng)

            如果對(duì)Viper不了解的可以看上篇文章了解?net core 微服務(wù) 快速開(kāi)發(fā)框架 Viper 初體驗(yàn)

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

          體驗(yàn)地址:(體驗(yàn)用戶為anno 密碼123456 同一時(shí)間一個(gè)用戶只能在一個(gè)終端登錄用戶多的時(shí)候可能發(fā)生強(qiáng)制退出的情況,稍后登錄體驗(yàn))
          http://140.143.207.244/

          ?

          2、限流Anno.RateLimit

            限流用到兩個(gè)庫(kù) 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 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
          {
          ///
          /// 限流測(cè)試
          ///

          public class RateLimitTest
          {
          ///
          /// 限流測(cè)試
          ///

          public void Handle()
          {
          var service = LimitingFactory.Build(TimeSpan.FromSeconds(1),LimitingType.TokenBucket, 20, 5);
          Console.Write(
          "請(qǐng)輸入線程數(shù):");
          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,說(shuō)明可以進(jìn)行業(yè)務(wù)處理,否則需要繼續(xù)等待
          if (result)
          {
          Console.WriteLine($
          "{DateTime.Now}--{Task.CurrentId}---ok");
          //業(yè)務(wù)處理......
          }
          else
          Thread.Sleep(
          100);
          }
          }, TaskCreationOptions.LongRunning);
          }
          }
          }
          }

          3、Viper限流

            下圖是用Jmeter測(cè)試線上http://140.143.207.244/?的截圖,下圖紅色部分為限流直接返回失敗的記錄,調(diào)用方為?NewApi目標(biāo)服務(wù)為NewApi可以看到返回的信息為Trigger current limiting,

          通過(guò)限流保證Viper成為一個(gè)打不死的小強(qiáng)

          配置Viper的限流

          {
          "Target": {
          "AppName": "ApiGateway",
          "IpAddress": "127.0.0.1",
          "Port": 7010,
          "TraceOnOff": true
          },
          "Limit": {
          "Enable": true,
          "TagLimits": [
          {
          "channel": "*",
          "router": "*",
          "timeSpan": "1",//限流周期單位秒
          "rps": 100,//周期內(nèi)通過(guò)的請(qǐng)求個(gè)數(shù)
          "limitSize": 100//令牌桶,漏桶池子大小
          }
          ],
          "IpLimit": {//ip限流
          "timeSpan": 1,//限流周期單位秒
          "rps": 100,//周期內(nèi)通過(guò)的請(qǐng)求個(gè)數(shù)
          "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:根據(jù)Tag限流

          channel: Anno.Plugs.Logic//請(qǐng)求tag 必須參數(shù)
          router: Platform      //模塊名稱(chēng)(沒(méi)有Module) 必須參數(shù)
          method: GetFunc      //模塊方法 必須參數(shù)
          profile: fSFhFv5d4ZlC
          /JTz1EvoBDNWTr+sNtAhKWTuykqfZHU2oB8/W7aUayqsXmFJXPlR
          uname: yrm

          ?

          Limit.IpLimit:根據(jù)客戶端Ip限流

          Limit.White:白名單

          Limit.IpLimit:黑名單

          ?關(guān)于更多的Viper限流細(xì)節(jié)可參考github:https://github.com/duyanming/Viper/blob/master/Viper/Extensions/Middleware/DymWebHostBuilderExtensions.cs

          ?以上分享了,Viper網(wǎng)關(guān)的限流。后面分享每個(gè)微服務(wù)如何通過(guò)注解方式限流、以及請(qǐng)求緩存、ViperService的 全局過(guò)濾器、模塊過(guò)濾器、方法過(guò)濾器。

          過(guò)濾器類(lèi)型有,授權(quán)過(guò)濾器、異常過(guò)濾器、Action過(guò)濾器。Anno.EngineData.Filters

          兩種常用算法

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

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

          漏桶算法

          ?

          ?

          令牌桶算法

          ?

          ?

          關(guān)于更多限流只是可參考:

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

          凌晨三點(diǎn)半:https://www.cnblogs.com/vveiliang/p/9049393.html

          ?Viper

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

          體驗(yàn)地址:(體驗(yàn)用戶為anno 密碼123456 同一時(shí)間一個(gè)用戶只能在一個(gè)終端登錄用戶多的時(shí)候可能發(fā)生強(qiáng)制退出的情況,稍后登錄體驗(yàn))
          http://140.143.207.244/

          ?

          關(guān)于Viper的更多內(nèi)容,隨后更新。敬請(qǐng)關(guān)注。開(kāi)源不易,感謝Star。


          往期精彩回顧




          【推薦】.NET Core開(kāi)發(fā)實(shí)戰(zhàn)視頻課程?★★★

          .NET Core實(shí)戰(zhàn)項(xiàng)目之CMS 第一章 入門(mén)篇-開(kāi)篇及總體規(guī)劃

          【.NET Core微服務(wù)實(shí)戰(zhàn)-統(tǒng)一身份認(rèn)證】開(kāi)篇及目錄索引

          Redis基本使用及百億數(shù)據(jù)量中的使用技巧分享(附視頻地址及觀看指南)

          .NET Core中的一個(gè)接口多種實(shí)現(xiàn)的依賴注入與動(dòng)態(tài)選擇看這篇就夠了

          10個(gè)小技巧助您寫(xiě)出高性能的ASP.NET Core代碼

          用abp vNext快速開(kāi)發(fā)Quartz.NET定時(shí)任務(wù)管理界面

          在ASP.NET Core中創(chuàng)建基于Quartz.NET托管服務(wù)輕松實(shí)現(xiàn)作業(yè)調(diào)度

          現(xiàn)身說(shuō)法:實(shí)際業(yè)務(wù)出發(fā)分析百億數(shù)據(jù)量下的多表查詢優(yōu)化

          關(guān)于C#異步編程你應(yīng)該了解的幾點(diǎn)建議

          C#異步編程看這篇就夠了


          瀏覽 33
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  精品成人久久久久久久 | 都市激情天天射 | 婷婷淫色| 求一个做爱视频网站免费在线观看 | 欧美色综合天天久久综合精品 |