前面介绍了 YARP 通过配置文件的方式配置代理转发(传送门),而众所周知,微软的一贯作风就是能通过配置文件做的事情,通过编码的方式也能实现!YARP 也不例外,废话不多说,直接上代码!

  首先,参照官方文档,我们先新建一个 InMemoryConfigProvider 类,并且继承 IProxyConfigProvider 接口,类里面还包含了一个  IProxyConfig 的类,别看漏了噢!

  这里多嘴一下,下面的代码出现了 volatile 关键字,介绍一下它:volatile 是 C# 中用于控制同步的关键字,其意义是针对程序中一些敏感数据,不允许多线程同时访问,保证数据在任何访问时刻,最多有一个线程访问,以保证数据的完整性,volatile 是修饰变量的修饰符。

  1. public class InMemoryConfigProvider : IProxyConfigProvider
  2. {
  3. private volatile InMemoryConfig _config;
  4.  
  5. public InMemoryConfigProvider(IReadOnlyList<RouteConfig> routes, IReadOnlyList<ClusterConfig> clusters)
  6. {
  7. _config = new InMemoryConfig(routes, clusters);
  8. }
  9.  
  10. public IProxyConfig GetConfig() => _config;
  11.  
  12. public void Update(IReadOnlyList<RouteConfig> routes, IReadOnlyList<ClusterConfig> clusters)
  13. {
  14. var oldConfig = _config;
  15. _config = new InMemoryConfig(routes, clusters);
  16. oldConfig.SignalChange();
  17. }
  18.  
  19. private class InMemoryConfig : IProxyConfig
  20. {
  21. private readonly CancellationTokenSource _cts = new();
  22.  
  23. public InMemoryConfig(IReadOnlyList<RouteConfig> routes, IReadOnlyList<ClusterConfig> clusters)
  24. {
  25. Routes = routes;
  26. Clusters = clusters;
  27. ChangeToken = new CancellationChangeToken(_cts.Token);
  28. }
  29.  
  30. public IReadOnlyList<RouteConfig> Routes { get; }
  31.  
  32. public IReadOnlyList<ClusterConfig> Clusters { get; }
  33.  
  34. public IChangeToken ChangeToken { get; }
  35.  
  36. internal void SignalChange()
  37. {
  38. _cts.Cancel();
  39. }
  40. }
  41. }

  然后添加一个扩展 InMemoryConfigProviderExtensions

  1. public static class InMemoryConfigProviderExtensions
  2. {
  3. public static IReverseProxyBuilder LoadFromMemory(this IReverseProxyBuilder builder, IReadOnlyList<RouteConfig> routes, IReadOnlyList<ClusterConfig> clusters)
  4. {
  5. builder.Services.AddSingleton<IProxyConfigProvider>(new InMemoryConfigProvider(routes, clusters));
  6. return builder;
  7. }
  8. }

  接下来就是写配置了,我个人还是喜欢在配置文件中写,但是有动态配置需求的话,又不想登录服务器编辑 appsetting 文件,通过编码的方式确实更为方便,将配置写进库或者其它存储方式里面,那将是随心所欲啊!上代码:

Program.cs

  1. var routes = new[]
  2. {
  3. new RouteConfig()
  4. {
  5. RouteId = "admin",
  6. ClusterId = "admin",
  7. Match = new RouteMatch
  8. {
  9. Hosts = new string[] {"test1.ysmc.net.cn" },
  10. Path = "{**catch-all}"
  11. }
  12. },
  13.  
  14. new RouteConfig()
  15. {
  16. RouteId = "blazor",
  17. ClusterId = "blazor",
  18. Match = new RouteMatch
  19. {
  20. Hosts = new string[] {"test2.ysmc.net.cn" },
  21. Path = "{**catch-all}"
  22. }
  23. }
  24. };
  25.  
  26. var clusters = new[]
  27. {
  28. new ClusterConfig()
  29. {
  30. ClusterId = "admin",
  31. LoadBalancingPolicy = "RoundRobin",
  32. Destinations = new Dictionary<string, DestinationConfig>(StringComparer.OrdinalIgnoreCase)
  33. {
  34. { "admin", new DestinationConfig() { Address = "https://admin.blazor.zone" } }
  35. }
  36. },
  37.  
  38. new ClusterConfig()
  39. {
  40. ClusterId = "blazor",
  41. LoadBalancingPolicy = "RoundRobin",
  42. Destinations = new Dictionary<string, DestinationConfig>(StringComparer.OrdinalIgnoreCase)
  43. {
  44. { "blazor", new DestinationConfig() { Address = "https://www.blazor.zone" } }
  45. }
  46. }
  47. };
  48.  
  49. builder.Services.AddReverseProxy().LoadFromMemory(routes, clusters);

  上面的配置代码,跟配置文件方式的节点和属性,都是对应的,照着写就是了

  1. "ReverseProxy": {
  2. "Routes": {
  3. "admin": {
  4. "ClusterId": "admin",
  5. "Match": {
  6. "Hosts": [ "test1.ysmc.net.cn" ],
  7. "Path": "{**catch-all}"
  8. }
  9. },
  10. "blazor": {
  11. "ClusterId": "blazor",
  12. "Match": {
  13. "Hosts": [ "test2.ysmc.net.cn" ],
  14. "Path": "{**catch-all}"
  15. }
  16. }
  17. },
  18. "Clusters": {
  19. "admin": {
  20. "LoadBalancingPolicy": "RoundRobin",
  21. "Destinations": {
  22. "admin": {
  23. "Address": "https://admin.blazor.zone/"
  24. }
  25. }
  26. },
  27. "blazor": {
  28. "LoadBalancingPolicy": "RoundRobin",
  29. "Destinations": {
  30. "blazor": {
  31. "Address": "https://www.blazor.zone/"
  32. }
  33. }
  34. }
  35. }
  36. }

  最终效果还是依旧的完美,感谢大佬的观看,谢谢!

原文链接:https://www.cnblogs.com/ysmc/p/16724763.html

.NET 反向代理 YARP 通过编码方式配置域名转发的更多相关文章

  1. Nginx 反向代理 负载均衡 虚拟主机配置

    Nginx 反向代理 负载均衡 虚拟主机配置 通过本章你将学会利用Nginx配置多台虚拟主机,清楚代理服务器的作用,区分正向代理和反向代理的区别,搭建使用Nginx反向搭理和负载均衡,了解Nginx常 ...

  2. 二.Nginx反向代理和静态资源服务配置

    2018年03月31日 10:30:12 麦洛_ 阅读数:1362更多 所属专栏: nginx   版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/M ...

  3. 【转】Nginx 反向代理 负载均衡 虚拟主机配置

    原文:http://www.cnblogs.com/itdragon/p/8059000.html Nginx 反向代理 负载均衡 虚拟主机配置 通过本章你将学会利用Nginx配置多台虚拟主机,清楚代 ...

  4. .NET 反向代理-YARP 根据域名转发

    前段时间发布过一个关于 YARP 的简单介绍,感兴趣的小伙伴恭请移步看看 .NET 反向代理-YARP - 一事冇诚 - 博客园 (cnblogs.com) 作为反向代理,必不可少的当然是根据域名代理 ...

  5. nginx 反向代理 与 Apache backend的配置联合配置

    nginx 反向代理 与 Apache backend的配置联合配置: 说明: nginx 将http映射到Apache上的特定子目录. 配置方法步骤: 1.  设置域名, 子域名映射到指定服务器ip ...

  6. Nginx 反向代理工作原理简介与配置详解

    Nginx反向代理工作原理简介与配置详解   by:授客  QQ:1033553122   测试环境 CentOS 6.5-x86_64 nginx-1.10.0 下载地址:http://nginx. ...

  7. .NET 反向代理 YARP 代理 GRPC

    前面的 YARP 文档中,介绍了怎么去代理 http,和如何根据域名转发,而在现在微服务的应用是越来越来多了,服务间的调用依靠 http 越来越不现实了,因为 http 多次握手的耗时越发的影响应用的 ...

  8. .NET 反向代理 YARP 自定义配置提供程序(Configuration Providers)

    介绍 基本 Yarp 示例显示从 appsettings.json 加载的代理配置.相反,代理配置可以从您选择的源以编程方式加载.您可以通过提供几个实现 IProxyConfigProvider 和 ...

  9. Nginx反向代理和负载均衡的配置

    1.反向代理配置 反向代理也称"动静分离",nginx不自己处理图片的相关请求,而是把图片的请求转发给其他服务器来处理. 修改nginx部署目录下conf子目录的nginx.con ...

随机推荐

  1. 10道不得不会的JavaEE面试题

    10道不得不会的 JavaEE 面试题 我是 JavaPub,专注于面试.副业,技术人的成长记录. 以下是 JavaEE 面试题,相信大家都会有种及眼熟又陌生的感觉.看过可能在短暂的面试后又马上忘记了 ...

  2. 基于InsightFace的高精度人脸识别,可直接对标虹软

    一.InsightFace简介 InsightFace 是一个 2D/3D 人脸分析项目.InsightFace 的代码是在 MIT 许可下发布的. 对于 acadmic 和商业用途没有限制. 包含注 ...

  3. 2022-7-12 javascript(2) 第七组 刘昀航

    @ 目录 2022-7-12学习 第七组 刘昀航 前情提要 一.for循环 二.for in循环 三.while 和 do...while循环 1.while do... while 四.内置函数 五 ...

  4. Re:用webpack从零开始的vue-cli搭建'生活'

    有了vue-cli的帮助,我们创建vue的项目非常的方便,使用vue create然后选择些需要的配置项就能自动帮我们创建配置好的webpack项目脚手架了,实在是'居家旅行'必备良药.这次借着学习w ...

  5. NewApiDay03_File类

    File类创建一个新文件 File类的每一个实例可以表示硬盘(文件系统)中的一个文件或目录(实际上表示的是一个抽象路径) 使用File可以做到: 1:访问其表示的文件或目录的属性信息,例如:名字,大小 ...

  6. 【C++】从设计原理来看string类

    1.一些C++基础知识 模板类string的设计属于底层,其中运用到了很多C++的编程技巧,比如模板.迭代器.友元.函数和运算符重载.内联等等,为了便于后续理解string类,这里先对涉及到的概念做个 ...

  7. Java开发学习(十三)----基于注解开发定义第三方bean及注解开发总结

    在前面的博客中定义bean的时候都是在自己开发的类上面写个注解就完成了,但如果是第三方的类,这些类都是在jar包中,我们没有办法在类上面添加注解,这个时候该怎么办? 遇到上述问题,我们就需要有一种更加 ...

  8. day04_数组

    数组 学习目标: 1. jvm内存图入门 2. 一维数组的使用 3. 二维数组的使用 4. 数组的内存结构 5. 数组中常见算法 6. 数组中常见的异常 一.JVM内存图入门 java程序运行在jvm ...

  9. lombok的常用注解

    出处: https://blog.csdn.net/sunnyzyq/article/details/119992746 1. @Accessors 源码 我们打开 @Accessors 的源码可以看 ...

  10. Codeforces Round #792 (Div. 1 + Div. 2) // C ~ E

    比赛链接:Dashboard - Codeforces Round #792 (Div. 1 + Div. 2) - Codeforces C. Column Swapping 题意: 给定一个n*m ...