Ocelot的應用案例

搭建3個項目,分別是OcelotDemo、ServerApi1和ServerApi2這3個項目。訪問都是通過OcelotDemo進行輪訓轉發。

代碼案例鏈接:https://download.csdn.net/download/ly1h1/90715035

1.架構圖

?2.解決方案結構

3.步驟一,添加Nuget包

4.步驟二,配置ocelot.json

{"Routes": [{"DownstreamPathTemplate": "/api/values/{action}","DownstreamScheme": "http","DownstreamHostAndPorts": [{"Host": "localhost","Port": 5000}, // ServerAPI1{"Host": "localhost","Port": 8016} // ServerAPI2],"UpstreamPathTemplate": "/balanced-api/values/{action}","UpstreamHttpMethod": [ "GET", "POST" ],"LoadBalancerOptions": {"Type": "RoundRobin" // 輪詢策略}}],"GlobalConfiguration": {"BaseUrl": "http://localhost:8080"}
}

5.編寫OcelotDemo的Program

using Ocelot.DependencyInjection;
using Ocelot.Middleware;var builder = WebApplication.CreateBuilder(args);
builder.Configuration.AddJsonFile("ocelot.json", optional: false, reloadOnChange: true);
builder.Services.AddOcelot(builder.Configuration);var app = builder.Build();
if (app.Environment.IsDevelopment())
{app.UseDeveloperExceptionPage();
}
await app.UseOcelot();
app.Run("http://localhost:8080");

5.步驟三,編寫ServerApi1的接口

using Microsoft.AspNetCore.Mvc;
using ServerAPI1.Models;namespace ServerAPI1.Controllers
{[ApiController][Route("api/[controller]")][Produces("application/json")]public class ValuesController : ControllerBase{/// <summary>/// 獲取服務基本信息/// </summary>[HttpGet("info")][ProducesResponseType(200)]public IActionResult GetInfo(){return Ok(new { Service = "ServerAPI1", Port = 5000 });}/// <summary>/// 計算服務 (A+B)/// </summary>/// <param name="model">輸入參數</param>[HttpPost("calculate")][ProducesResponseType(200)][ProducesResponseType(400)]public IActionResult Calculate([FromBody] TestModel model){if (!ModelState.IsValid) return BadRequest(ModelState);return Ok(new { Result = 123 + 321, Input = model });}}
}---------------------------
using System.ComponentModel.DataAnnotations;namespace ServerAPI1.Models
{public class TestModel{[Required][StringLength(100)]public string AAA { get; set; }[StringLength(200)]public string BBB { get; set; }}
}

6.步驟四,編寫ServerApi1的Program

var builder = WebApplication.CreateBuilder(args);// 添加Swagger
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c =>
{c.SwaggerDoc("v1", new() { Title = "ServerAPI1", Version = "v1" });
});builder.Services.AddControllers();
var app = builder.Build();// 配置Swagger
if (app.Environment.IsDevelopment())
{app.UseSwagger();app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "ServerAPI1 v1"));
}app.UseRouting();
app.MapControllers();
app.Run("http://localhost:5000");

步驟五,編寫Server2的接口

using Microsoft.AspNetCore.Mvc;
using ServerAPI2.Models;namespace ServerAPI2.Controllers
{[ApiController][Route("api/[controller]")][Produces("application/json")]public class ValuesController : ControllerBase{/// <summary>/// 獲取服務元數據/// </summary>[HttpGet("info")][ProducesResponseType(200)]public IActionResult GetInfo(){return Ok(new { Service = "ServerAPI2", Port = 8016 });}/// <summary>/// 字符串轉換服務/// </summary>/// <param name="model">輸入參數</param>[HttpPost("calculate")][ProducesResponseType(200)][ProducesResponseType(400)]public IActionResult Transform([FromBody] TestModel model){if (!ModelState.IsValid) return BadRequest(ModelState);return Ok(new { Result = $"{model.AAA}-{model.BBB}".ToUpper() });}}
}
----------------------------
using System.ComponentModel.DataAnnotations;namespace ServerAPI2.Models
{public class TestModel{[Required][StringLength(100)]public string AAA { get; set; }[StringLength(200)]public string BBB { get; set; }}
}

7.步驟六,編寫ServerAPI2的Program

var builder = WebApplication.CreateBuilder(args);// 添加Swagger
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c =>
{c.SwaggerDoc("v1", new() { Title = "ServerAPI2", Version = "v1" });
});builder.Services.AddControllers();
var app = builder.Build();// 配置Swagger
if (app.Environment.IsDevelopment())
{app.UseSwagger();app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "ServerAPI2 v1"));
}app.UseRouting();
app.MapControllers();
app.Run("http://localhost:8016");

8.測試

采用PostMan直接訪問http://localhost:8080/balanced-api/values/info

可實現Server1和Server2的輪詢調用。

9.如果需要網關地址和服務是一對一

{"Routes": [{"DownstreamPathTemplate": "/api/values/{action}","DownstreamScheme": "http","DownstreamHostAndPorts": [{"Host": "localhost","Port": 5000}],"UpstreamPathTemplate": "/service1/api/values/{action}","UpstreamHttpMethod": [ "GET", "POST" ]},{"DownstreamPathTemplate": "/api/values/{action}","DownstreamScheme": "http","DownstreamHostAndPorts": [{"Host": "localhost","Port": 8016}],"UpstreamPathTemplate": "/service2/api/values/{action}","UpstreamHttpMethod": [ "GET", "POST" ]}],"GlobalConfiguration": {"BaseUrl": "http://localhost:8080"}
}

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

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

相關文章

DeepSeek+Dify之五工作流引用API案例

DeepSeekDify之四Agent引用知識庫案例 文章目錄 背景整體流程測試數據用到的節點開始HTTP請求LLM參數提取器代碼執行結束 實現步驟1、新建工作流2、開始節點3、Http請求節點4、LLM節點&#xff08;大模型檢索&#xff09;5、參數提取器節點&#xff08;提取大模型檢索后數據&am…

《從分遺產說起:JS 原型與繼承詳解》

“天天開心就好” 先來講講概念&#xff1a; 原型&#xff08;Prototype&#xff09; 什么是原型&#xff1f; 原型是 JavaScript 中實現對象間共享屬性和方法的機制。每個 JavaScript 對象&#xff08;除了 null&#xff09;都有一個內部鏈接指向另一個對象&#xff0c;這…

立馬耀:通過阿里云 Serverless Spark 和 Milvus 構建高效向量檢索系統,驅動個性化推薦業務

作者&#xff1a;廈門立馬耀網絡科技有限公司大數據開發工程師 陳宏毅 背景介紹 行業 蟬選是蟬媽媽出品的達人選品服務平臺。蟬選秉持“陪伴達人賺到錢”的品牌使命&#xff0c;致力于洞悉達人變現需求和痛點&#xff0c;提供達人選高傭、穩變現、速響應的選品服務。 業務特…

Android顯示學習筆記本

根據博客 Android-View 繪制原理(01)-JAVA層分析_android view draw原理分析-CSDN博客 提出了我的疑問 Canvas RenderNode updateDisplayListDirty 這些東西的關系 您的理解在基本方向上是對的&#xff0c;但讓我詳細解釋一下 Android 中 updateDisplayListDirty、指令集合、…

JavaWeb學習打卡-Day4-會話技術、JWT、Filter、Interceptor

會話技術 會話&#xff1a;用戶打開瀏覽器&#xff0c;訪問web服務器的資源&#xff0c;會話建立&#xff0c;直到有一方斷開連接&#xff0c;會話結束。在一次會話中可以包含多次請求和響應。會話跟蹤&#xff1a;一種維護瀏覽器狀態的方法&#xff0c;服務器需要識別多次請求…

讓數據優雅落地:用 serde::Deserialize 玩轉結構體實體

前言 想象一下,服務器突然飛來一堆 JSON 數據,就像一群無頭蒼蠅沖進辦公室,嗡嗡作響,橫沖直撞。此刻,你的任務,就是把這群“迷路數據”安置進正確的格子里,分門別類,秩序井然,不混不亂,不漏一只。 好在 Rust 早就為我們備好瑞士軍刀:serde::Deserialize。它不僅刀…

Virtio 技術解析 | 框架、設備實現與實踐指南

本文為 “Virtio” 相關文章合輯。 略作重排&#xff0c;如有內容異常&#xff0c;請看原文。 Virtio 簡介&#xff08;一&#xff09;—— 框架分析 posted 2021-04-21 10:14 Edver 1. 概述 在傳統設備模擬中&#xff0c;虛擬機內部設備驅動完全不知自身處于虛擬化環境&a…

云計算賦能質檢LIMS的價值 質檢LIMS系統在云計算企業的創新應用

在云計算技術高速發展的背景下&#xff0c;實驗室信息化管理正經歷深刻變革。質檢LIMS&#xff08;實驗室信息管理系統&#xff09;作為實驗室數字化轉型的核心工具&#xff0c;通過與云計算深度融合&#xff0c;為企業提供了高彈性、高安全性的解決方案。本文將探討質檢LIMS在…

【win11 安裝WSL2 詳解一遍過!!】

共有五個步驟&#xff0c;按部就班的做&#xff0c;保準成功&#xff01; 1. 打開開發者模式 設置->系統->開發者模式 2. 打開linux的win子系統 找到控制面板-程序和功能-啟用或關閉Windows功能&#xff0c;選中“適用于Linux的Windows子系統”&#xff0c;“虛擬機…

Godot開發2D冒險游戲——第三節:游戲地圖繪制

一、初步構建游戲地圖 在游戲場景當中添加一個新的子節點&#xff1a;TileMapLayer 這一層稱為瓦片地圖層 根據提示&#xff0c;下一步顯然是添加資源 為TileMapLayer節點添加一個TileSet 將地板添加進來&#xff0c;然后選擇自動分割圖集 自定義時要確保大小合適 讓Godot自…

Django創建的應用目錄詳細解釋以及如何操作數據庫自動創建表

創建好Django項目后 如果要創建 python manage.py startapp 模塊名模塊 使用 我創建一個system模塊后是 注意:urls是我自己建的文件 1.migrations目錄 存放數據庫的遷移文件,當models.py中模型定義發生變化時&#xff0c;通過遷移操作能同步數據庫結構變化 __init__ 使該目錄…

將輸入幀上下文打包到下一個幀的預測模型中用于視頻生成

Paper Title: Packing Input Frame Context in Next-Frame Prediction Models for Video Generation 論文發布于2025年4月17日 Abstract部分 在這篇論文中,FramePack是一種新提出的網絡結構,旨在解決視頻生成中的兩個主要問題:遺忘和漂移。 具體來說,遺忘指的是在生成視…

STM32 串口USART

目錄 常見的通信方式 串行通信和并行通信 全雙工&#xff0c;半雙工和單工通信 同步通信和異步通信 通信速率 常見的通信協議 串口基礎知識 電平特性 串口傳輸協議 STM32F103的USART資源 端口引腳 數據寄存器單元 發送接收控制單元 實現串口發送 printf…

Taro on Harmony :助力業務高效開發純血鴻蒙應用

背景 純血鴻蒙逐漸成為全球第三大操作系統&#xff0c;業界也掀起了適配鴻蒙原生的浪潮&#xff0c;用戶遷移趨勢明顯&#xff0c;京東作為國民應用&#xff0c;為鴻蒙用戶提供完整的購物體驗至關重要。 &#xfeff; &#xfeff;&#xfeff; 去年 9 月&#xff0c;京東 AP…

gem5-gpu教程05 內存建模

memory-modeling|Details on how memory is modeled in gem5-gpu gem5-gpu’s Memory Simulation gem5-gpu在很大程度上避開了GPGPU-Sim的單獨功能模擬,而是使用了gem5的執行中執行模型。因此,當執行存儲/加載時,內存會被更新/讀取。沒有單獨的功能路徑。(順便說一句,這…

【python】lambda用法(結合例子理解)

目錄 lambda 是什么? 為什么叫 lambda? 語法 舉例 1. 最簡單的 lambda:單個數字處理 2. 用 lambda 排序一組字符串(按照長度排序) 3. 在列表里找出絕對值最小的數字 4. 給 map() 用 lambda 5. 組合使用:篩選出偶數 lambda 和 def 的對比 lambda 適合用在什么地…

【ROS2】機器人操作系統安裝到Ubuntu22.04簡介(手動)

主要參考&#xff1a; https://book.guyuehome.com/ROS2/1.系統架構/1.3_ROS2安裝方法/ 官方文檔&#xff1a;https://docs.ros.org/en/humble/Installation.html 虛擬機與ubuntu系統安裝 略&#xff0c;見參考文檔 ubutun換國內源&#xff0c;略 1. 設置本地語言 確保您有…

C 調用 C++:extern “C” 接口詳解與實踐 C/C++混合編譯

C 調用 C&#xff1a;extern “C” 接口詳解與實踐 核心問題在于 C 編譯器會對函數名進行“修飾”&#xff08;Name Mangling&#xff09;以支持函數重載等特性&#xff0c;而 C 編譯器則不會。此外&#xff0c;C 語言本身沒有類、對象等概念。為了解決這個問題&#xff0c;我…

汽車制造行業如何在數字化轉型中抓住機遇?

近年來&#xff0c;隨著新一輪科技革命和產業變革的深入推進&#xff0c;汽車制造行業正迎來一場前所未有的數字化轉型浪潮。無論是傳統車企還是新勢力品牌&#xff0c;都在積極探索如何通過數字化技術提升競爭力、開拓新市場。那么&#xff0c;在這場變革中&#xff0c;汽車制…

k8s學習記錄(五):Pod親和性詳解

一、前言 上一篇文章初步探討了 Kubernetes 的節點親和性&#xff0c;了解到它在 Pod 調度上比傳統方式更靈活高效。今天我們繼續討論親和性同時Kubernetes 的調度機制。 二、Pod親和性 上一篇文章中我們介紹了節點親和性&#xff0c;今天我們講解一下Pod親和性。首先我們先看…