聊一聊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。

2631113156a2de02cad000ca4bc14666.png

再启动反向代理项目,这个时候可以看到日志,有输出 OrderSvcA 加入的痕迹。

331183a64f6ca00f4bcd99ae01281107.png

然后访问 localhost:9091/yarp 看一下当前的配置。

b4925bef20cd243158d711c58a41f982.png

再通过反向代理访问一下 OrderSvc。

3493db9596a1a086dae9532760a59491.png

接下来启动 OrderSvcB,让其注册到 Nacos。

26ada4f0ba777f669a5b9588495a6a8e.png

这个时候,反向代理项目会显示把这个新实例加进去了。

9e57bf88defd127ae15228d3036d3576.png

这个时候访问会有负载均衡的策略去访问 ordersvc。

5b917ac1d4caa28af3af2a8f0bc0af7e.png

最后再来看看新服务上线的情况,启动 UserSvc。

bcecacc05d48e885c94e3409b48aa744.png

再访问的话,也是正常的。

556b349fe2815826ae54d592a10c61ea.png

这里需要注意的是,新加的服务,不会实时更新到配置中,取决于自动刷新的间隔,因为 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293572.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

相亲对象能有多油腻......

1 冰起来再烧&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 还没从年假清醒的我&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 孙悟空为啥没被人收去当坐骑&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 成年人的潜台词&#xff08;素材…

C++之char*,const char*和string的相互转换

1. string转const char*string s "abc";const char* c_s s.c_str(); 2. const char*转string直接赋值即可const char* c_s "abc";string s(c_s); 3. string转char*string s "abc";char* c;const int len s.length();c new char[len1];strc…

教你如何迅速秒杀掉:99%的海量数据处理面试题

教你如何迅速秒杀掉&#xff1a;99%的海量数据处理面试题 作者&#xff1a;July 出处&#xff1a;结构之法算法之道blog 前言 一般而言&#xff0c;标题含有“秒杀”&#xff0c;“99%”&#xff0c;“史上最全/最强”等词汇的往往都脱不了哗众取宠之嫌&#xff0c;但进一步来讲…

poj 1986 Distance Queries

LCA 题意&#xff1a;LCA模板题&#xff0c;输入n和m&#xff0c;表示n个点m条边&#xff0c;下面m行是边的信息&#xff0c;两端点和权&#xff0c;后面的那个字母无视掉&#xff0c;没用的。接着k&#xff0c;下面k个询问lca&#xff0c;输出即可 有人说要考虑不连通的情况&a…

【.NET 遇上 GraphQL】 ChilliCream 平台介绍

ChilliCreamhttps://chillicream.com/https://github.com/ChilliCream/hotchocolateChilliCream 平台包含了四个产品, Hot Chocolate, Banana Cake Pop, Strawberry Shake, 平台提供开发人员工具和服务以加快整个开发过程。Hot ChocolateHot Chocolate 是 .NET 平台下的一个开源…

.NET 的 WebSocket 开发包比较

编者按 本文出现在第三方产品评论部分中。在这一部分的文章只提供给会员&#xff0c;不允许工具供应商用来以任何方式和形式来促销或宣传产品。请会员报告任何垃圾信息或广告。 Web项目常常需要将数据尽可能快地推送给客户&#xff0c;必要时无需等待客户端请求。对于与用户之间…

《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX

《CMake实践》笔记一&#xff1a;PROJECT/MESSAGE/ADD_EXECUTABLE 《CMake实践》笔记二&#xff1a;INSTALL/CMAKE_INSTALL_PREFIX 《CMake实践》笔记三&#xff1a;构建静态库与动态库 及 如何使用外部共享库和头文件 四、更好一点的Hello World 没有最好&#xff0c;只有更好…

14年前,林国强院士发现自己学生论文无法重复后,是这样处理的

全世界只有3.14 % 的人关注了爆炸吧知识本文转自&#xff1a;iNature让我们把时间拨回至 2007 年 3 月&#xff0c;当年&#xff0c;一封以林国强院士的名义发表的公开信&#xff0c;在网络上流传。信中披露&#xff0c;林院士发现自己的一名博士生发表在权威期刊《美国化学会志…

C++ char[] 与 string 转换

处理档案资料&#xff0c;最常使用 char[] 或 string 来储存字串&#xff0c;前者是 字元阵列 &#xff0c;为C所拥有&#xff0c;当然C也可以使用&#xff1b;而后者是C独有的 字串类别 &#xff0c;可以产生字串物件。在使用C处理字串时&#xff0c;时常会char[]和string互转…

支持向量机通俗导论(理解SVM的三层境界)

支持向量机通俗导论&#xff08;理解SVM的三层境界&#xff09; 作者&#xff1a; July &#xff1b; 致谢&#xff1a; pluskid、 白石、J erryLead。出处&#xff1a;结构之法算法之道 blog 。 前言 动笔写这个支持向量机(support vector machine)是费了不少劲和困难的&#…

WPF 实现加速小火箭~

WPF开发者QQ群&#xff1a; 340500857由于微信群人数太多入群请添加小编微信号yanjinhuawechat 或 W_Feng_aiQ 邀请入群需备注WPF开发者 PS&#xff1a;有更好的方式欢迎推荐。01—代码如下一、创建 SpeedRocketsExample.xaml 代码如下。<Window x:Class"WPFDevelopers…

第二十四天 多维数组

经过前面对一维数组和二维数组的学习&#xff0c;我们充分的掌握了数组的定义和使用&#xff0c;接下来我们该学习的是&#xff1a;多维数组。比较简单的方法&#xff0c;想要提高数组的维数只要在声明的时候在索引多加一个中括号即可。比如&#xff1a;我们要声明三维数组那么…

最懂男人心的内裤,戳100个洞透气,超舒服

▲ 点击查看有什么日用品&#xff0c;需要盆友们时不时就经常补货买买买的&#xff1f;除了家里的酱油、纸巾、沐浴露&#xff0c;还有一样hin重要&#xff0c;那就是内裤&#xff01;除了洗澡的空挡&#xff0c;内裤就一直穿在身上&#xff0c;可以说内裤是比女友还亲、比手机…

搬家到此,嘿嘿

希望能够把遇到的技术问题给记录起来&#xff0c;给我加油吧&#xff01; 之前一直在网易博客上记录&#xff0c;刚搬到此地&#xff0c;尽快习惯下来啦转载于:https://www.cnblogs.com/lwjlss/p/5682533.html

C++ throw:抛出自己的异常

throw 是C中的关键字&#xff0c;用来抛出异常。如果不使用 throw 关键字&#xff0c;try 就什么也捕获不到&#xff1b;上节提到的 at() 函数在内部也使用了 throw 关键字来抛出异常。throw 既可以用在标准库中&#xff0c;也可以用在自定义的函数中&#xff0c;抛出我们期望的…

git - svn 平滑到 git

1. 建立自己的git仓库&#xff0c;需要是空git仓库 2. checkout 你的 git仓库 3. svn忽略.git文件&#xff0c;忽略.git .gitignore 4. 把 .git文件拷到你的 svn仓库 5. git 上传文件 ————可以用&#xff0c;但是不符合我的情况———— 1. 所有需要用到的&#xff1a;git…

Logback也爆漏洞了,总结下最近log相关的几个漏洞

大家好&#xff0c;我是君哥&#xff0c;周末又要结束了。前些天 Apache Log4j2 接连报了几个重大漏洞&#xff0c;好在我们的系统使用的 logback&#xff0c;可当我们正庆幸的时候&#xff0c;logback 也爆出漏洞了。今天我们一起来看一下这几个漏洞。CVE-2021-42550先看一下官…

vim配置php语法高亮

安装vim之后&#xff0c;将php语法高亮插件 php.vim&#xff0c;放到/usr/share/vim/vimfiles/syntax 目录下 php语法高亮插件在这里下载&#xff1a;http://www.vim.org/scripts/script.php?script_id1571 然后配置vim配置文件 vimrc 在这里 /etc/vimrc ,增加一行 “s…

九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题

九月十月百度人搜&#xff0c;阿里巴巴&#xff0c;腾讯华为小米搜狗笔试面试八十题 引言 自发表上一篇文章至今&#xff08;事实上&#xff0c;上篇文章更新了近3个月之久&#xff09;&#xff0c;blog已经停了3个多月&#xff0c;而在那之前&#xff0c;自开博以来的21个月每…

C++ exception类

语言本身或者标准库抛出的异常都是 exception 的子类&#xff0c;称为标准异常&#xff08;Standard Exception&#xff09;。你可以通过下面的语句来匹配所有标准异常&#xff1a; try{ //可能抛出异常的语句}catch(exception &e){ //处理异常的语句} 之所以使用引用…