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