背景

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. Docker安装Nacos动态服务发现、配置和服务管理平台

    一.通过DockerHub拉镜像,版本查看:https://github.com/nacos-group/nacos-docker //稳定版,有权限 docker pull nacos/nacos- ...

  2. SpringBoot使用Nacos服务发现

    本文介绍SpringBoot应用使用Nacos服务发现. 上一篇文章介绍了SpringBoot使用Nacos做配置中心,本文介绍SpringBoot使用Nacos做服务发现. 1.Eureka闭源 相 ...

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

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

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

    最近一段时间 因公司业务需要,需要使用.net5做一套微服务的接口,使用nacos 做注册中心和配置中心,ocelot做网关. 因为ocelot 支持的是consol和eureka,如果使用nacos ...

  5. spring-boot 2.5.4,nacos 作为配置、服务发现中心,Cloud Native Buildpacks 打包镜像,GitLab CI/CD

    spring-boot 2.5.4,nacos 作为配置.服务发现中心,Cloud Native Buildpacks 打包镜像,GitLab CI/CD 本文主要介绍 Java 通过 Cloud N ...

  6. 配置中心Nacos(服务发现)

    服务演变之路 单体应用架构 在刚开始的时候,企业的用户量.数据量规模都⽐较⼩,项⽬所有的功能模块都放在⼀个⼯程中编码.编译.打包并且部署在⼀个Tomcat容器中的架构模式就是单体应用架构,这样的架构既 ...

  7. Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现

    自Spring Cloud Alibaba发布第一个Release以来,就备受国内开发者的高度关注.虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭 ...

  8. SpringCloud使用Nacos服务发现实现远程调用

    本文使用SpringCloud结合Nacos服务发现,Feign远程调用做一个简单的Demo. 1 Nacos 关于Nacos之前写了两篇文章关于SpringBoot对它的使用,感兴趣可以查看一下. ...

  9. SpringCloud之Nacos服务发现(十七)

    一 Nacos简介 Nacos是以服务为主要服务对象的中间件,Nacos支持所有主流的服务发现.配置和管理. Nacos主要提供以下四大功能: 服务发现与服务健康检查 Nacos使服务更容易注册自己并 ...

随机推荐

  1. CF1542E2 Abnormal Permutation Pairs (hard version)

    CF1542E2 Abnormal Permutation Pairs (hard version) good tea. 对于两个排列 \(p,q\),如果 \(p\) 的字典序小于 \(q\),则要 ...

  2. js浮点运算的坑

    1,js浮点型小数点运算的问题. 这么简单的计算,js竟然算的是错的,究其原因,是因为js小数在内存存储方式的原因. 具体原因: JavaScript 里的数字是采用 IEEE 754 标准的 64 ...

  3. ProxyApi-大数据采集用的IP代理池

    用于大数据采集用的代理池 在数据采集的过程中,最需要的就是一直变化的代理ip. 自建adsl为问题是只有一个区域的IP. 买的代理存在的问题是不稳定,影响采集效率. 云vps不允许安装花生壳等,即使有 ...

  4. 商业创新不能等?用友低代码开发平台YonBuilder为您加速!

    随着云计算.人工智能.物联网.大数据.5G等新一代技术的快速发展,越来越多的企业希望借助技术的力量加速数智化转型,期许通过更加敏捷和强大的应用系统推动企业的商业创新速度.但传统软件开发周期长.开发成本 ...

  5. 巩固javaweb的第三十天

    显示用户输入信息 1 .代码 要想输出用户在上一个页面提交的信息,可以使用下面的代码: ${param.userid} ${param.username} ${param.userpass} ${pa ...

  6. 大数据学习day19-----spark02-------0 零碎知识点(分区,分区和分区器的区别) 1. RDD的使用(RDD的概念,特点,创建rdd的方式以及常见rdd的算子) 2.Spark中的一些重要概念

    0. 零碎概念 (1) 这个有点疑惑,有可能是错误的. (2) 此处就算地址写错了也不会报错,因为此操作只是读取数据的操作(元数据),表示从此地址读取数据但并没有进行读取数据的操作 (3)分区(有时间 ...

  7. Camera、音频录制与Vitamio框架

    一.Camera 1.概述 Android框架包含了各种相机哥相机功能的支持,是你可以在应用中捕获图像和视频. 在应用能使用设备上的相机之前,先想一想将来会如何使用此硬件: (1)Camera  应该 ...

  8. 在应用程序中的所有其他bean被销毁之前执行一步工作

    1.实现ServletContextListener.ApplicationContextAware两个接口,在销毁方法里借助ApplicationContextAware注入的application ...

  9. When should we write our own copy constructor?

    Reference:http://www.fredosaurus.com/notes-cpp/oop-condestructors/copyconstructors.html Please write ...

  10. SpringMVC(4):文件上传与下载

    一,文件上传 文件上传是项目开发中最常见的功能之一 ,springMVC 可以很好的支持文件上传,但是SpringMVC上下文中默认没有装配MultipartResolver,因此默认情况下其不能处理 ...