背景

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完成服务发现相关推荐

  1. 《Nacos(2) - 服务发现》

    <Nacos(2) - 服务发现> 提示: 本材料只做个人学习参考,不作为系统的学习流程,请注意识别!!! <Nacos-服务发现> <Nacos(2) - 服务发现&g ...

  2. nacos的服务发现详解

    Nacos源码系列整体栏目 [一]nacos服务注册底层源码详解 [二]nacos服务发现底层源码详解 [三]nacos的心跳机制底层源码详解 [四]nacos配置中心的底层源码详解 nacos的服务 ...

  3. Springboot集成nacos实现服务发现和配置中心

    Nacos是阿里巴巴开源的服务发现和配置中心的中间件,springboot集成nacos比较方便,只需要以下三步: 1.依赖配置(pom文件) <properties><spring ...

  4. nacos+gateway服务发现lb路由报503 Service Unavailable

    问题产生背景 使用 Nacos 作为注册中心,gateway 作为网关,网关通过lb的方式进行服务路由,在网关报503服务不可用Service Unavailable. 现象版本 SpringClou ...

  5. Nginx 使用 NACOS 实现服务发现和反向代理。不用reload

    现状 我们想把自己的 http 服务注册 nacos,然后使用nginx 来实现反向代理.官方提供了一个方案是 通过 java 来订阅nacos .当服务 ip 出现变化的时候.重新生成一份 ngin ...

  6. 云原生nacos之服务发现SDK

    注册实例 描述 注册一个实例到服务. void registerInstance(String serviceName, String ip, int port) throws NacosExcept ...

  7. ASP.NET Core结合Nacos来完成配置管理和服务发现

    目录 前言 Nacos的简介 启动Nacos 配置管理 服务发现 写在最后 前言 今年4月份的时候,和平台组的同事一起调研了一下Nacos,也就在那个时候写了.net core版本的非官方版的SDK. ...

  8. .net5+nacos+ocelot 配置中心和服务发现实现

    相关文章:手动造轮子--为Ocelot集成Nacos注册中心 出处:https://www.cnblogs.com/buruainiaaaa/p/14121176.html 作者:唐@ 最近一段时间 ...

  9. Nacos微服务注册发现、配置和管理微服务

    目录 Nacos介绍 什么是 Nacos? Nacos 地图 Nacos 生态图 Nacos 概念 地域 可用区 接入点 命名空间 配置 配置管理 配置项 配置集 配置集 ID 配置分组 配置快照 服 ...

最新文章

  1. xdebug模块输出文件名的配置说明
  2. 倒水问题(Java)
  3. [html] 请说说你在写布局时对于浏览器兼容性的感受或总结
  4. mysql 常用命令操作
  5. 【干货】借助用户画像解决电商业务问题.pdf(附下载链接)
  6. python matplotlib数据可视化教程_Python使用matplotlib实现数据可视化教程
  7. CrackMe022
  8. C++ 取得系统当前时间
  9. Win7下如何破解Visual Studio2008 90天试用版
  10. oracle导出要工具,Oracle导出工具的具体操作步骤详解
  11. Octotree:一款超实用的GitHub可视化代码树插件
  12. 肢解诺兰的逻辑:当科幻背离科学
  13. java读取txt文件内容
  14. 4_04_GLib库入门与实践_指针数组
  15. c语言编写一个程序计算某年某月有几天,c语言:输入某一年的第几天,计算并输出它是这一年的第几月第几日,具体怎样编程...
  16. 黑龙江省大学计算机学校排名2015,2015黑龙江省大学排行榜 哈工大第一
  17. spark编程ERROR01——java.lang.NullPointerException
  18. 【Arduino连接时钟模块在LCD1602上显示时间】
  19. 建木DevOps流程的快速运用
  20. 视频网站的工作原理-->m3u8视频文件的提取与解析(理论)

热门文章

  1. Django学习笔记(4)
  2. 配置PHP启动Apache服务报错
  3. C语言常用基础位操作
  4. .net中的mapinfo开发:准备(一)
  5. 【Android游戏开发十一】手把手让你爱上Android sdk自带“9妹”
  6. 2019.04.24笔记
  7. 4月18日 MySQL学习
  8. 你知道你常用的dos和linux命令吗?
  9. JVM学习记录-类加载的过程
  10. Information Retrieval 倒排索引 学习笔记