丽江北京网站建设,互联网营销师培训课程,如何使用阿里云建站,微信公众号开发文档背景 Yarp 这个反向代理出来后#xff0c;相信还是有不少人在关注的。在 Yarp 中#xff0c;反向代理的配置默认也是基于配置文件的#xff0c;也有不少大佬已经把这个配置做成了数据库配置可视化界面。仔细想了想#xff0c;做成数据库配置#xff0c;好像只是便于配置的… 背景 Yarp 这个反向代理出来后相信还是有不少人在关注的。在 Yarp 中反向代理的配置默认也是基于配置文件的也有不少大佬已经把这个配置做成了数据库配置可视化界面。仔细想了想做成数据库配置好像只是便于配置的管理对服务注册和发现这一块还是偏弱。好比订单服务加了 3 个实例这个时候要去配置一下把这 3 个实例加进去。如果增加的服务多了频率高了肯定是不太想人工去介入的会嫌麻烦。尤其是在引入了注册中心的情况下都会想让它自动适配这些变化。基于这个情况老黄花时间尝试了一下把 Yarp 和 Nacos 结合让服务和实例的新增、减少做了一个适配可以动态化一定程度减少了人为的干预。下面简单看看。示例服务 准备下面的服务YarpWithNacosSample 反向代理集成OrderSvcA 订单服务-AOrderSvcB 订单服务-BUserSvc 用户服务其中两个订单服务是为了模拟服务实例上下线的用户服务是模拟服务上下线的。下面三个业务服务代码基本一样只贴出用户服务的。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}
}再来看看重点的反向代理这一块。using global::Nacos.V2.DependencyInjection;
using Yarp.ReverseProxy.Configuration;var builder WebApplication.CreateBuilder(args);builder.Services.AddNacosV2Naming(x
{x.ServerAddresses new Liststring { 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);可以看到反向代理这个项目并没有注册到 Nacos 上面去因为它只需要发现其他服务并不需要被其他服务发现。先启动 OrderSvcA让其注册到 Nacos。再启动反向代理项目这个时候可以看到日志有输出 OrderSvcA 加入的痕迹。然后访问 localhost:9091/yarp 看一下当前的配置。再通过反向代理访问一下 OrderSvc。接下来启动 OrderSvcB让其注册到 Nacos。这个时候反向代理项目会显示把这个新实例加进去了。这个时候访问会有负载均衡的策略去访问 ordersvc。最后再来看看新服务上线的情况启动 UserSvc。再访问的话也是正常的。这里需要注意的是新加的服务不会实时更新到配置中取决于自动刷新的间隔因为 Nacos 目前没有提供服务变动的通知只有服务实例的所以这一块是要定时主动去查询的。到这里的话基本上演示就结束了。不过有人应该会对转发规则那一块有疑问为什么是 【反向代理地址/服务名/服务的相对路径】这一个是默认的实现因为规则这一块一百个人就会有一百个不一样的有想放请求头的查询参数的等等所以这一个是开放的可以自由替换。写在最后 Yarp 还是个比较有意思的项目后面应该会有不少人使用。目前这个扩展包还是预览版没有发布正式版主要是想丰富一下内容。nacos-sdk-csharp 的地址 https://github.com/nacos-group/nacos-sdk-csharpnacos-csharp-extensions 的地址https://github.com/catcherwong/nacos-csharp-extensions本文示例代码的地址 https://github.com/catcherwong-archive/2021/tree/main/YarpWithNacosSample