码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • .NET 反向代理 YARP 通过编码方式配置域名转发


    合集 - .NET(21)
    1..NET Core 环境搭建2022-03-162..Net Core IOC DI(依赖注入)2022-03-163..NET Core 读取配置技巧 - IOptions 接口2022-05-254..Net Core 依赖注入(IOC) 一些简单的使用技巧2022-05-065..Net Core 可为Null的类型2022-04-026..Net Core 配置文件 appsettings.json2022-03-257..NET 反向代理-YARP 部署Https(SSL)2022-09-218..NET 反向代理-YARP 根据域名转发2022-09-219..NET 7 来了!!!2022-09-1910..NET 反向代理-YARP2022-09-0711..Net Core 配置文件读取 - IOptions、IOptionsMonitor、IOptionsSnapshot2022-09-0212..NET Core 实现后台任务(定时任务)Longbow.Tasks 组件(三)2022-07-2313..NET Core 实现后台任务(定时任务)BackgroundService(二)2022-07-1314..NET Core 实现后台任务(定时任务)IHostedService(一)2022-07-0815..Net WebApi 中的 FromBody FromForm FromQuery FromHeader FromRoute2022-10-0716..NET 反向代理 YARP 代理 GRPC2022-09-2817..Net 7 C#11 原始字符串2022-09-2618..NET 反向代理 YARP 跨域请求 CORS2022-09-2619..NET 反向代理 YARP 自定义配置提供程序(Configuration Providers)2022-09-25
    20..NET 反向代理 YARP 通过编码方式配置域名转发2022-09-24
    21..NET 部署 多域名 Https(SSL)通过代码方式2022-09-23
    收起

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

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

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

    复制代码
    public class InMemoryConfigProvider : IProxyConfigProvider
    {
        private volatile InMemoryConfig _config;
    
        public InMemoryConfigProvider(IReadOnlyList routes, IReadOnlyList clusters)
        {
            _config = new InMemoryConfig(routes, clusters);
        }
    
        public IProxyConfig GetConfig() => _config;
    
        public void Update(IReadOnlyList routes, IReadOnlyList clusters)
        {
            var oldConfig = _config;
            _config = new InMemoryConfig(routes, clusters);
            oldConfig.SignalChange();
        }
    
        private class InMemoryConfig : IProxyConfig
        {
            private readonly CancellationTokenSource _cts = new();
    
            public InMemoryConfig(IReadOnlyList routes, IReadOnlyList clusters)
            {
                Routes = routes;
                Clusters = clusters;
                ChangeToken = new CancellationChangeToken(_cts.Token);
            }
    
            public IReadOnlyList Routes { get; }
    
            public IReadOnlyList Clusters { get; }
    
            public IChangeToken ChangeToken { get; }
    
            internal void SignalChange()
            {
                _cts.Cancel();
            }
        }
    }
    复制代码

     

      然后添加一个扩展 InMemoryConfigProviderExtensions

    复制代码
    public static class InMemoryConfigProviderExtensions
    {
        public static IReverseProxyBuilder LoadFromMemory(this IReverseProxyBuilder builder, IReadOnlyList routes, IReadOnlyList clusters)
        {
            builder.Services.AddSingleton(new InMemoryConfigProvider(routes, clusters));
            return builder;
        }
    }
    复制代码

     

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

    Program.cs

    复制代码
    var routes = new[]
    {
        new RouteConfig()
        {
            RouteId = "admin",
            ClusterId = "admin",
            Match = new RouteMatch
            {
                Hosts = new string[] {"test1.ysmc.net.cn" },
                Path = "{**catch-all}"
            }
        },
    
        new RouteConfig()
        {
            RouteId = "blazor",
            ClusterId = "blazor",
            Match = new RouteMatch
            {
                Hosts = new string[] {"test2.ysmc.net.cn" },
                Path = "{**catch-all}"
            }
        }
    };
    
    var clusters = new[]
    {
        new ClusterConfig()
        {
            ClusterId = "admin",
            LoadBalancingPolicy = "RoundRobin",
            Destinations = new Dictionary<string, DestinationConfig>(StringComparer.OrdinalIgnoreCase)
            {
                { "admin", new DestinationConfig() { Address = "https://admin.blazor.zone" } }
            }
        },
    
        new ClusterConfig()
        {
            ClusterId = "blazor",
            LoadBalancingPolicy = "RoundRobin",
            Destinations = new Dictionary<string, DestinationConfig>(StringComparer.OrdinalIgnoreCase)
            {
                { "blazor", new DestinationConfig() { Address = "https://www.blazor.zone" } }
            }
        }
    };
    
    builder.Services.AddReverseProxy().LoadFromMemory(routes, clusters);
    复制代码

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

    复制代码
    "ReverseProxy": {
      "Routes": {
        "admin": {
          "ClusterId": "admin",
          "Match": {
            "Hosts": [ "test1.ysmc.net.cn" ],
            "Path": "{**catch-all}"
          }
        },
        "blazor": {
          "ClusterId": "blazor",
          "Match": {
            "Hosts": [ "test2.ysmc.net.cn" ],
            "Path": "{**catch-all}"
          }
        }
      },
      "Clusters": {
        "admin": {
          "LoadBalancingPolicy": "RoundRobin",
          "Destinations": {
            "admin": {
              "Address": "https://admin.blazor.zone/"
            }
          }
        },
        "blazor": {
          "LoadBalancingPolicy": "RoundRobin",
          "Destinations": {
            "blazor": {
              "Address": "https://www.blazor.zone/"
            }
          }
        }
      }
    }
    复制代码

     

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

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

  • 相关阅读:
    C++:缺省函数
    1024程序员节献礼,火山引擎ByteHouse带来三重产品福利
    PHP家教系统平台源码/请家教兼职家教网源码/自适应手机端/实测
    【JUC】1.CompletableFuture异步编程
    日常工作笔记0807
    KQL和Lucene的区别
    数据结构之图(关键路径)
    面向混合型数据集自适应聚类的差分隐私保护算法
    AutoDL算力租用,Mobaxterm+Pycharm+VScode通过SSH连接远程服务器AutoDL
    Xcode Build Setting之Compiler flags
  • 原文地址:https://www.cnblogs.com/ysmc/p/16724763.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号