聊一聊Yarp结合Nacos完成服务发现
背景
Yarp 这个反向代理出来后,相信还是有不少人在关注的。
在 Yarp 中,反向代理的配置默认也是基于配置文件的,也有不少大佬已经把这个配置做成了数据库配置+可视化界面。
仔细想了想,做成数据库配置,好像只是便于配置的管理,对服务注册和发现这一块还是偏弱。
好比订单服务加了 3 个实例,这个时候要去配置一下,把这 3 个实例加进去。
如果增加的服务多了,频率高了,肯定是不太想人工去介入的,会嫌麻烦。
尤其是在引入了注册中心的情况下,都会想让它自动适配这些变化。
基于这个情况,老黄花时间尝试了一下把 Yarp 和 Nacos 结合,让服务和实例的新增、减少做了一个适配,可以动态化,一定程度减少了人为的干预。
下面简单看看。
示例服务
准备下面的服务
YarpWithNacosSample 反向代理集成
OrderSvcA 订单服务-A
OrderSvcB 订单服务-B
UserSvc 用户服务
其中两个订单服务是为了模拟服务实例上下线的,用户服务是模拟服务上下线的。
下面三个业务服务,代码基本一样
只贴出用户服务的。
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 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");
可以看到,反向代理这个项目并没有注册到 Nacos 上面去,因为它只需要发现其他服务,并不需要被其他服务发现。
先启动 OrderSvcA,让其注册到 Nacos。
再启动反向代理项目,这个时候可以看到日志,有输出 OrderSvcA 加入的痕迹。
然后访问 localhost:9091/yarp
看一下当前的配置。
再通过反向代理访问一下 OrderSvc。
接下来启动 OrderSvcB,让其注册到 Nacos。
这个时候,反向代理项目会显示把这个新实例加进去了。
这个时候访问会有负载均衡的策略去访问 ordersvc。
最后再来看看新服务上线的情况,启动 UserSvc。
再访问的话,也是正常的。
这里需要注意的是,新加的服务,不会实时更新到配置中,取决于自动刷新的间隔,因为 Nacos 目前没有提供服务变动的通知,只有服务实例的,所以这一块是要定时主动去查询的。
到这里的话,基本上演示就结束了。
不过有人应该会对转发规则那一块有疑问,为什么是 【反向代理地址/服务名/服务的相对路径】
这一个是默认的实现,因为规则这一块,一百个人就会有一百个不一样的,有想放请求头的,查询参数的等等,所以这一个是开放的,可以自由替换。
写在最后
Yarp 还是个比较有意思的项目,后面应该会有不少人使用。
目前这个扩展包还是预览版,没有发布正式版,主要是想丰富一下内容。
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
聊一聊Yarp结合Nacos完成服务发现相关推荐
- 《Nacos(2) - 服务发现》
<Nacos(2) - 服务发现> 提示: 本材料只做个人学习参考,不作为系统的学习流程,请注意识别!!! <Nacos-服务发现> <Nacos(2) - 服务发现&g ...
- nacos的服务发现详解
Nacos源码系列整体栏目 [一]nacos服务注册底层源码详解 [二]nacos服务发现底层源码详解 [三]nacos的心跳机制底层源码详解 [四]nacos配置中心的底层源码详解 nacos的服务 ...
- Springboot集成nacos实现服务发现和配置中心
Nacos是阿里巴巴开源的服务发现和配置中心的中间件,springboot集成nacos比较方便,只需要以下三步: 1.依赖配置(pom文件) <properties><spring ...
- nacos+gateway服务发现lb路由报503 Service Unavailable
问题产生背景 使用 Nacos 作为注册中心,gateway 作为网关,网关通过lb的方式进行服务路由,在网关报503服务不可用Service Unavailable. 现象版本 SpringClou ...
- Nginx 使用 NACOS 实现服务发现和反向代理。不用reload
现状 我们想把自己的 http 服务注册 nacos,然后使用nginx 来实现反向代理.官方提供了一个方案是 通过 java 来订阅nacos .当服务 ip 出现变化的时候.重新生成一份 ngin ...
- 云原生nacos之服务发现SDK
注册实例 描述 注册一个实例到服务. void registerInstance(String serviceName, String ip, int port) throws NacosExcept ...
- ASP.NET Core结合Nacos来完成配置管理和服务发现
目录 前言 Nacos的简介 启动Nacos 配置管理 服务发现 写在最后 前言 今年4月份的时候,和平台组的同事一起调研了一下Nacos,也就在那个时候写了.net core版本的非官方版的SDK. ...
- .net5+nacos+ocelot 配置中心和服务发现实现
相关文章:手动造轮子--为Ocelot集成Nacos注册中心 出处:https://www.cnblogs.com/buruainiaaaa/p/14121176.html 作者:唐@ 最近一段时间 ...
- Nacos微服务注册发现、配置和管理微服务
目录 Nacos介绍 什么是 Nacos? Nacos 地图 Nacos 生态图 Nacos 概念 地域 可用区 接入点 命名空间 配置 配置管理 配置项 配置集 配置集 ID 配置分组 配置快照 服 ...
最新文章
- xdebug模块输出文件名的配置说明
- 倒水问题(Java)
- [html] 请说说你在写布局时对于浏览器兼容性的感受或总结
- mysql 常用命令操作
- 【干货】借助用户画像解决电商业务问题.pdf(附下载链接)
- python matplotlib数据可视化教程_Python使用matplotlib实现数据可视化教程
- CrackMe022
- C++ 取得系统当前时间
- Win7下如何破解Visual Studio2008 90天试用版
- oracle导出要工具,Oracle导出工具的具体操作步骤详解
- Octotree:一款超实用的GitHub可视化代码树插件
- 肢解诺兰的逻辑:当科幻背离科学
- java读取txt文件内容
- 4_04_GLib库入门与实践_指针数组
- c语言编写一个程序计算某年某月有几天,c语言:输入某一年的第几天,计算并输出它是这一年的第几月第几日,具体怎样编程...
- 黑龙江省大学计算机学校排名2015,2015黑龙江省大学排行榜 哈工大第一
- spark编程ERROR01——java.lang.NullPointerException
- 【Arduino连接时钟模块在LCD1602上显示时间】
- 建木DevOps流程的快速运用
- 视频网站的工作原理-->m3u8视频文件的提取与解析(理论)