YARP+AgileConfig 5分钟实现一个支持配置热更新的代理网关
YARP 是微软开源的一个反向代理项目,英文名叫 Yet Another Reverse Proxy 。所谓反向代理最有名的那就是 nginx 了,没错 YARP 也可以用来完成 nginx 的大部分功能,比如根据不一样的域名代理到不一样的后端服务上。既然它可以做反向代理,那么其实也就可以做服务网关了,类似 Ocelot ,当然缺少部分功能,比如限流降级等。Anyway ,今天先来体验一下。
运行 YARP
YARP 使用起来非常简单,它只是一个类库而已。我们新建一个 ASP.NET Core 的空网站。然后使用 nuget 安装 Yarp.ReverseProxy 。
Install-Package Yarp.ReverseProxy -Version 1.0.0
修改 program.cs 文件为以下内容:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddReverseProxy().LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));
var app = builder.Build();
app.MapReverseProxy();
app.Run();
在 appsettings.json 文件添加 ReverseProxy 节点:
{"Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"}},"AllowedHosts": "*","ReverseProxy": {"Routes": {"route1" : {"ClusterId": "cluster1","Match": {"Path": "{**catch-all}"},}},"Clusters": {"cluster1": {"Destinations": {"destination1": {"Address": "https://www.baidu.com/"}}}}}
}
我们配置一个集群cluster1,地址为百度的网址;再配置一个路由route1,匹配所有的url。这样当我们访问这个网站的时候所有的请求全部会代理给百度。
让我们运行起来试一下:可以看到我们访问 localhost:5085 的地址百度的内容被渲染出来了。
集成 AgileConfig 来热更新配置
通过以上我们简单的演示了 YARP 的使用。我们的演示配置文件还算简单,但是 YARP 的精髓其实都在配置文件里,如果你的代理策略很复杂那么 YARP 的配置就会相应的很复杂。使用本地的 appsettings.json 显然每次更新配置文件太麻烦,而且需要重启 YARP 网关。以下我们演示下 YARP 如何集成 AgileConfig ,使得配置可以在线编辑,并且支持热更新。
AgileConfig 是一个轻量级的配置中心,可以方便的为 .NET 项目提供配置中心功能,项目地址:https://github.com/dotnetcore/AgileConfig 。
运行 AgileConfig 服务端
AgileConfig 服务端可以通过 docker 方便的部署起来。
sudo docker run \
--name agile_config \
-e TZ=Asia/Shanghai \
-e adminConsole=true \
-e db:provider=sqlite \
-e db:conn="Data Source=agile_config.db" \
-p 5000:5000 \
#-v /your_host_dir:/app/db \
-d kklldog/agile_config:latest
部署成功后,我们在应用界面新建一个应用:Yarp_test
在配置项编辑界面点击“编辑 JSON”,弹出 JSON 编辑视图,把原来 appsettings.json 文件里的ReverseProxy节点的内容复制进去。点击“保存”>“发布” 。
集成 AgileConfig.Client
AgileConfig 配置成功后,我们需要在 YARP 网关项目上集成 AgileConfig.Client ,通过它来读取配置中心的配置。
使用 nuget 安装 AgileConfig.Client :
Install-Package AgileConfig.Client -Version 1.2.1.5
在 appsettings.json 里添加 AgileConfig 节点,里面配置相关应用的信息,并且删掉原来的ReverseProxy节点,因为已经不需要了。
{"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"AllowedHosts": "*","AgileConfig": {"appId": "yarp_test","secret": "","nodes": "http://localhost:5000/"}
}
修改 program.cs 文件为如下内容:
var builder = WebApplication.CreateBuilder(args);//add agileconfig configuration provider
builder.Host.ConfigureAppConfiguration((_, bd) => {bd.AddAgileConfig();
});builder.Services.AddReverseProxy().LoadFromConfig(builder.Configuration);var app = builder.Build();
app.MapReverseProxy();
app.Run();
修改完之后,我们运行一下 YARP 网关项目,如果访问localhost:5085能够显示百度的页面那么说明配置中心的配置已经被正确的读取到了。
热更新
如果上面的步骤都成功了,那么我们可以来尝试下配置的热更新。打开 Agileconfig 的服务端,继续编辑以上配置,我们把集群的地址改成 www.qq.com ,改成腾讯的网管。点击“保存”>“发布”。
不用重启 YARP 网关项目,我们直接刷新 localhost:5085 那个页面,可以看到现在显示的已经是腾讯的网页了。
演示项目地址:https://github.com/kklldog/YarpDemo
YARP+AgileConfig 5分钟实现一个支持配置热更新的代理网关相关推荐
- 基于选项模式实现.NET Core的配置热更新
作者 | 秦元培 出品 | CSDN(ID:CSDNnews) 头图 | CSDN 下载自东方 IC 最近在面试的时候,遇到了一个关于 .NET Core 配置热更新的问题,顾名思义,就是在应用程序的 ...
- Nacos配置管理-配置热更新
配置热更新 我们最终的目的,是修改nacos中的配置后,微服务中无需重启即可让配置生效,也就是配置热更新. 要实现配置热更新,可以使用两种方式: 方式一 在@Value注入的变量所在类上添加注解@Re ...
- Nacos配置管理——配置热更新
文章目录 Nacos配置热更新 1.方式一 2.方式二 Nacos配置热更新 我们引入Nacos配置中心的最终目的,是修改nacos中的配置后,微服务中无需重启即可让配置生效,也就是配置热更新. 要实 ...
- Nacos配置热更新两种方式。
1:目的: 修改nacos中的配置后,微服务中无需重启即可让配置生效,也就是配置热更新 2:方式 (1)在@Value注入的变量所在类上添加注解@RefreshScope:(在这里呢应该辉出现空指针异 ...
- IDEA SpringBoot项目配置热更新,无需每次手动重启服务器
IDEA SpringBoot项目配置热更新的步骤 在pom.xml中添加依赖: <dependency><groupId>org.springframework.boot&l ...
- 技术分享|集成开放平台使用Consul Watch机制实现配置热更新
源宝导读:在微服务架构体系中,由于微服务众多,服务之间又有互相调用关系,因此,一个通用的分布式配置管理是必不可少的.本文将介绍如何使用Consul Watch机制实现配置集中管理与热更新. 前言 随着 ...
- flutter已经支持安卓热更新_flutter 在 android 上的热更新
热更新是一种需求吧. 自然会想到flutter 是否支持热更新. 然后一些群里问了问普遍反映不可以热更新,还说咸鱼的文章写了不支持热更新. 然后我表示很怀疑. 我的结论可以做到热更新 1.你需要把fl ...
- konfig:采用ConfigMap实现线上配置热更新
前言 利用kubernetes部署应用越来越流行,而运行在kubernetes中的服务需要的各种各样的配置如何才能实现热更新?难道需要在kubernetes中再部署zookeeper或者etcd之类的 ...
- uLua,一个Unity+Lua热更新解决方案!
原文:http://game.ceeger.com/forum/read.php?tid=16483&fid=16 看了坛子上同学用Kopilua,以为真的跨平台没问题,就实验了安卓手机,然后 ...
最新文章
- Spring AOP的一些概念
- 分布式CAP中情侣的纠缠故事,真是剪不断 理还乱!
- 入门HTML的回顾,小总结
- 业务工作流平台设计(九)
- http://www.cnblogs.com/qtqq/p/5271164.html
- python正则表达regex_Python 正则表达式(RegEx)
- ES6—类的实现原理
- codeigniter mysql error_CodeIgniter:无法使用提供的设置错误消息连接到数据库服务器...
- python输出矩阵的转置_Python 矩阵转置的几种方法小结
- 【转】OWIN是什么?
- K8S精华问答 | Kubernetes集群常见问题
- react+wabpack 搭建
- cogs——2416. [HZOI 2016]公路修建
- 拓端tecdat|R语言混合效应逻辑回归(mixed effects logistic)模型分析肺癌数据
- 微分销机制设计_免费快速搭建微信分销商城_OctShop源码
- justauth对接facebook、linkedin、twitter登陆
- 报表生成器FastReport .Net如何存储和加载报告
- python孩子 哪里学_Python知识免费学!孩子提高逻辑思维,这样练就够了!
- 小数输出最简分数c语言,小数化成最简式分数
- 表横竖转换(行列转换)PIVOT 和 UNPIVOT 用法
热门文章
- ASP.NET MVC 个人学习笔记之 Controller传值
- yaml加配置文件后起不来_YAML配置文件管理资源
- .net core MongoDB 初试
- Javascript基础学习20问(二)
- java学习(七)java中抽象类及 接口
- 【ACM】nyoj_305_表达式求值_201308081018
- 代码收藏——js+asp 的屏幕滚动脚本
- 开发第一个Meeting App
- windows rt_如何在Windows RT上轻松将网站添加到Flash白名单
- 网页背景平铺_在大约十秒钟内为网页创建无缝平铺背景