用YARP当网关

Yarp是微软开源的一个用.net实现的反向代理工具包,github库就叫reverse-proxy(反向代理)(吐槽一下微软起名字233333)
nuget包preview9之前都叫Microsoft.ReverseProxy,preview10变成Yarp.ReverseProxy了
放上链接https://github.com/microsoft/reverse-proxy

使用背景

由于公司技术历史原因,原来的网关规则是{paramA}_ {paramB} _ {paramC}_{paramD}这样子的。
想要换个新网关,又要兼容旧的这种规则,调研过目前几种API网关发现,apiSix支持这种操作(用$1占位符匹配参数)。
但是目前暂时不需要功能那么强大的api网关,而且不是.net技术实现的,出问题不好排查。
这是刚好发现Yarp这个东东,刚刚好符合需求,就拿来试试。

怎么用Yarp

Yarp主要要配置的东西就是Cluster(集群)和ProxyRoute(路由)
最简单的用法直接使用appsettings.json配置集群和路由配置
下面内容照搬Yarp 的Getting Started内容
详细的配置项可以直接看文档~~

"ReverseProxy": {"Routes": [{"RouteId": "route1","ClusterId": "cluster1","Match": {"Path": "{**catch-all}"},}],"Clusters": {"cluster1": {"Destinations": {"cluster1/destination1": {"Address": "https://example.com/"}}}}}

需要在startup.cs中配置Yarp

public IConfiguration Configuration { get; }public Startup(IConfiguration configuration)
{Configuration = configuration;
}public void ConfigureServices(IServiceCollection services) 
{ // Add the reverse proxy to capability to the servervar proxyBuilder = services.AddReverseProxy();// Initialize the reverse proxy from the "ReverseProxy" p of configurationproxyBuilder.LoadFromConfig(Configuration.GetSection("ReverseProxy"));
} public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}// Enable endpoint routing, required for the reverse proxyapp.UseRouting();// Register the reverse proxy routesapp.UseEndpoints(endpoints => {endpoints.MapReverseProxy(); }); 
}

改造一下用法,使用持久化储存配置

第一步,翻源码,找到配置的实体对象,照搬微调一遍,大概就是下图那么多个了。

第二步,实现IProxyConfigProvider和IProxyConfig,基本都是照搬原本代码微整形一下233333


由于源码里面ICertificateConfigLoader是internal类型,只能自己重新抄一次并实现了。

第三步,用EFCore持久化到数据库
搞个DBContext,把实体全部加进去,配置好关系之后,CodeFirst直接生成数据库哈哈哈哈

第四步,搞几个Management管理数据(CURD)

第五步,实现一下配置热更新
使用IChangeToken接口实现一个EFCoreReloadToken

在InStoreConfigProvider的GetConfig用ChangeToken.OnChange绑定一下事件

public IProxyConfig GetConfig(){// First time loadif (_config == null){_subscription = ChangeToken.OnChange(_strore.GetReloadToken, UpdateConfig);UpdateConfig();}return _config;}

_strore是EFCoreReverseProxyStore对象,里面包含EFCoreReloadToken对象;

public class EFCoreReverseProxyStore : IReverseProxyStore{private EFCoreReloadToken _reloadToken = new EFCoreReloadToken();private IServiceProvider _sp;private IMemoryCache _cache;private readonly ICertificateConfigLoader _certificateConfigLoader;public EFCoreReverseProxyStore(IServiceProvider sp, IMemoryCache cache, ICertificateConfigLoader certificateConfigLoader){_sp = sp;_cache = cache;_certificateConfigLoader = certificateConfigLoader;}
//more code....
}

在要触发更新配置的时候调用一下IReverseProxyStore.Reload()就可以重新加载配置了~~

第六步,再写个扩展方法替换原本的IProxyConfigProvider

最后一步,在Startup中用一下

services.AddReverseProxy().LoadFromEFCore();

数据管理好了,差个界面(找前端小姐姐要一个)

第一步,搞个控制器,加上简单CURD接口

第二步,找前端小姐姐要个界面对接一下API


好了搞完可以用了,试一试

搞一个测试WebAPi

加一个集群

加一个路由

用Postman测一测

好了正常使用,搞定。

路由匹配可以用多个占位符自由组合,然后在PathPattern转换里面可以使用这些参数

测试一下性能1000个并发100000个请求

最后放下代码~~

欢迎吐槽提意见或者一起改进哈哈哈
ReverseProxy.Store:https://github.com/fanslead/ReverseProxy.Store

相关文章:

  • 浅析微软的网关项目 – ReverseProxy

  • 微软YARP初体验

  • 小试Yarp

  • 微软的反向代理项目 ReverseProxy 更名为 Yarp.ReverseProxy

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

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

相关文章

从生物神经网络到人工神经网络

如今提及人工智能,大家期待的一定是某种可以“学习”的方法,这种方法使用数学模型从数据中获取模式的某种表示。在众多“学习”方法中,获得最多关注,承载最多期望的非“神经网络”莫属。既然我们将这种数学方法称作神经网络&#…

很遗憾,我们正在逐渐丧失专注阅读的能力

这是头哥侃码的第238篇原创最近生活没什么规律,睡得晚,起得早,似乎除了工作之外,其余所有的节奏都有点乱了。前几天去体检,没想到像我这样的 “老司机”,居然会忘记 “要空腹” 的规定,愣是在体…

陶哲轩的10岁与30岁

Terence Tao(陶哲轩),1975年7月17日出生于澳大利亚Adelaide(阿德莱德)。本讲话作于1985年上半年,即陶哲轩尚未满10周岁时所作,一个稚气儿童,给大学生和教授们作报告,少见…

NET问答: 重写了 Equals,还有必要重写 GetHashCode 吗?

咨询区 David Basarab:直入主题,参考如下代码:public class Foo {public int FooId { get; set; }public string FooName { get; set; }public override bool Equals(object obj){Foo fooItem obj as Foo;if (fooItem null) {return false;…

如果编程替换成中文就会怎样? 程序员看了表示头疼

首先大概的看一下中文编码:你以为会写中文就会编程吗?这就像你以为会写汉字就会写出好文章一样。编程是和机器沟通,因此要用机器的语言而不是人类的语言。最早的程序就是0和1的数字,不是中文也不是英文。以前的程序员,…

使用visio 2016 绘制画UML时序图(Sequence Diagram)

什么是时序图?时序图(Sequence Diagram),又名序列图、循序图,是一种UML交互图。它通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作。让我们来看一看Visio2016对时序图的的解释。时序图的元素我们在画时序图时会涉及到7种元素&…

网页颜色搭配

兼职请上猪八戒网站转载于:https://blog.51cto.com/ayyzddq/598474

数字化诗人:这可能是第一位用算法写诗的诺贝尔文学奖得主

一位英国教授发现,一些优秀的诗人早在20世纪60年代就开始使用编码算法来写诗了。著名作家J.M.Coetzee,在早期的英国超级计算机上开发了创作诗歌的软件当我们回顾历史上探索科技应用的人才时,通常不会想到英语教授。但是伦敦国王学院现代文学博…

在asp.net core中使用的验证框架FluentValidation

FluentValidation在asp.net core中怎么使用?先安装包。Install-Package FluentValidation.AspNetCore和上一篇的实体类和验证类一样。实体类:public class Person {public int Id { get; set; }public string Name { get; set; }public string Tel { get…

【EFCORE笔记】异步查询工作原理注释标记

异步查询 当在远程数据库中执行查询时,同步查询可能会阻止当前线程,异步查询可避免阻止线程,这有助于避免冻结户端界面, 异步操作还可以增加 Web 应用程序的吞吐量,可以在数据库操作完成前释放线程去处理其他请求。EF …

CSS日常公用样式与一些解决方案

一、自己总结的公用样式解析html, body, div, p, ul, li, dl, dt, dd, h1, h2, h3, h4, h5, h6, form, input, select, button, textarea, iframe, table, th, td { margin: 0; padding: 0; }img { border: 0 none; vertical-align: top; }ul, li { list-style-type: none; }h1…

上班族吐槽大集合:那些发生在公司的傻X奇遇

“明明不需要加班,到了点却偏偏没人起身走。”—— 小爱“头脑风暴,人越多效率越低下,最后风暴出来的东西也很难落实。”—— 好奇心“只是申请个办公用品,需要人事处签字,行政部签字,总监签字,…

C# 9 record 并非简单属性 POCO 的语法糖

最近升级专案到大统一 .NET 5 并使用 C#9 语法尝试改写套件,发现之前以为 record 只是简单属性 POCO 的简化语法糖的认知是错误。另外因为 POCO 属于需定义口语词,这边在本文定义简单属性 POCO 为 public class 类别 {public string ID{get;set}/*略*/} 只有属性的简…

java实现思维导图_Java并发(思维导图)

1,线程状态转换无限期等待:限期等待:线程生命流程:2,实现方式代码实现样例【三种方式】:packagecom.cnblogs.mufasa.demo2;importjava.util.concurrent.Callable;public class test1_Runnable implementsRu…

这本免费小书,带你征服 GitHub!

GitHub 漫游指南,一本有趣又通俗的 GitHub 教程,想要成为 star 之王么?今天给大家分享一份通俗易懂的 GitHub 学习教程,即《GitHub 漫游指南》。看过了不下十套 GitHub 教程了,小编愿称它为最强!虽然没有 G…

jQuery formValidator表单验证插件4.1.0 下载 演示 文档 可换肤 代码生成器

更新记录: 2011/6/5 jQuery formValidator 4.1.0 ver申明:1、所有DEMO引用jQuery类库的时候,类库后面直接跟了版本号——表示插件支持的最高类库版本号2、插件的命名:插件名版本号,压缩版:插件名版本号min新增以下功能…

java context.write_Channel.write() 和 ChannelHandlerContext.write() 的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。看了下netty 源代码, 终于明白了Channel.write() 和 ChannelHandlerContext.write() 的区别了网上说的都不是很清楚首先注明我的netty版本io.nettynetty-all4.0.36.FinalChannelPipeline处理ChannelH…

美国劳工部揭露中国女人大数据,看完彻底傻眼了……

导读:“中国人的勤奋,令世界惊叹和汗颜,甚至有一点恐惧。”——科斯,诺贝尔经济学奖得主那么中国人的“勤奋”能否用数据来量化一下呢?答案是可以的。另外,如果以性别来区分,究竟是中国男性更勤…

计算机女神,互联网第一夫人!

大家好,我是鱼皮,今天带大家认识一位计算机领域的女神,有关她的故事非常有趣!先聊聊我是如何认识女神的吧。那是我在大四做毕业设计的时候,误打误撞地选了一个图像处理相关的课题,要做一个显微图像处理分析…

NET问答: 如何从 string 中挖出所有的 number ?

咨询区 van:我现在有一个需求,想从 string 中找到所有的 number 并提取出来。举例如下:string test "1 hello" string test1 " 1 world" string test2 "helloworld 99"请问我该如何做?回答区 Tabares:这个简…