.net core 配置中心(Apollo) 电脑版发表于:2020/6/23 17:41 ![.netcore](https://img.tnblog.net/arcimg/hb/c857299a86d84ee7b26d181a31e58234.jpg ".netcore") >#.net core 配置中心(Apollo) [TOC] Apollo简介 ------------ <br/> >Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。 服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。 Java客户端不依赖任何框架,能够运行于所有Java运行时环境,同时对Spring/Spring Boot环境也有较好的支持。 .Net客户端不依赖任何框架,能够运行于所有.Net运行时环境。 更多产品介绍参见Apollo配置中心介绍 本地快速部署请参见<a href="https://github.com/ctripcorp/apollo/wiki/Quick-Start">Quick Start</a> 演示环境(Demo): 106.54.227.205 账号/密码: apollo/admin 如访问github速度缓慢,可以访问gitee镜像,不定期同步 通过 Docker 来进行安装 Apollo ------------ <br/> >###注意 - 请确保 Docker 已经安装好 - 请确保 Docker-Compose 已经安装好 - 尽量使用国内的加速器 - 如果是阿里云服务器请在安全组规则中添加 8080与8070的端口 ![](https://img.tnblog.net/arcimg/hb/84c6139f63c84067a12d95e9dcc93900.png) >###相关地址 Apollo安装地址:<a href="https://github.com/AiDaShi/GeekTimeLearning/tree/master/TestApolloProject/NET-Core-deploy-infrastructure-apollo">GitHub</a> 项目地址:<a href="https://github.com/AiDaShi/GeekTimeLearning/tree/master/TestApolloProject">GitHub</a> >###安装 <br/> >下载好Apollo后,打开终端到当前目录下执行命令 `docker-compose up` 其他命令 ```bash # 也可以后台运行 [root@xxxx]# docker-compose up -d # 更新到最新镜像 [root@xxxx]# docker-compose pull # 停止镜像并删除 [root@xxxx]# docker-compose down ``` >###安装与启动 ![安装与启动](https://img.tnblog.net/arcimg/hb/71a4d1e4e8964951beb95a351245f1fc.png "安装与启动") >访问你部署服务器的地址,登录到 dashboard: http://Your_Server_IP:8070 用户名: apollo 密码: admin <br/> configServer: http://Your_Server_IP:8080 ![登录](https://img.tnblog.net/arcimg/hb/5d2b0bf9cf7b4553b69bbd841073630e.png) ![登录](https://img.tnblog.net/arcimg/hb/cc9a7dd858784a56853c9df3307c9989.png) 创建项目 ------------ >###创建TestApolloProject项目 ![创建TestApolloProject项目](https://img.tnblog.net/arcimg/hb/d81083d74fda419aadda1dfbce62a284.png) ![创建TestApolloProject项目](https://img.tnblog.net/arcimg/hb/49c02eaf14e24f00a82d17d866db5be1.png) >###创建环境变量 ![1](https://img.tnblog.net/arcimg/hb/fec10e2c2a7449c98255e910f1ae08d2.png) ![2](https://img.tnblog.net/arcimg/hb/faae5426628d414fbe4e18be36b3c380.png) ![3](https://img.tnblog.net/arcimg/hb/09602111e14c4c43ab3f0f5ec8cd006e.png) >###其他 <br/> >查看历史记录 ![查看历史记录](https://img.tnblog.net/arcimg/hb/17504a64ddfe46c693a7d097b094a8da.png) >更多功能 ![更多功能](https://img.tnblog.net/arcimg/hb/f2ddb6c4f36048019e37318d49a4f5cc.png) 创建.net core示例项目 ------------ >###安装依赖包 ![](https://img.tnblog.net/arcimg/hb/7abe83d29a224626a47c1779fe9f341e.png) >###项目结构 ![](https://img.tnblog.net/arcimg/hb/e124c452605445afa1988cc7e51b5285.png) >###修改内容 <br/> ><font style="color:#2ecc71;font-weight:bold;">Program.cs</font> ```csharp public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration((hostBuilderContext,configurationBuilder)=>{ //注入配置 //把阿波罗的日志级别调整为最低 LogManager.UseConsoleLogging(Com.Ctrip.Framework.Apollo.Logging.LogLevel.Trace); //从已加载的配置文件中读取,阿波罗的基础配置,并注入 configurationBuilder.AddApollo(configurationBuilder.Build().GetSection("Apollo")) //注入默认配置 .AddDefault(Com.Ctrip.Framework.Apollo.Enums.ConfigFileFormat.Properties); }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }); } ``` ><font style="color:#2ecc71;font-weight:bold;">TestController.cs</font> ```csharp [Route("api/[controller]")] [ApiController] public class TestController : ControllerBase { private readonly IConfiguration _configuration; public TestController(IConfiguration configuration) { _configuration = configuration; } [HttpGet] public string GetENV_ABV2() { return _configuration["ENV_ABV2"]; } } ``` ><font style="color:#f1c40f;font-weight:bold;">appsettings.json</font> ```json { "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "Apollo": { "AppId": "TestApolloProject", "Env": "DEV", "MetaServer": "http://Your_Server_IP:8080/", "ConfigServer": [ "http://Your_Server_IP:8080/" ] }, "AllowedHosts": "*" } ``` 配置热更新展示 ------------ >当前配置 ![](https://img.tnblog.net/arcimg/hb/216d5a820667444984597f0db8c64642.png) >获取当前配置成功 ![](https://img.tnblog.net/arcimg/hb/2b864beea95d4af5b1f724a425208676.png) >修改当前配置并发布 ![](https://img.tnblog.net/arcimg/hb/3ee6e9ae69654667b4a3572cdcf1e115.png) >再次访问接口,达成热更新 ![](https://img.tnblog.net/arcimg/hb/3dc15d1abcca4cb59b60aac1a244726a.jpg) ![](https://img.tnblog.net/arcimg/hb/1f9b0ef2900d431ea8fd2e816d4b5fba.png) 补充 ------------ >### 添加部门 ![](https://img.tnblog.net/arcimg/hb/0b7ffb2c381d48d19ef34f5400796419.png) tn2>输入`organizations`然后点击查询,在末尾添加上一行然后点击保存就可以了 ![](https://img.tnblog.net/arcimg/hb/d1e9e12cccb940719f9036f814d78fdb.png) >### 添加json数据 tn2>普通的文本命名空间是不支持json数据的,所以我们需要添加新的命名空间,并且是json格式的。 找到项目的左下角,点击添加Namespace ![](https://img.tnblog.net/arcimg/hb/9b8867e927874520826839f6f3e1e234.png) tn2>然后根据下图所示添加json类型的命名空间,我们还可以看到它还可以支持`xml`、`yml`、`yaml`、`json`、`txt`. 最后点击保存。 ![](https://img.tnblog.net/arcimg/hb/1cac30e9eeba44c48d1eedc756ab242d.png) tn2>最后我这里简单的写了个配置。 ![](https://img.tnblog.net/arcimg/hb/f041763688c04f5aaa4e2fc090e1bca3.png) tn2>然后在我们的代码中需要做如下修改:添加好我们的命名空间,并规定好其中的格式。 ```csharp configurationBuilder.AddApollo(configurationBuilder.Build().GetSection("Apollo")) .AddNamespace("SWPrinterNS", ConfigFileFormat.Json); ``` tn2>在我们测试时使用热更新的方式 ```csharp public class IdentityModelConfig { public string Authority { get; set; } public string Audience { get; set; } public bool IsHttps { get; set; } public bool ValidateIssuer { get; set; } public bool ValidateAudience { get; set; } } ``` ```csharp services.Configure<IdentityModelConfig>(configuration.GetSection("Identity_Config")); ``` ```csharp [ApiVersion("1.0")] [Route("api/[controller]")] [ApiController] public class TestAPIController : ControllerBase { public readonly IOptionsMonitor<IdentityModelConfig> _IomIMC; public TestAPIController( IOptionsMonitor<IdentityModelConfig> IomIMC ) { _IomIMC = IomIMC; } [HttpGet("ID4")] public string TestID4env() { return JsonConvert.SerializeObject(_IomIMC); } } ``` ![](https://img.tnblog.net/arcimg/hb/c0590c0f4d4e4f07a22e9eec0abcda1f.png) Apollo迁移 ------------ tn2>首先通过如下命令在旧的宿主机上进入容器,生成数据文件,并将数据文件放到旧的宿主机上。 ```bash # 进入容器 docker exec -it apollo-db /bin/bash # 生成apollo相关数据文件 mysqldump -t -uroot --databases ApolloPortalDB --tables App AppNamespace Authorities Consumer ConsumerRole ConsumerToken Favorite Permission Role RolePermission UserRole Users --complete-insert > portal_dump.sql mysqldump -t -uroot --databases ApolloConfigDB --tables App AppNamespace AccessKey Cluster Commit Item Namespace Release ReleaseHistory --complete-insert > config_Pro_dump.sql exit # 复制数据文件到宿主机 docker cp apollo-db:/config_Pro_dump.sql . docker cp apollo-db:/portal_dump.sql . ``` tn2>将这两个数据文件复制到新的宿主机上后,创建清理数据的`cleardatafile.sql`文件,命令如下: ```bash # 编辑清理数据文件 cat << EOF > cleardatafile.sql Use ApolloPortalDB; truncate table App; truncate table AppNamespace; truncate table Authorities; truncate table Consumer; truncate table ConsumerRole; truncate table ConsumerToken; truncate table Favorite; truncate table Permission; truncate table Role; truncate table RolePermission; truncate table UserRole; truncate table Users; Use ApolloConfigDB; truncate table App; truncate table AppNamespace; truncate table AccessKey; truncate table Cluster; truncate table Commit; truncate table Item; truncate table Namespace; truncate table ReleaseHistory; EOF ``` tn2>然后在新的宿主机上,将三个文件复制到容器名为apollo-db的mysql数据库中,然后关闭apollo应用的运行,执行数据脚本,随后再启动apollo应用。 ```bash docker cp cleardatafile.sql apollo-db:/ docker cp config_Pro_dump.sql apollo-db:/ docker cp portal_dump.sql apollo-db:/ docker stop apollo-quick-start docker exec -it apollo-db /bin/bash mysql -uroot -A source /cleardatafile.sql use ApolloPortalDB; source /portal_dump.sql use ApolloConfigDB; source /config_Pro_dump.sql docker start apollo-quick-start ``` tn2>在完成迁移的最后需要到Apollo 仪表板中发布相关的Config。 更多连接请参考 ------------ tn2>Apollo 项目地址:https://github.com/ctripcorp/apollo Apollo.net 项目地址:https://github.com/ctripcorp/apollo.net/tree/dotnet-core/ .Net客户端使用指南:https://github.com/ctripcorp/apollo/wiki/.Net%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97