• 八方資訊網歡迎您!
    八方資訊網>財經>正文

    Net Core使用Ocelot網關(一) -負載,限流,熔斷,Header轉換

    2020-03-29 06:36:34 來源: 閱讀:

    1.什么是API網關

    API網關是微服務架構中的唯一入口,它提供一個單獨且統一的API入口用于訪問內部一個或多個API。它可以具有身份驗證,監控,負載均衡,緩存,請求分片與管理,靜態響應處理等。API網關方式的核心要點是,所有的客戶端和消費端都通過統一的網關接入微服務,在網關層處理所有的非業務功能。通常,網關也是提供REST/HTTP的訪問API。服務端通過API-GW注冊和管理服務。

    Ocelot介紹

    Ocelot是用.net Core實現的一款開源的網關,Ocelot其實就是一組按照順序排列的.net core中間件。它接受到請求之后用request builder構建一個HttpRequestMessage對象并發送到下游服務,當下游請求返回到Ocelot管道時再由一個中間件將HttpRequestMessage映射到HttpResponse上返回客戶端。

    開源地址點擊這里

    使用Ocelot傻瓜式轉發

    新建三個項目webApi項目,分別命名為ApiGateway,Api_A,Api_B


      
    設置Api_A端口為5001,Api_B端口為5002,ApiGateway為5000

    為ApiGateway項目安裝Ocelot,在Nuget中搜索Ocelot或者直接使用Install-Package Ocelot進行安裝。最新版本為13.8.x支持core3.0。

    在ApiGateway新建一個configuration.json配置文件。

    {
    "ReRoutes": [
    {
    //上游Api請求格式
    "UpstreamPathTemplate": "/Api_A/{controller}/{action}",
    //網關轉發到下游格式
    "DownstreamPathTemplate": "/api/{controller}/{action}",
    //上下游支持請求方法
    "UpstreamHttpMethod": [ "GET", "POST", "DELETE", "PUT" ],
    "DownstreamScheme": "http",
    //下游服務配置
    "DownstreamHostAndPorts": [
    {
    //下游地址
    "Host": "localhost",
    //下游端口號
    "Port": 5001
    }
    ]
    },
    {
    "UpstreamPathTemplate": "/Api_B/{controller}/{action}",
    "DownstreamPathTemplate": "/api/{controller}/{action}",
    "UpstreamHttpMethod": [ "GET", "POST", "DELETE", "PUT" ],
    "DownstreamScheme": "http",
    "DownstreamHostAndPorts": [
    {
    "Host": "localhost",
    "Port": 5002
    }
    ]
    }
    ]
    }

    在Startup.cs 的ConfigureServices和Configure中配置Ocelot

    public void ConfigureServices(IServiceCollection services)
    {
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    services.AddOcelot(new ConfigurationBuilder()
    .AddJsonFile("configuration.json")
    .Build());
    }
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
    app.UseOcelot();
    if (env.IsDevelopment())
    {
    app.UseDeveloperExceptionPage();
    }
    app.UseMvc();
    }

    分別為Api_A,和Api_B分別添加一個print接口。

    [HttpGet("print")]
    public string Print()
    {
    return "Api_A";
    }
    [HttpGet("print")]
    public string Print()
    {
    return "Api_B";
    }

    測試網關

    啟動三個項目,使用postman來調用網關

    訪問Api_A服務

    訪問Api_B服務

    可以看到網關通過接受到的請求的Url后通過我們的配置自動轉發到了我們想要訪問的服務。

    網關的負載均衡

    當下游擁有多個節點的時候,我們可以用DownstreamHostAndPorts來配置

    {
    "UpstreamPathTemplate": "/Api_A/{controller}/{action}",
    "DownstreamPathTemplate": "/api/{controller}/{action}",
    "DownstreamScheme": "https",
    "LoadBalancer": "LeastConnection",
    "UpstreamHttpMethod": [ "GET", "POST", "DELETE", "PUT" ],
    "DownstreamHostAndPorts": [
    {
    "Host": "127.0.0.1",
    "Port": 5001,
    },
    {
    "Host": "127.00.1",
    "Port": 5002,
    }
    ],
    }

    LoadBalancer是來決定負載的算法

    • LeastConnection:將請求發往最空閑的那個服務器
    • RoundRobin:輪流轉發
    • NoLoadBalance:總是發往第一個請求或者是服務發現

    限流

    限流可以防止上下游服務器因為過載而崩潰,可以使用RateLimitOptions來配置限流

    {
    "RateLimitOptions": {
    "ClientWhitelist": [“127.0.0.1”],
    "EnableRateLimiting": true,
    "Period": "5s",
    "PeriodTimespan": 1,
    "Limit": 10
    }
    }
    • ClientWihteList:白名單,不受限流控制。
    • EnableRateLimiting:使用啟用限流。
    • Period:限流控制的時間段 1s, 5m, 1h, 1d。
    • PeroidTimeSpan:超過限流限制的次數后,需要等待重置的時間(單位是秒)。
    • Limit:在限流控制時間段內最大訪問數。
      對于除了請求頭中ClientId=127.0.0.1的意外所有求情啟用限流,5秒該api最多10次,如果達到10次需要從第10次請求閉合后等待一秒進行下一次訪問。

    超過限流后會返回429狀態碼,并在在返回頭(Response Header)的Retry-After屬性中返回等待重置時間。



    限流的默認提示,code碼,和限制標志都是可以自己配置的

     { 
    "GlobalConfiguration": {
    "BaseUrl":"www.baidu.com",
    "RateLimitOptions": {
    "DisableRateLimitHeaders": false,
    "QuotaExceededMessage": "接口限流!",
    "HttpStatusCode": 200,
    "ClientIdHeader": "ClientId"
    }
    }

    • DisableRateLimitHeaders:是否顯示X-Rate-Limit和Retry-After頭
    • QuotaExceededMessage:提示信息
    • HttpStatusCode:狀態碼
    • ClientIdHeader:用來設別客戶請求頭,默認為ClientId。
    • BaseUrl 網關暴露的的地址。

    熔斷

    熔斷是在下游服務故障或者請求無響應的時候停止將請求轉發到下游服務。

     { 
    "QoSOptions": {
    "ExceptionsAllowedBeforeBreaking": 3,
    "DurationOfBreak": 20,
    "TimeoutValue": 5000
    }
    }
    • ExceptionsAllowedBeforeBreaking:允許多少個異常請求。
    • DurationOfBreak:熔斷的時間(秒)。
    • TimeoutValue:下游請求的處理時間超過多少則將請求設置為超時。

    緩存

    Ocelot可以對下游請求結果進行緩存,主要是依賴于CacheManager來實現的。

    {
    "FileCacheOptions": {
    "TtlSeconds": 60,
    "Region": "key"
    }
    }
    • TtlSeconds:緩存時間(秒)。
    • Region:緩存分區名
      我們可以調用Ocelot的API來移除某個區下面的緩存 。

    請求頭的轉化

    Ocelot允許在請求下游服務之前和之后轉換Header.目前Ocelot只支持查找和替換.

    如果們需要轉發給下游的Header重添加一個key/value

    {
    "UpstreamHeaderTransform": {
    "demo": "xxxxxxx"
    }
    }

    如果們需要在返回給客戶端的的Header中添加一個key/value

    {
    "DownstreamHeaderTransform": {
    "demo": "xxxxxxx"
    }
    }

    如果我們需要替換Heaher中某些值

    {
    //請求
    "UpstreamHeaderTransform": {
    "demo": "a,b"
    },
    //響應
    "DownstreamHeaderTransform":
    {
    "demo": "a,b"
    }
    }

    語法是{find},{replace}, 利用b取代a

    在Header轉換中可以使用占位符

    • {BaseUrl} - 這個是Ocelot暴露在外的url. 例如http://localhost:5000/.
    • {DownstreamBaseUrl} - 這個是下游服務的基本url 例如http://localhost:5001/. 目前這個只在DownstreamHeaderTransform中起作用.
    • {TraceId} - 這個是Butterfly的跟蹤id.目前這個也只在DownstreamHeaderTransform中起作用

    如果您想將location頭返回給客戶端,可能需要將location更改為Ocelot的地址而不是下游服務地址。 Ocelot可以使用以下配置實現。

    {
    "DownstreamHeaderTransform": {
    "Location": "{DownstreamBaseUrl},{BaseUrl}"
    },
    }

    給Header中添加下游地址

    響應的Header中已經替換成BaseUrl了

    總結

    簡單的實現了通過網關來訪問api接口。ocelot功能遠不止這些,之后會實現與IdentityServer的認證鑒權。服務發現。

    原文地址:https://www.cnblogs.com/linhuiy/p/12029652.html

    本文為企業推廣,本網站不做任何建議,僅提供參考,作為信息展示!

    推薦閱讀:華為最具性價比手機

    網友評論
    請登錄后進行評論| 0條評論

    請文明發言,還可以輸入140

    您的評論已經發表成功,請等候審核

    小提示:您要為您發表的言論后果負責,請各位遵守法紀注意語言文明

    回到首頁 回到頂部
    八方資訊網 關于我們| 聯系我們| 招聘信息| 老版地圖| 網站地圖
    免責聲明:八方資訊網所有文字、圖片、視頻、音頻等資料均來自互聯網,不代表本站贊同其觀點,本站亦不為其版權負責。相關作品的原創性、文中陳述文字以及內容數據龐雜本站無法一一核實,如果您發現本網站上有侵犯您的合法權益的內容,請聯系我們,本網站將立即予以刪除!
    Copyright © 2012-2019 http://www.quan28.cn, All rights reserved.
    主站蜘蛛池模板: 欧美精品一区二区三区免费观看| 亚洲精品无码永久在线观看你懂的| 免费视频成人国产精品网站| 国产精品成人观看视频免费| 亚洲精品宾馆在线精品酒店| 97视频在线精品国自产拍| 久久精品国产亚洲av水果派| 日韩一区二区三区精品| 国产av无码专区亚洲国产精品| 国产成人精品电影在线观看| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 亚洲欧美精品伊人久久| 69SEX久久精品国产麻豆| 中文成人无码精品久久久不卡| 国产综合精品久久亚洲 | 国产精品中文字幕在线观看| 久久久久女人精品毛片| 亚洲精品无码mv在线观看网站| 国产亚州精品女人久久久久久| 亚洲精品一二区| 一区二区三区精品| 一本久久a久久精品综合夜夜| 欧美精品888| 久久精品九九亚洲精品天堂| 国产精品666| 好属妞这里只有精品久久| 高清免费久久午夜精品| 2018国产精华国产精品| 国产精品va无码一区二区| AAA级久久久精品无码片| 潮喷大喷水系列无码久久精品| 国产精品免费AV片在线观看| 精品日韩亚洲AV无码一区二区三区| 亚洲AV乱码久久精品蜜桃| 亚洲精品高清国产一线久久| 少妇人妻偷人精品无码视频新浪| 无码精品国产VA在线观看| 精品一区二区三区免费毛片爱| 国产女主播精品大秀系列| 91精品国产综合久久久久久| 国产高清在线精品一区|