0%

.Net Core 7 Ocelot基本配置

前言

由於近期業務需求需要去幫忙架設 Ocelot的api gateway提供給部門使用,至於為什麼會採用這個而不是常見的 kong 或者是 spring cloud gateway 等等的方式,主要基於部分功能需要上Azure雲能申請的資源有限,部門內部的人員大多數又只會C#,所以只能透過這方式來建立api gateway了,但建立的時候發現官方文件寫的建立方式好像有一點落差,看起來有點像是.net core 6以下的作法,文件上的很多方法實質上看起來應該已經沒辦法用了。

所以參考一些文獻整理後打算寫一篇來幫助自己未來有需要時可以回憶。

建立環境

首先需要先建立一個 .net core 7的web api專案,建立方法這邊不過多贅述直接引入主題。

透過Nuget安裝Ocelot套件,詳細可以參考 Ocelot Git

再來就是回到專案找到Program.cs,並且在Program.cs底下建立以下三行程式碼

1
2
3
4
5
6
7
8
//step 1
builder.Configuration.SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("ocelot.json",optional:false,reloadOnChange: true);

//step 2
builder.Services.AddOcelot();

//step 3
app.UseOcelot().Wait();

最後看起來應該會是像這樣

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using Ocelot.DependencyInjection;
using Ocelot.Middleware;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Configuration.SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("ocelot.json",optional:false,reloadOnChange: true);

builder.Services.AddControllers();

builder.Services.AddOcelot();

var app = builder.Build();

// Configure the HTTP request pipeline.

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.UseOcelot().Wait();

app.Run();

建立ocelot.json

因為剛剛程式碼的step 1.有使用到對應的ocelot.json這邊要注意,檔案所放的目錄要對應程式所寫的位置,基本上我是直接建在專案,沒有再開而外資料夾做管理了。

再來說說ocelot.json該寫些甚麼呢,根據官方文件提到的如下沒錯這個建完,基本上功能就搞定了80%了

1
2
3
4
5
6
{
"Routes": [],
"GlobalConfiguration": {
"BaseUrl": "https://api.mybusiness.com"
}
}

當然依照實際需求的範例,如官方文件操作可以用以下內容的概念去寫

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"Routes": [
{
"DownstreamPathTemplate": "/todos/{id}",
"DownstreamScheme": "https",
"DownstreamHostAndPorts": [
{
"Host": "jsonplaceholder.typicode.com",
"Port": 443
}
],
"UpstreamPathTemplate": "/todos/{id}",
"UpstreamHttpMethod": [ "Get" ]
}
],
"GlobalConfiguration": {
"BaseUrl": "https://localhost:5000"
}
}

這裡需要注意的是BaseUrl屬性。Ocelot需要知道它運行的URL,以便程式進行查找和替換以及某些管理配置,所以千萬不能打錯。

結論

至於其他的功能因為目前照著文件做基本上沒有踩到甚麼大坑,如果有發現甚麼大坑的話會在上來分享。