• 八方資訊網(wǎng)歡迎您!
    八方資訊網(wǎng)>財(cái)經(jīng)>正文

    Net Core使用Ocelot網(wǎng)關(guān)(一) -負(fù)載,限流,熔斷,Header轉(zhuǎn)換

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

    1.什么是API網(wǎng)關(guān)

    API網(wǎng)關(guān)是微服務(wù)架構(gòu)中的唯一入口,它提供一個(gè)單獨(dú)且統(tǒng)一的API入口用于訪問內(nèi)部一個(gè)或多個(gè)API。它可以具有身份驗(yàn)證,監(jiān)控,負(fù)載均衡,緩存,請求分片與管理,靜態(tài)響應(yīng)處理等。API網(wǎng)關(guān)方式的核心要點(diǎn)是,所有的客戶端和消費(fèi)端都通過統(tǒng)一的網(wǎng)關(guān)接入微服務(wù),在網(wǎng)關(guān)層處理所有的非業(yè)務(wù)功能。通常,網(wǎng)關(guān)也是提供REST/HTTP的訪問API。服務(wù)端通過API-GW注冊和管理服務(wù)。

    Ocelot介紹

    Ocelot是用.net Core實(shí)現(xiàn)的一款開源的網(wǎng)關(guān),Ocelot其實(shí)就是一組按照順序排列的.net core中間件。它接受到請求之后用request builder構(gòu)建一個(gè)HttpRequestMessage對象并發(fā)送到下游服務(wù),當(dāng)下游請求返回到Ocelot管道時(shí)再由一個(gè)中間件將HttpRequestMessage映射到HttpResponse上返回客戶端。

    開源地址點(diǎn)擊這里

    使用Ocelot傻瓜式轉(zhuǎn)發(fā)

    新建三個(gè)項(xiàng)目webApi項(xiàng)目,分別命名為ApiGateway,Api_A,Api_B


      
    設(shè)置Api_A端口為5001,Api_B端口為5002,ApiGateway為5000

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

    在ApiGateway新建一個(gè)configuration.json配置文件。

    {
    "ReRoutes": [
    {
    //上游Api請求格式
    "UpstreamPathTemplate": "/Api_A/{controller}/{action}",
    //網(wǎng)關(guān)轉(zhuǎn)發(fā)到下游格式
    "DownstreamPathTemplate": "/api/{controller}/{action}",
    //上下游支持請求方法
    "UpstreamHttpMethod": [ "GET", "POST", "DELETE", "PUT" ],
    "DownstreamScheme": "http",
    //下游服務(wù)配置
    "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分別添加一個(gè)print接口。

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

    測試網(wǎng)關(guān)

    啟動(dòng)三個(gè)項(xiàng)目,使用postman來調(diào)用網(wǎng)關(guān)

    訪問Api_A服務(wù)

    訪問Api_B服務(wù)

    可以看到網(wǎng)關(guān)通過接受到的請求的Url后通過我們的配置自動(dòng)轉(zhuǎn)發(fā)到了我們想要訪問的服務(wù)。

    網(wǎng)關(guān)的負(fù)載均衡

    當(dāng)下游擁有多個(gè)節(jié)點(diǎn)的時(shí)候,我們可以用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是來決定負(fù)載的算法

    • LeastConnection:將請求發(fā)往最空閑的那個(gè)服務(wù)器
    • RoundRobin:輪流轉(zhuǎn)發(fā)
    • NoLoadBalance:總是發(fā)往第一個(gè)請求或者是服務(wù)發(fā)現(xiàn)

    限流

    限流可以防止上下游服務(wù)器因?yàn)檫^載而崩潰,可以使用RateLimitOptions來配置限流

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

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



    限流的默認(rèn)提示,code碼,和限制標(biāo)志都是可以自己配置的

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

    • DisableRateLimitHeaders:是否顯示X-Rate-Limit和Retry-After頭
    • QuotaExceededMessage:提示信息
    • HttpStatusCode:狀態(tài)碼
    • ClientIdHeader:用來設(shè)別客戶請求頭,默認(rèn)為ClientId。
    • BaseUrl 網(wǎng)關(guān)暴露的的地址。

    熔斷

    熔斷是在下游服務(wù)故障或者請求無響應(yīng)的時(shí)候停止將請求轉(zhuǎn)發(fā)到下游服務(wù)。

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

    緩存

    Ocelot可以對下游請求結(jié)果進(jìn)行緩存,主要是依賴于CacheManager來實(shí)現(xiàn)的。

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

    請求頭的轉(zhuǎn)化

    Ocelot允許在請求下游服務(wù)之前和之后轉(zhuǎn)換Header.目前Ocelot只支持查找和替換.

    如果們需要轉(zhuǎn)發(fā)給下游的Header重添加一個(gè)key/value

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

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

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

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

    {
    //請求
    "UpstreamHeaderTransform": {
    "demo": "a,b"
    },
    //響應(yīng)
    "DownstreamHeaderTransform":
    {
    "demo": "a,b"
    }
    }

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

    在Header轉(zhuǎn)換中可以使用占位符

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

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

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

    給Header中添加下游地址

    響應(yīng)的Header中已經(jīng)替換成BaseUrl了

    總結(jié)

    簡單的實(shí)現(xiàn)了通過網(wǎng)關(guān)來訪問api接口。ocelot功能遠(yuǎn)不止這些,之后會實(shí)現(xiàn)與IdentityServer的認(rèn)證鑒權(quán)。服務(wù)發(fā)現(xiàn)。

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

    本文為企業(yè)推廣,本網(wǎng)站不做任何建議,僅提供參考,作為信息展示!

    推薦閱讀:華為最具性價(jià)比手機(jī)

    網(wǎng)友評論
    請登錄后進(jìn)行評論| 0條評論

    請文明發(fā)言,還可以輸入140

    您的評論已經(jīng)發(fā)表成功,請等候?qū)徍?/p>

    小提示:您要為您發(fā)表的言論后果負(fù)責(zé),請各位遵守法紀(jì)注意語言文明

    回到首頁 回到頂部
    八方資訊網(wǎng) 關(guān)于我們| 聯(lián)系我們| 招聘信息| 老版地圖| 網(wǎng)站地圖
    免責(zé)聲明:八方資訊網(wǎng)所有文字、圖片、視頻、音頻等資料均來自互聯(lián)網(wǎng),不代表本站贊同其觀點(diǎn),本站亦不為其版權(quán)負(fù)責(zé)。相關(guān)作品的原創(chuàng)性、文中陳述文字以及內(nèi)容數(shù)據(jù)龐雜本站無法一一核實(shí),如果您發(fā)現(xiàn)本網(wǎng)站上有侵犯您的合法權(quán)益的內(nèi)容,請聯(lián)系我們,本網(wǎng)站將立即予以刪除!
    Copyright © 2012-2019 http://m.quan28.cn, All rights reserved.
    主站蜘蛛池模板: 欧美一区二区精品系列在线观看| 日韩一区二区三区在线精品| 亚洲AV无码国产精品色午友在线 | 国产精品无码久久综合| 中日精品无码一本二本三本| 国产女主播精品大秀系列| 奇米影视7777久久精品| 久久精品99久久香蕉国产色戒 | 久久伊人精品青青草原高清| www.日韩精品| 日韩精品一区二三区中文| 久久久久久九九99精品| 欧美一区二区精品久久| 久久久久人妻一区精品果冻| 无码国产精品一区二区免费模式 | 国产亚洲精品无码拍拍拍色欲| 无码AV动漫精品一区二区免费| 国产精品视频一区二区噜噜 | 亚洲精品国产字幕久久不卡| 国产精品免费网站| 国产精品网址你懂的| 精品午夜久久福利大片| 久久99精品久久久久久齐齐| 四虎成人精品无码| 久久久久免费精品国产| 国产内地精品毛片视频| 欧美精品v欧洲精品| 成人精品一区二区三区| 精品无码日韩一区二区三区不卡| 欧美亚洲国产成人精品| 中文字幕精品无码一区二区三区 | 国产三级精品久久| 成人区人妻精品一区二区不卡视频| 精品国产AⅤ一区二区三区4区| 亚洲国产另类久久久精品| 国产精品制服丝袜亚洲欧美| 日本欧美国产精品第一页久久| 国产A级毛片久久久精品毛片| 精品无码一区二区三区爱欲九九 | 97在线精品视频| 亚洲Av无码精品色午夜|