【微服務】Ocelot微服務網關

目錄

一、目的

二、Ocelot介紹

三、.Net中使用Ocelot搭建網關服務

3.1?搭建網關Ocelot步驟

?3.1.1、創建Net7 WebApi服務

3.1.2、Nuget引入-Ocelot程序包(版本:19.0.2)

3.1.3、配置中間件和IOC注冊

3.1.4?配置文件編輯Ocelot網關配置信息

3.2?Ocelot相關配置

3.2.1?單地址訪問

3.2.2?多地址訪問

3.2.3?單地址多實例負載均衡

3.2.4?負載均衡+Consul(服務發現)

四、文章總結


一、目的

?????????在微服務架構中,網關作為系統的統一入口,承擔著路由轉發、負載均衡、安全控制等核心功能,是確保系統高效運行的關鍵組件。市面上一些主流網關:Kong、Envoy、Spring Cloud Gateway、Bumblebee、Ocelot(C#開源-微軟-騰訊---Abp.vnext內置)。

? ? ? ? 這里主要講解通過Ocelot設計微服務Api網關。

    二、Ocelot介紹

    ????????Ocelot網關是一款基于.NET Core開發的開源API網關,專為微服務架構設計,其主要作用包括統一管理客戶端請求、提升系統安全性和可維護性?.

    ????網關的作用包括:

    1. ?請求路由?:通過配置文件定義路由規則,將客戶端請求動態轉發到對應的下游服務,支持路徑占位符(如/{userId})和通配符匹配?。
    2. ?負載均衡?:集成輪詢、隨機、最少連接數等算法,分發請求到多個服務實例,提高可用性和性能?。
    3. ?服務發現?:自動集成Consul或Eureka等注冊中心,實時發現服務地址,減少手動配置負擔?。
    4. ?認證與授權?:支持JWT、OAuth2等認證方式,實現統一身份驗證和基于角色的訪問控制(RBAC),保障資源安全?。
    5. ?限流與熔斷?:采用令牌桶算法限制請求速率,防止服務過載;熔斷機制在服務故障時快速失敗,避免級聯崩潰?。
    6. ?請求聚合?:合并多個下游服務的響應為單一結果,減少客戶端請求次數,優化用戶體驗?。
    7. ?日志與監控?:記錄請求日志和性能指標,支持與Serilog、Prometheus等工具集成,便于運維分析和優化?。
    8. ?統一入口?:作為微服務架構的單一接入點,屏蔽后端服務復雜性,降低客戶端與服務間的耦合度?。

    三、.Net中使用Ocelot搭建網關服務

    3.1?搭建網關Ocelot步驟

    ?3.1.1、創建Net7 WebApi服務

    3.1.2、Nuget引入-Ocelot程序包(版本:19.0.2)

    ????????dotnet add packages Ocelot

    3.1.3、配置中間件和IOC注冊

    //配置Ocelot中間件設置和注冊到Ioc
    builder.Services.AddOcelot();//使用Ocelot中間件
    app.UseOcelot();

    3.1.4?配置文件編輯Ocelot網關配置信息

    為了便于區分,新增一個configuration配置文件用來編輯Ocelot網關相關信息。

    創建了配置文件就需要在重新讀取配置文件,appsettings是默認讀取的,這里需要在讀取configuration中的內容:

    builder.Configuration.AddJsonFile("configuration.json", true, true);

    3.2?Ocelot相關配置

    ? ? ? ? Ocelot在注冊服務到Ioc時,AddOcelot方法在構建Ocelot服務時,對通過讀取配置文件中的信息來設置相關服務。以下是幾種常見的服務配置方式。

    3.2.1?單地址訪問

    ? ? ? ? 這里配置了單地址轉發,通過配置文件定義路由規則,將請求動態轉發到對應的下游服務,通過占位符"/Test80"和通配符訪問。

    {"Routes": [{"DownstreamPathTemplate": "/api/{url}", //服務地址,Url變量"DownstreamScheme": "http","DownstreamHostAndPorts": [{"Host": "127.0.0.1","Port": 80 //服務端口} //http://127.0.0.1:80],"UpstreamPathTemplate": "/Test80/{url}", //網關地址: Url變量"UpstreamHttpMethod": [ "Get", "Post" ]}]
    }

    3.2.2?多地址訪問

    ? ? ? 網關支持多個服務地址,轉發請求。模擬客戶端請求不同的服務示例。如:

    訪問: https://網關ip:80/Test81/Test/Get

    //  //*****************************多地址********************************
    {"Routes": [{"DownstreamPathTemplate": "/api/{url}", //服務地址,Url變量"DownstreamScheme": "http","DownstreamHostAndPorts": [{"Host": "127.0.0.1","Port": 81 //服務端口}],"UpstreamPathTemplate": "/Test81/{url}", //網關地址: Url變量"UpstreamHttpMethod": [ "Get", "Post" ]},{"DownstreamPathTemplate": "/api/{url}", //服務地址,Url變量"DownstreamScheme": "http","DownstreamHostAndPorts": [{"Host": "127.0.0.1","Port": 82 //服務端口}],"UpstreamPathTemplate": "/Test82/{url}", //網關地址: Url變量"UpstreamHttpMethod": [ "Get", "Post" ]},{"DownstreamPathTemplate": "/api/{url}", //服務地址,Url變量"DownstreamScheme": "http","DownstreamHostAndPorts": [{"Host": "127.0.0.1","Port": 83 //服務端口}],"UpstreamPathTemplate": "/Test83/{url}", //網關地址: Url變量"UpstreamHttpMethod": [ "Get", "Post" ]}]
    }

    3.2.3?單地址多實例負載均衡

    ????????可以負載均衡,客戶端請求網關時,會根據負載策略去匹配不同的示例。但是不能動態伸縮服務, 所以一般不會使用他來做負載均衡, 需要和Consul做集成。這種處理方式和nginx的負載很像。

    //*****************************單地址多實例負載均衡********************************
    {"Routes": [{"DownstreamPathTemplate": "/api/{url}", //服務地址Url變量"DownstreamScheme": "http","DownstreamHostAndPorts": [{"Host": "127.0.0.1","Port": 81},{"Host": "127.0.0.1","Port": 82},{"Host": "127.0.0.1","Port": 83} //能負載均衡,但是不能動態伸縮, 需要結合Consul來完成],"UpstreamPathTemplate": "/Test/{url}", //網關地址: Url變量"UpstreamHttpMethod": [ "Get", "Post" ],"LoadBalancerOptions": {"Type": "RoundRobin" //輪詢 // "LeastConnection" //最小連接數的服務器  "NoLoadBalance" //不負載均衡 }}]
    }

    3.2.4?負載均衡+Consul(服務發現)

    ? ? ? ? 1、在網關中配置Consul,注冊Consul到Ocelot中,引用Ocelot.Provider.Consul

    dotnet add package Ocelot.Provider.Consul

    ? ? ? ? 2、配置Consul注冊到Ocelot

    builder.Services.AddOcelot().AddConsul();

    ps:ocelot請求時,通過Consul獲取的默認服務名稱會通過本機名字匹配。默認請求時可能會出現通過consul訪問對應服務節點的情況。(此處測試時Consul在window上運行)

    解決方案:啟動Consul的node節點.此處寫上服務端地址

    //設置node地址

    consul agent -dev -node=127.0.0.1

    ? ? ? ? 3、Json配置內容

    //*****************************Consul服務發現
    {"Routes": [{"DownstreamPathTemplate": "/api/{url}", //服務地址--url變量"DownstreamScheme": "http","UpstreamPathTemplate": "/Test/{url}", //網關地址--url變量"UpstreamHttpMethod": [ "Get", "Post" ],"UseServiceDiscovery": true,"ServiceName": "TestService", //consul服務名稱"LoadBalancerOptions": {"Type": "RoundRobin" //輪詢 "LeastConnection-最少連接數的服務器NoLoadBalance不負載均衡"}}],"GlobalConfiguration": {//"BaseUrl": "http://127.0.0.1:6299", //網關對外地址"ServiceDiscoveryProvider": {"Host": "127.0.0.1","Port": 8500,"Type": "Consul" //由Consul提供服務發現,每次請求去consul}}
    }

    四、文章總結

    ? ? ? ? 以上內容基本滿足網關搭建的使用,本篇主要介紹基礎的使用方式。Ocelot還有更多高級的用法,也會在后面的文章中慢慢補上。例如:Ocelot緩存、自定義負載均衡規則以及接入Polly的服務治理相關。

    ????????歡迎大家多多交流~

    本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
    如若轉載,請注明出處:http://www.pswp.cn/web/89862.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/web/89862.shtml
    英文地址,請注明出處:http://en.pswp.cn/web/89862.shtml

    如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

    相關文章

    零基礎入門:用按鍵精靈實現視頻自動操作(附完整腳本)

    摘要:本文手把手教你編寫視頻平臺的自動化腳本,涵蓋點擊、循環、防檢測等核心技巧,無需編程基礎,輕松實現自動播放/點贊/跳過廣告。(使用按鍵精靈2024版演示) 一、應用場景 自動化操作:自動跳過…

    AI(學習筆記第六課) 使用langchain進行AI開發 load documents(csv和文件夾)

    文章目錄AI(學習筆記第六課) 使用langchain進行AI開發 load documents(csv和文件夾)學習內容:1.load documents(csv)1.1 學習url1.2 load csv文件1.2.1 默認load1.2.2 csv文件內容1.2.2 執行csv文件的load1.3 Customizing the CSV parsing an…

    企業運維實戰:Jenkins 依賴 JDK21 與應用需 JDK1.8 共存方案(含流水線配置)

    前言:在企業運維中,“工具升級”與“業務兼容”的平衡始終是核心挑戰。近期我們遇到一個典型場景:Jenkins 升級到 2.450 版本后,強制要求 JDK21 運行環境;但開發團隊的應用程序因框架依賴,必須使用 JDK1.8 …

    爬蟲小知識三:selenium庫

    前言 selenium 庫是一種用于 Web 應用程序測試的工具,它可以驅動瀏覽器執行特定操作,自動按照腳本代碼做出單擊、輸入、打開、驗證等操作,支持的瀏覽器包括 IE、Firefox、Safari、Chrome、Opera 等。 與 requests 庫不同的是,se…

    Jmeter使用 -1

    1 接口測試1.1 為什么要進行接口測試接口測試能夠繞過前端校驗,對后端的接口處理邏輯進行測試(數據的邊界/格式/類型)在一些需要重復測試的需求中,接口自動化的效率比手工執行效率高1.2 接口測試流程熟悉API接口文檔(接…

    GitHub 趨勢日報 (2025年07月16日)

    📊 由 TrendForge 系統生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日報中的項目描述已自動翻譯為中文 📈 今日獲星趨勢圖 今日獲星趨勢圖2415markitdown570claude-code434ART330erpnext150MusicFree146rustdesk129vanna80…

    Python+Tkinter制作音頻格式轉換器

    我們將使用Python的Tkinter庫來構建一個音頻格式轉換器界面。由于音頻轉換需要實際的處理,我們將使用pydub庫(需要安裝)來進行音頻格式轉換。同時,我們會使用ffmpeg作為后端,因此請確保系統中已安裝ffmpeg并添加到環境…

    Haproxy算法精簡化理解及企業級高功能實戰

    文章目錄4. Haproxy的算法4.1 靜態算法4.1.1 static-rr:基于權重的輪詢調度1. 示例:4.1.2 first1. 示例2. 測試效果:4.2 動態算法4.2.1 roundrobin1. 示例2. 動態調整權重4.2.2 leastconn1. 示例4.3 其他算法4.3.1 source1. 示例2. 測試4.3.2…

    git fork的項目遠端標準協作流程 倉庫設置[設置成upstream]

    這是一個在開源協作中非常常見的配置。 簡單來說,upstream 在這里指的是你 Fork 來的那個原始的、官方的倉庫。 下面我們來詳細解釋一下這個 git remote -v 輸出的含義: 1. 兩條“遙控器” (Remotes) 你的 git 配置了兩個遠程倉庫的地址,就像…

    [FFmpeg] 輸入輸出訪問 | 管道系統 | AVIOContext 與 URLProtocol | 門面模式

    鏈接:https://trac.ffmpeg.org/ docs:FFmpeg FFmpeg 是一個強大的多媒體框架,旨在處理媒體處理的各個階段。 它就像一個數字媒體工廠,包含以下部門:打包/解包(容器處理)、 轉譯/壓縮&#xff…

    微服務的編程測評系統2

    提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄前言工程創建創建ck-oj創建oj-modules創建具體微服務oj-system推送碼云管理員登錄邏輯分析docker安裝mysqldocker客戶端docker desktop安裝安裝mysqlmysql-plus和數據…

    AR智能巡檢:電力運維的數字化變革

    在電力行業快速發展的當下,傳統運維方式已難以滿足現代電網對高效、安全的需求。近年來,增強現實(AR www.teamhelper.cn )技術的興起為電力巡檢帶來了全新的解決方案。通過實時數據可視化、遠程協作和智能分析,AR技術…

    NeRF和3DGS原理詳細

    NeRF和3DGS一、傳統三維表征方法1.1 顯示表征1.2 隱式表征二、NeRF(Nerual Radiance Field)2.1 NeRF場景表示2.2 NeRF訓練流程2.3 NeRF體渲染2.4 NeRF位置編碼2.5 NeRF體素分層采樣(Volume Hierarchical Sampling)2.6 NeRF網絡結構…

    035_ClaudeCode_MCP_介紹

    035_ClaudeCode_MCP_介紹 摘要 Model Context Protocol(MCP)是一個開放的標準化協議,專為大型語言模型提供上下文數據而設計。作為Claude Code生態系統的重要組成部分,MCP如同"AI應用程序的USB-C端口",提供…

    Python 程序無法找到 Oracle 的 64 位客戶端庫 (libclntsh.so)

    數據庫錯誤: DPI-1047: Cannot locate a 64-bit Oracle Client library: "libclntsh.so: cannot open shared object file: No such file or directory". See https://oracle.github.io/odpi/doc/installation.html#linux for help 這個錯誤表明 Python 程序無法找到…

    Kubernetes常用命令總結

    文章目錄Kubernetes常用命令總結1. 集群管理命令kubectl cluster-infokubectl get nodeskubectl describe node <node-name>kubectl top nodes2. Pod相關命令kubectl get podskubectl get pods -o widekubectl describe pod <pod-name>kubectl logs <pod-name&g…

    roboflow使用教程

    如何利用roboflow標注自己的訓練集、調用開源數據集 官網&#xff1a;Roboflow: Computer vision tools for developers and enterprises&#xff08;國內代理進不去&#xff09; 先注冊登陸進去 訓練自己的數據集 點擊“New Project”,名字按照自己的需求來 我不想寫了&am…

    IDEA中使用Tomcat兩種方式

    Catalogue1 集成本地Tomcat2 Tomcat Maven插件&#xff08;推薦&#xff09;1 集成本地Tomcat 將本地Tomcat集成到Idea中&#xff0c;然后進行項目部署即可 點擊編輯配置 點擊加號 添加local的Tomcat 配置Application Server 可以修改一下Name 至此&#xff0c;配置完成 …

    服務器上的文件復制到本地 Windows 系統

    在 Windows 上通過 SSH 連接到 Linux 服務器后&#xff0c;如果需要將服務器上的文件復制到本地 Windows 系統&#xff0c;可以使用以下幾種方法&#xff1a;方法 1&#xff1a;使用 scp&#xff08;Secure Copy&#xff09;命令 scp&#xff08;基于 SSH 的安全復制&#xff0…

    大語言模型置信度增強實戰指南

    LLM怎么簡單增強置信度 在大語言模型(LLM)的應用中,“置信度增強”核心目標是提升模型輸出的可靠性(減少錯誤/幻覺) 并讓模型更清晰地表達自身的不確定性(避免“一本正經地胡說”)。常用方式可分為“輸出優化”“知識補充”“校準調整”三大類, 一、基于“推理過程優…