YARP+AgileConfig 5分钟实现一个支持配置热更新的代理网关

8a6025d5e6aef147ac951c6004cdeab2.png

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。这样当我们访问这个网站的时候所有的请求全部会代理给百度。
让我们运行起来试一下:7c86b566b3d676093430833e4bc5a4b1.png可以看到我们访问 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_testac65beed8ee75fe8b7af03d30f4d338c.png
在配置项编辑界面点击“编辑 JSON”,弹出 JSON 编辑视图,把原来 appsettings.json 文件里的ReverseProxy节点的内容复制进去。点击“保存”>“发布” 。6cfff3f0568aeb332c2fb26e02dfa6a3.png

集成 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 ,改成腾讯的网管。点击“保存”>“发布”。a615ef434ac5ae35fcf872079d8d7b21.png
不用重启 YARP 网关项目,我们直接刷新 localhost:5085 那个页面,可以看到现在显示的已经是腾讯的网页了。b48bfd9dcce7217905211ed18fce2e9f.png

演示项目地址:https://github.com/kklldog/YarpDemo

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

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

相关文章

Android之属性动画初步

Android动画系统包括View animation和Property animation,也就是视图动画和属性动画,属性动画有API限制,必须在API 11以上使用,不过有个开源项目NineOldAndroids,实现了对API 11之前版本的支持。   视图动画相对于属…

【IBatisNet Spring.Net】ORM与IOC 简单配置

1.修改WebConfig.cs配置文件 <configuration><configSections><sectionGroup name"spring"><section name"context" type"Spring.Context.Support.WebContextHandler, Spring.Web" /><section name"objects&quo…

Codeforces Round #323 (Div. 2) C.GCD Table

C. GCD TableThe GCD table G of size n  n for an array of positive integers a of length n is defined by formula Let us remind you that the greatest common divisor (GCD) of two positive integers x and y is the greatest integer that is divisor of both xand …

豆瓣9.8,它凭「少儿不宜」吊打所有美剧!脑洞大开必看神作!【内附资源】...

全世界只有3.14 % 的人关注了爆炸吧知识给最近剧荒的你安利一部脑洞大开、想象力天马行空的成人动画&#xff08;妥妥的神剧!&#xff09;——《Rick and Morty》Rick and Morty瑞克和莫蒂这部少儿不宜????的成人动画到底收获了多少好评呢&#xff1f;抛开拿到美国电视剧届…

java 继承与多态 习题_JAVA基础 第4章继承与多态_练习题_200910

Java基础第4章练习题大外软件学院第4章继承与多态一&#xff0e;选择题1. 编译和运行以下两文件结果是( D )。//文件P1.javapackage MyPackage;class P1{void afancymethod(){System.out.println("What a fancy method");}}//文件P2.javapackage YourPackage;import …

[设计模式原则]第五回:迪米特原则

1.引言 迪米特法则&#xff08;Law of Demeter&#xff09;又叫作最少知识原则&#xff08;LKP,Least Knowledge Principle&#xff09;&#xff0c;就是说一个对象应当对其他对象有尽可能少的了解&#xff0c;类与类之间的了解的越多&#xff0c;关系越密切&#xff0c;耦合度…

如何判断当前请求的API类型

前言上次&#xff0c;我们判断了《当前请求是否健康检查API》&#xff0c;避免其写入日志。但是&#xff0c;对于我们自己开发的API来说&#xff0c;最好也能来区分&#xff0c;比如调试用API&#xff0c;就不需要再写调用日志了。DisplayName方式直接判断路由地址的方式就不考…

Android之DrawText详解

如果你经常使用Canvas的draw***方法去绘制一些图像图形&#xff0c;绘制的坐标是从Canvas左上角开始计算的&#xff0c;如果想要把一个图像放到某个位置&#xff0c;直接drawBitmap传递图片左上角的坐标就行了。那drawText就不一样&#xff0c;如果你传递进去字符串&#xff0c…

Gruntjs: grunt-contrib-jst

预编译Underscore模板到JST文件&#xff08;Underscore&#xff1a;JS工具库) generate JavaScript template functions Gruntfile的配置实例&#xff1a; 1 module.exports function(grunt) {2 3 grunt.initConfig({4 jst: {5 bulid: {6 …

托马斯反驳牛顿被骂,普朗克颜值过高遭上帝捉弄,狄拉克却因爱情成话痨

全世界只有3.14 % 的人关注了爆炸吧知识今天&#xff0c;小编抑制不住自己&#xff0c;要给大家强烈推荐一个公众号“少年物理学家”&#xff01;少年物理学家是一个致力为学生家长和老师&#xff0c;提供丰富的物理小知识&#xff1a;物理学家、物理趣谈、科技与物理、万物背后…

Android之滑动事件冲突解决 Touch事件处理机制总结

android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件,有必要对它进行深入的了解。 一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->ACTION_MOVE...->ACTION_MOVE->ACTION_UP 当屏幕…

php 信号量 关闭,php 信号量

一些理论基础&#xff1a;信号量&#xff1a;又称为信号灯、旗语 用来解决进程(线程同步的问题)&#xff0c;类似于一把锁&#xff0c;访问前获取锁(获取不到则等待)&#xff0c;访问后释放锁。临界资源&#xff1a;每次仅允许一个进程访问的资源。临界区&#xff1a;每个进程中…

分享:MetaModel 3.2.5 发布,数据库元模型

MetaModel 3.2.5 发布&#xff0c;数据库元模型 http://www.oschina.net/news/36236/metamodel-3-2-5

CALL FOR DUTY 来和我们一起冒险吧!

我们面临的挑战是什么&#xff1f;昨天发了一篇让大家提问Scott Hanselman的问题&#xff0c;有人调侃 &#xff08;也许是认真的&#xff09;让我问他&#xff1a;“.NET还有救吗&#xff1f;” &#xff0c;我的第一反应不是.NET还有没有救&#xff0c;而是该怎么救问这个问题…

HarmoryOS,API9项目配置

官方配置信息讲解如下&#xff1a;文档中心 1、APP名字图标&#xff1a;在entry模块&#xff0c;module.json5文件中 2、module配置 build-profile.json5文件中 3、包名 app.json5

厉害!他33岁破格晋升教授和博导,成果还打破国外技术垄断

全世界只有3.14 % 的人关注了爆炸吧知识来源 | 长江大学新闻网、长江大学石油工程学院、PaperRSS转自 | 学术资源大全他是人到中年"顺意人生"的代表&#xff0c;29岁晋升副教授、33岁破格晋升教授和博导&#xff1b;他独辟蹊径&#xff0c;将"智能"融入石油…

设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型)

设计模式 ( 十四 ) 迭代器模式Iterator&#xff08;对象行为型&#xff09;1.概述类中的面向对象编程封装应用逻辑。类&#xff0c;就是实例化的对象&#xff0c;每个单独的对象都有一个特定的身份和状态。单独的对象是一种组织代码的有用方法&#xff0c;但通常你会处理一组对…

开源网站

开源网站&#xff1a; Code Google 谷歌旗下的一个开源项目托管网站&#xff0c;资源很丰富&#xff0c;文档也很齐全&#xff0c;甚至还有中文文档。 Souceforge 国外一个比较有名的开源网站&#xff0c;很多有名的开源项目都是在这个网站托管的。 Github 也很不错的一个开源网…

Android之Volley 源码解析

原文来自&#xff1a;http://www.codekk.com 1. 功能介绍 1.1. Volley Volley 是 Google 推出的 Android 异步网络请求框架和图片加载框架。在 Google I/O 2013 大会上发布。 名字由来&#xff1a;a burst or emission of many things or a large amount at once 发布演讲…

双击打开Inventor文件

为什么80%的码农都做不了架构师&#xff1f;>>> 出现的问题&#xff1a; 正常启动电脑后&#xff0c;我双击桌面上的一个idw文件&#xff0c;默认使用 Inventor 2013 打开该格式的文件&#xff1b;但 Inventor 启动不到一半就弹出了如下的错误窗口&#xff0c;点击…