YARP 是微軟開源的一個反向代理專案,英文名叫 Yet Another Reverse Proxy ,所謂反向代理最有名的那就是 nginx 了,沒錯 YARP 也可以用來完成 nginx 的大部分功能,比如根據不一樣的域名代理到不一樣的后端服務上,既然它可以做反向代理,那么其實也就可以做服務網關了,類似 Ocelot ,當然缺少部分功能,比如限流降級等,Anyway ,今天先來體驗一下,
運行 YARP
YARP 使用起來非常簡單,它只是一個類別庫而已,我們新建一個 ASP.NET Core 的空網站,然后使用 nuget 安裝 Yarp.ReverseProxy ,
Install-Package Yarp.ReverseProxy -Version 1.0.0
修改 program.cs 檔案為以下內容:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddReverseProxy()
.LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));
var app = builder.Build();
app.MapReverseProxy();
app.Run();
在 appsettings.json 檔案添加 ReverseProxy 節點:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ReverseProxy": {
"Routes": {
"route1" : {
"ClusterId": "cluster1",
"Match": {
"Path": "{**catch-all}"
},
}
},
"Clusters": {
"cluster1": {
"Destinations": {
"destination1": {
"Address": "https://www.baidu.com/"
}
}
}
}
}
}
我們配置一個集群cluster1,地址為百度的網址;再配置一個路由route1,匹配所有的url,這樣當我們訪問這個網站的時候所有的請求全部會代理給百度,
讓我們運行起來試一下:

可以看到我們訪問 localhost:5085 的地址百度的內容被渲染出來了,
集成 AgileConfig 來熱更新配置
通過以上我們簡單的演示了 YARP 的使用,我們的演示組態檔還算簡單,但是 YARP 的精髓其實都在組態檔里,如果你的代理策略很復雜那么 YARP 的配置就會相應的很復雜,使用本地的 appsettings.json 顯然每次更新組態檔太麻煩,而且需要重啟 YARP 網關,以下我們演示下 YARP 如何集成 AgileConfig ,使得配置可以在線編輯,并且支持熱更新,
AgileConfig 是一個輕量級的配置中心,可以方便的為 .NET 專案提供配置中心功能,專案地址:https://github.com/dotnetcore/AgileConfig ,
運行 AgileConfig 服務端
AgileConfig 服務端可以通過 docker 方便的部署起來,
sudo docker run \
--name agile_config \
-e TZ=Asia/Shanghai \
-e adminConsole=true \
-e db:provider=sqlite \
-e db:conn="Data Source=agile_config.db" \
-p 5000:5000 \
#-v /your_host_dir:/app/db \
-d kklldog/agile_config:latest
部署成功后,我們在應用界面新建一個應用:Yarp_test

在配置項編輯界面點擊“編輯 JSON”,彈出 JSON 編輯視圖,把原來 appsettings.json 檔案里的ReverseProxy節點的內容復制進去,點擊“保存”>“發布” ,

集成 AgileConfig.Client
AgileConfig 配置成功后,我們需要在 YARP 網關專案上集成 AgileConfig.Client ,通過它來讀取配置中心的配置,
使用 nuget 安裝 AgileConfig.Client :
Install-Package AgileConfig.Client -Version 1.2.1.5
在 appsettings.json 里添加 AgileConfig 節點,里面配置相關應用的資訊,并且刪掉原來的ReverseProxy節點,因為已經不需要了,
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"AgileConfig": {
"appId": "yarp_test",
"secret": "",
"nodes": "http://localhost:5000/"
}
}
修改 program.cs 檔案為如下內容:
var builder = WebApplication.CreateBuilder(args);
//add agileconfig configuration provider
builder.Host.ConfigureAppConfiguration((_, bd) => {
bd.AddAgileConfig();
});
builder.Services.AddReverseProxy()
.LoadFromConfig(builder.Configuration);
var app = builder.Build();
app.MapReverseProxy();
app.Run();
修改完之后,我們運行一下 YARP 網關專案,如果訪問localhost:5085能夠顯示百度的頁面那么說明配置中心的配置已經被正確的讀取到了,
熱更新
如果上面的步驟都成功了,那么我們可以來嘗試下配置的熱更新,打開 Agileconfig 的服務端,繼續編輯以上配置,我們把集群的地址改成 www.qq.com ,改成騰訊的網管,點擊“保存”>“發布”,

不用重啟 YARP 網關專案,我們直接重繪 localhost:5085 那個頁面,可以看到現在顯示的已經是騰訊的網頁了,

演示專案地址:https://github.com/kklldog/YarpDemo
關注我的公眾號一起玩轉技術

QQ群:1022985150 一起探討學習.NET技術
作者:Agile.Zhou(kklldog)
出處:http://www.cnblogs.com/kklldog/
本文著作權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/376814.html
標籤:.NET技术
