.net core配置文件热加载

原生方式

config.AddJsonFile("ocelot.json", optional: false, reloadOnChange: true);

reloadOnChange为true,则代表配置文件更新时重新加载配置文件

代码实践

1)、首先创建一个空白的解决方案

pod配置热加载configmap_.netcore


2)、添加一个网关项目

pod配置热加载configmap_pod配置热加载configmap_02


这里我选择本人熟悉的.net core 3.1版本

pod配置热加载configmap_.netcore_03

3)、引入ocelot包,这里本人选择的事适合.net core 3.1版本的ocelot 15.0

pod配置热加载configmap_.netcore_04

安装好之后,在Program中添加加载ocelot配置文件代码

pod配置热加载configmap_分布式_05

.ConfigureAppConfiguration((hostingContext, config) =>
{
    config.AddJsonFile("ocelot.json", false, true);
})

4)、在项目根目录下创建ocelot.json文件

pod配置热加载configmap_分布式_06

配置文件内容可稍后添加,我们先注入ocelot服务

pod配置热加载configmap_后端_07

pod配置热加载configmap_.netcore_08

这样网关服务就搭建好了,我们接下来创建一个下游服务项目

5)、创建下游服务

pod配置热加载configmap_pod配置热加载configmap_09

6)、直接启动该服务项目

pod配置热加载configmap_.netcore_10

7)、现在可以在ocelot.json配置中加配置项了

pod配置热加载configmap_pod配置热加载configmap_11

{
  "ReRoutes": [
    {
      "DownstreamPathTemplate": "/weatherforecast",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost",
          "Port": 43275
        }
      ],
      "UpstreamPathTemplate": "/aa",
      "UpstreamHttpMethod": [ "Get" ]
    }
  ],
  "GlobalConfiguration": {
    
  }
}

8)、接下来启动网关,启动网关后再地址栏上输入/aa即可访问下游服务

pod配置热加载configmap_.netcore_12

接下来我们修改配置文件,不重启网关项目看看是否会生效

pod配置热加载configmap_分布式_13

我们将上游地址改成/bb,则/aa请求不到下游服务了

pod配置热加载configmap_.net_14

pod配置热加载configmap_.netcore_15

nacos配置中心

原生方式有一个致命的缺陷就是如果网站部署为多网关服务实例,那么修改配置文件时就需要手动的更改多台服务器,所以引入nacos配置中心,将ocelot配置文件写入配置中心,多个网关服务实例监听ocelot配置文件的更改,就能够修改任意一台服务后自动更新其他服务配置文件

代码实践

1)、nacos环境搭建
本人使用的事nacos2.1版本,具体搭建请参考官网:https://nacos.io/zh-cn/ 2)、在网关服务中引入一下依赖包

dotnet add package nacos-sdk-csharp
dotnet add package nacos-sdk-csharp.AspNetCore
dotnet add package nacos-sdk-csharp.Extensions.Configuration

我们使用最新版1.3.3版

pod配置热加载configmap_后端_16

3)、配置
1、在Program中添加一下配置

pod配置热加载configmap_分布式_17

var c = config.Build();
// 从配置文件读取Nacos相关配置
// 默认会使用JSON解析器来解析存在Nacos Server的配置
config.AddNacosV2Configuration(c.GetSection("NacosConfig"));

2、在appsettings.json添加如下配置项

pod配置热加载configmap_.net_18

"NacosConfig": {
    "Listeners": [
      {
        "Optional": false,
        "DataId": "ocelot.json",
        "Group": "DEFAULT_GROUP"
      }
    ],
    "Namespace": "",
    "ServerAddresses": [ "http://192.168.17.1:8848/" ]
  }

Listeners配置节中必须包含一个监听的配置项,在nacos-csharp-sdk1.3.3版本中如果不添加该配置项则运行时会抛出异常,如下所示:

pod配置热加载configmap_pod配置热加载configmap_19

pod配置热加载configmap_.netcore_20

3)、以上信息配置好之后我们就可以启动网关了

pod配置热加载configmap_pod配置热加载configmap_21

由于我们只添加了监听配置项,没有在nacos中添加配置文件,所以无论是访问/aa还是/bb都不能访问下游服务
4)、在nacos中添加配置文件

pod配置热加载configmap_pod配置热加载configmap_22

pod配置热加载configmap_分布式_23


最后点击发布再次刷新页面即可

pod配置热加载configmap_.netcore_24

pod配置热加载configmap_分布式_25


这样我们的ocelot多服务实例的配置就支持热加载了

注意:nacos-csharp-sdk 1.2与1.3.3版本有点不同,1.2中可以不添加Listener配置项,运行起来不会出错

如果觉得在nacos配置中心中更改配置文件不方便,nacos-csharp-sdk也提供nacos配置文件读写的接口

pod配置热加载configmap_后端_26


注入以上接口和实现类就行了

pod配置热加载configmap_.netcore_27

在此就不过多演示了,更多内容请参考以下两个官方文档