YARP+AgileConfig 5分钟实现一个支持配置热更新的代理网关
YARP 是微軟開源的一個反向代理項目,英文名叫 Yet Another Reverse Proxy 。所謂反向代理最有名的那就是 nginx 了,沒錯 YARP 也可以用來完成 nginx 的大部分功能,比如根據(jù)不一樣的域名代理到不一樣的后端服務(wù)上。既然它可以做反向代理,那么其實(shí)也就可以做服務(wù)網(wǎng)關(guān)了,類似 Ocelot ,當(dāng)然缺少部分功能,比如限流降級等。Anyway ,今天先來體驗(yàn)一下。
運(yùn)行 YARP
YARP 使用起來非常簡單,它只是一個類庫而已。我們新建一個 ASP.NET Core 的空網(wǎng)站。然后使用 nuget 安裝 Yarp.ReverseProxy 。
Install-Package?Yarp.ReverseProxy?-Version?1.0.0修改 program.cs 文件為以下內(nèi)容:
var?builder?=?WebApplication.CreateBuilder(args); builder.Services.AddReverseProxy().LoadFromConfig(builder.Configuration.GetSection("ReverseProxy")); var?app?=?builder.Build(); app.MapReverseProxy(); app.Run();在 appsettings.json 文件添加 ReverseProxy 節(jié)點(diǎn):
{"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,地址為百度的網(wǎng)址;再配置一個路由route1,匹配所有的url。這樣當(dāng)我們訪問這個網(wǎng)站的時候所有的請求全部會代理給百度。
讓我們運(yùn)行起來試一下:可以看到我們訪問 localhost:5085 的地址百度的內(nèi)容被渲染出來了。
集成 AgileConfig 來熱更新配置
通過以上我們簡單的演示了 YARP 的使用。我們的演示配置文件還算簡單,但是 YARP 的精髓其實(shí)都在配置文件里,如果你的代理策略很復(fù)雜那么 YARP 的配置就會相應(yīng)的很復(fù)雜。使用本地的 appsettings.json 顯然每次更新配置文件太麻煩,而且需要重啟 YARP 網(wǎng)關(guān)。以下我們演示下 YARP 如何集成 AgileConfig ,使得配置可以在線編輯,并且支持熱更新。
AgileConfig 是一個輕量級的配置中心,可以方便的為 .NET 項目提供配置中心功能,項目地址:https://github.com/dotnetcore/AgileConfig 。
運(yùn)行 AgileConfig 服務(wù)端
AgileConfig 服務(wù)端可以通過 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部署成功后,我們在應(yīng)用界面新建一個應(yīng)用:Yarp_test
在配置項編輯界面點(diǎn)擊“編輯 JSON”,彈出 JSON 編輯視圖,把原來 appsettings.json 文件里的ReverseProxy節(jié)點(diǎn)的內(nèi)容復(fù)制進(jìn)去。點(diǎn)擊“保存”>“發(fā)布” 。
集成 AgileConfig.Client
AgileConfig 配置成功后,我們需要在 YARP 網(wǎng)關(guān)項目上集成 AgileConfig.Client ,通過它來讀取配置中心的配置。
使用 nuget 安裝 AgileConfig.Client :
在 appsettings.json 里添加 AgileConfig 節(jié)點(diǎn),里面配置相關(guān)應(yīng)用的信息,并且刪掉原來的ReverseProxy節(jié)點(diǎn),因?yàn)橐呀?jīng)不需要了。
{"Logging":?{"LogLevel":?{"Default":?"Information","Microsoft.AspNetCore":?"Warning"}},"AllowedHosts":?"*","AgileConfig":?{"appId":?"yarp_test","secret":?"","nodes":?"http://localhost:5000/"} }修改 program.cs 文件為如下內(nèi)容:
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();修改完之后,我們運(yùn)行一下 YARP 網(wǎng)關(guān)項目,如果訪問localhost:5085能夠顯示百度的頁面那么說明配置中心的配置已經(jīng)被正確的讀取到了。
熱更新
如果上面的步驟都成功了,那么我們可以來嘗試下配置的熱更新。打開 Agileconfig 的服務(wù)端,繼續(xù)編輯以上配置,我們把集群的地址改成 www.qq.com ,改成騰訊的網(wǎng)管。點(diǎn)擊“保存”>“發(fā)布”。
不用重啟 YARP 網(wǎng)關(guān)項目,我們直接刷新 localhost:5085 那個頁面,可以看到現(xiàn)在顯示的已經(jīng)是騰訊的網(wǎng)頁了。
演示項目地址:https://github.com/kklldog/YarpDemo
總結(jié)
以上是生活随笔為你收集整理的YARP+AgileConfig 5分钟实现一个支持配置热更新的代理网关的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WPF学习笔记(二):初学者避坑实录
- 下一篇: 如何判断当前请求的API类型