聊一聊Yarp结合Nacos完成服务发现
背景
Yarp 這個(gè)反向代理出來(lái)后,相信還是有不少人在關(guān)注的。
在 Yarp 中,反向代理的配置默認(rèn)也是基于配置文件的,也有不少大佬已經(jīng)把這個(gè)配置做成了數(shù)據(jù)庫(kù)配置+可視化界面。
仔細(xì)想了想,做成數(shù)據(jù)庫(kù)配置,好像只是便于配置的管理,對(duì)服務(wù)注冊(cè)和發(fā)現(xiàn)這一塊還是偏弱。
好比訂單服務(wù)加了 3 個(gè)實(shí)例,這個(gè)時(shí)候要去配置一下,把這 3 個(gè)實(shí)例加進(jìn)去。
如果增加的服務(wù)多了,頻率高了,肯定是不太想人工去介入的,會(huì)嫌麻煩。
尤其是在引入了注冊(cè)中心的情況下,都會(huì)想讓它自動(dòng)適配這些變化。
基于這個(gè)情況,老黃花時(shí)間嘗試了一下把 Yarp 和 Nacos 結(jié)合,讓服務(wù)和實(shí)例的新增、減少做了一個(gè)適配,可以動(dòng)態(tài)化,一定程度減少了人為的干預(yù)。
下面簡(jiǎn)單看看。
示例服務(wù)
準(zhǔn)備下面的服務(wù)
YarpWithNacosSample 反向代理集成
OrderSvcA ?訂單服務(wù)-A
OrderSvcB ?訂單服務(wù)-B
UserSvc ? ?用戶服務(wù)
其中兩個(gè)訂單服務(wù)是為了模擬服務(wù)實(shí)例上下線的,用戶服務(wù)是模擬服務(wù)上下線的。
下面三個(gè)業(yè)務(wù)服務(wù),代碼基本一樣
只貼出用戶服務(wù)的。
using?Nacos.AspNetCore.V2;var?builder?=?WebApplication.CreateBuilder(args);builder.Services.AddNacosAspNet(builder.Configuration);builder.Services.AddControllers();var?app?=?builder.Build();if?(app.Environment.IsDevelopment()) {app.UseDeveloperExceptionPage(); }app.UseRouting();app.UseEndpoints(endpoints?=> {endpoints.MapGet("/",?()?=>{return?Results.Ok("user?svc?9001");}); });app.Run("http://*:9001");然后是配置
{"Logging":?{"LogLevel":?{"Default":?"Warning","Nacos.AspNetCore":?"Information","Microsoft.Hosting.Lifetime":?"Information"}},"AllowedHosts":?"*","nacos":?{"ServerAddresses":?[?"http://localhost:8848"?],"DefaultTimeOut":?15000,"Namespace":?"yarp","ListenInterval":?1000,"ServiceName":?"usersvc","GroupName":?"DEFAULT_GROUP","ClusterName":?"DEFAULT","Weight":?100,"RegisterEnabled":?true,"InstanceEnabled":?true,"Ephemeral":?true,"Secure":?false,"ConfigUseRpc":?true,"NamingUseRpc":?true} }再來(lái)看看重點(diǎn)的反向代理這一塊。
using?global::Nacos.V2.DependencyInjection; using?Yarp.ReverseProxy.Configuration;var?builder?=?WebApplication.CreateBuilder(args);builder.Services.AddNacosV2Naming(x?=> {x.ServerAddresses?=?new?List<string>?{?"http://localhost:8848/"?};x.Namespace?=?"yarp";x.NamingUseRpc?=?true; });builder.Services.AddReverseProxy().AddNacosServiceDiscovery(groupNames:?"DEFAULT_GROUP",?percount:100,enableAutoRefreshService:?true,autoRefreshPeriod:?30);var?app?=?builder.Build();app.UseRouting();app.UseEndpoints(endpoints?=> {endpoints.MapGet("/yarp",?(IProxyConfigProvider?provider)?=>{var?res?=?provider.GetConfig();return?Results.Ok(res);});endpoints.MapReverseProxy(); });app.Run("http://*:9091");可以看到,反向代理這個(gè)項(xiàng)目并沒(méi)有注冊(cè)到 Nacos 上面去,因?yàn)樗恍枰l(fā)現(xiàn)其他服務(wù),并不需要被其他服務(wù)發(fā)現(xiàn)。
先啟動(dòng) OrderSvcA,讓其注冊(cè)到 Nacos。
再啟動(dòng)反向代理項(xiàng)目,這個(gè)時(shí)候可以看到日志,有輸出 OrderSvcA 加入的痕跡。
然后訪問(wèn) localhost:9091/yarp 看一下當(dāng)前的配置。
再通過(guò)反向代理訪問(wèn)一下 OrderSvc。
接下來(lái)啟動(dòng) OrderSvcB,讓其注冊(cè)到 Nacos。
這個(gè)時(shí)候,反向代理項(xiàng)目會(huì)顯示把這個(gè)新實(shí)例加進(jìn)去了。
這個(gè)時(shí)候訪問(wèn)會(huì)有負(fù)載均衡的策略去訪問(wèn) ordersvc。
最后再來(lái)看看新服務(wù)上線的情況,啟動(dòng) UserSvc。
再訪問(wèn)的話,也是正常的。
這里需要注意的是,新加的服務(wù),不會(huì)實(shí)時(shí)更新到配置中,取決于自動(dòng)刷新的間隔,因?yàn)?Nacos 目前沒(méi)有提供服務(wù)變動(dòng)的通知,只有服務(wù)實(shí)例的,所以這一塊是要定時(shí)主動(dòng)去查詢的。
到這里的話,基本上演示就結(jié)束了。
不過(guò)有人應(yīng)該會(huì)對(duì)轉(zhuǎn)發(fā)規(guī)則那一塊有疑問(wèn),為什么是 【反向代理地址/服務(wù)名/服務(wù)的相對(duì)路徑】
這一個(gè)是默認(rèn)的實(shí)現(xiàn),因?yàn)橐?guī)則這一塊,一百個(gè)人就會(huì)有一百個(gè)不一樣的,有想放請(qǐng)求頭的,查詢參數(shù)的等等,所以這一個(gè)是開放的,可以自由替換。
寫在最后
Yarp 還是個(gè)比較有意思的項(xiàng)目,后面應(yīng)該會(huì)有不少人使用。
目前這個(gè)擴(kuò)展包還是預(yù)覽版,沒(méi)有發(fā)布正式版,主要是想豐富一下內(nèi)容。
nacos-sdk-csharp 的地址 :https://github.com/nacos-group/nacos-sdk-csharp
nacos-csharp-extensions 的地址:https://github.com/catcherwong/nacos-csharp-extensions
本文示例代碼的地址 :https://github.com/catcherwong-archive/2021/tree/main/YarpWithNacosSample
總結(jié)
以上是生活随笔為你收集整理的聊一聊Yarp结合Nacos完成服务发现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 最近要出绩效了
- 下一篇: 如何预热Web API,减少初次执行时间