#pragma warning disable CS0162 // 检测到无法访问的代码
using Apq.Cfg;
using Apq.Cfg.Apollo;
namespace Apq.Cfg.Samples.Demos;
///
/// 示例 14: Apollo 配置中心
/// 演示如何使用 Apollo 作为配置源
/// 注意:需要运行 Apollo 服务才能执行完整示例
/// 快速启动:参考 https://www.apolloconfig.com/#/zh/deployment/quick-start
///
public static class ApolloDemo
{
// 是否启用实际连接测试(设为 true 需要 Apollo 服务运行)
private const bool EnableLiveTest = false;
public static async Task RunAsync(string baseDir)
{
Console.WriteLine("═══════════════════════════════════════════════════════════════");
Console.WriteLine("示例 14: Apollo 配置中心");
Console.WriteLine("═══════════════════════════════════════════════════════════════\n");
Console.WriteLine("【说明】Apollo 是携程开源的分布式配置中心。");
Console.WriteLine("【文档】https://www.apolloconfig.com/\n");
// 示例 14.1: 基本配置
Demo_BasicConfiguration();
// 示例 14.2: 多命名空间
Demo_MultiNamespaceConfiguration();
// 示例 14.3: 集群配置
Demo_ClusterConfiguration();
// 示例 14.4: 访问密钥认证
Demo_SecretConfiguration();
// 示例 14.5: 不同数据格式
Demo_DataFormatConfiguration();
// 示例 14.6: 监听配置变更
Demo_WatchConfiguration();
// 示例 14.7: 实际连接测试
if (EnableLiveTest)
{
await Demo_LiveTestAsync();
}
else
{
Console.WriteLine("--- 示例 14.7: 实际连接测试 ---");
Console.WriteLine(" [跳过] 设置 EnableLiveTest = true 并启动 Apollo 服务后可运行\n");
}
Console.WriteLine("[示例 14 完成]\n");
}
///
/// 示例 14.1: 基本配置
///
private static void Demo_BasicConfiguration()
{
Console.WriteLine("--- 示例 14.1: 基本配置 ---");
// 方式1: 使用 Action 配置
var builder1 = new CfgBuilder()
.AddApollo(options =>
{
options.AppId = "myapp"; // 应用 ID
options.MetaServer = "http://localhost:8080"; // Meta Server 地址
options.Namespaces = new[] { "application" }; // 命名空间
}, level: 0);
Console.WriteLine(" 方式1: AddApollo(options => { ... })");
Console.WriteLine(" options.AppId = \"myapp\"");
Console.WriteLine(" options.MetaServer = \"http://localhost:8080\"");
Console.WriteLine(" options.Namespaces = new[] { \"application\" }");
// 方式2: 使用简化方法
var builder2 = new CfgBuilder()
.AddApollo("myapp", metaServer: "http://localhost:8080", level: 0);
Console.WriteLine(" 方式2: AddApollo(\"myapp\", metaServer: \"http://localhost:8080\")");
Console.WriteLine();
}
///
/// 示例 14.2: 多命名空间配置
///
private static void Demo_MultiNamespaceConfiguration()
{
Console.WriteLine("--- 示例 14.2: 多命名空间 ---");
// Apollo 支持多命名空间,可以将配置分类管理
var builder = new CfgBuilder()
.AddApollo(options =>
{
options.AppId = "myapp";
options.MetaServer = "http://localhost:8080";
options.Namespaces = new[]
{
"application", // 默认命名空间
"database", // 数据库配置
"redis", // Redis 配置
"common.json" // 公共配置(JSON 格式)
};
}, level: 0);
Console.WriteLine(" options.Namespaces = new[]");
Console.WriteLine(" {");
Console.WriteLine(" \"application\", // 默认命名空间");
Console.WriteLine(" \"database\", // 数据库配置");
Console.WriteLine(" \"redis\", // Redis 配置");
Console.WriteLine(" \"common.json\" // 公共配置(JSON 格式)");
Console.WriteLine(" }");
Console.WriteLine();
}
///
/// 示例 14.3: 集群配置
///
private static void Demo_ClusterConfiguration()
{
Console.WriteLine("--- 示例 14.3: 集群配置 ---");
// Apollo 支持集群,可以为不同环境配置不同的集群
var builder = new CfgBuilder()
.AddApollo(options =>
{
options.AppId = "myapp";
options.MetaServer = "http://apollo.prod.example.com:8080";
options.Cluster = "SHAJQ"; // 上海机房集群
options.Namespaces = new[] { "application" };
}, level: 0);
Console.WriteLine(" options.Cluster = \"SHAJQ\" // 上海机房集群");
Console.WriteLine(" // 常见集群命名: default, SHAJQ, SHAOY, NTGXH 等");
Console.WriteLine();
}
///
/// 示例 14.4: 访问密钥认证
///
private static void Demo_SecretConfiguration()
{
Console.WriteLine("--- 示例 14.4: 访问密钥认证 ---");
var builder = new CfgBuilder()
.AddApollo(options =>
{
options.AppId = "myapp";
options.MetaServer = "http://localhost:8080";
options.Namespaces = new[] { "application" };
options.Secret = "your-app-secret"; // 访问密钥
options.ConnectTimeout = TimeSpan.FromSeconds(10);
}, level: 0);
Console.WriteLine(" options.Secret = \"your-app-secret\"");
Console.WriteLine(" options.ConnectTimeout = TimeSpan.FromSeconds(10)");
Console.WriteLine();
}
///
/// 示例 14.5: 不同数据格式
///
private static void Demo_DataFormatConfiguration()
{
Console.WriteLine("--- 示例 14.5: 不同数据格式 ---");
// Properties 格式(默认)
var builder1 = new CfgBuilder()
.AddApollo(options =>
{
options.AppId = "myapp";
options.MetaServer = "http://localhost:8080";
options.Namespaces = new[] { "application" };
options.DataFormat = ApolloDataFormat.Properties;
}, level: 0);
Console.WriteLine(" Properties: options.DataFormat = ApolloDataFormat.Properties");
// JSON 格式
var builder2 = new CfgBuilder()
.AddApollo(options =>
{
options.AppId = "myapp";
options.MetaServer = "http://localhost:8080";
options.Namespaces = new[] { "application.json" };
options.DataFormat = ApolloDataFormat.Json;
}, level: 0);
Console.WriteLine(" JSON: options.DataFormat = ApolloDataFormat.Json");
// YAML 格式
var builder3 = new CfgBuilder()
.AddApollo(options =>
{
options.AppId = "myapp";
options.MetaServer = "http://localhost:8080";
options.Namespaces = new[] { "application.yaml" };
options.DataFormat = ApolloDataFormat.Yaml;
}, level: 0);
Console.WriteLine(" YAML: options.DataFormat = ApolloDataFormat.Yaml");
Console.WriteLine();
}
///
/// 示例 14.6: 监听配置变更
///
private static void Demo_WatchConfiguration()
{
Console.WriteLine("--- 示例 14.6: 监听配置变更 ---");
var builder = new CfgBuilder()
.AddApollo(options =>
{
options.AppId = "myapp";
options.MetaServer = "http://localhost:8080";
options.Namespaces = new[] { "application" };
options.EnableHotReload = true; // 启用热重载(默认 true)
options.LongPollingTimeout = TimeSpan.FromSeconds(90); // 长轮询超时
}, level: 0);
Console.WriteLine(" options.EnableHotReload = true");
Console.WriteLine(" options.LongPollingTimeout = TimeSpan.FromSeconds(90)");
Console.WriteLine();
Console.WriteLine(" // 订阅配置变更");
Console.WriteLine(" cfg.ConfigChanges.Subscribe(change =>");
Console.WriteLine(" {");
Console.WriteLine(" Console.WriteLine($\"配置变更: {change.Key} = {change.NewValue}\");");
Console.WriteLine(" });");
Console.WriteLine();
}
///
/// 示例 14.7: 实际连接测试
///
private static async Task Demo_LiveTestAsync()
{
Console.WriteLine("--- 示例 14.7: 实际连接测试 ---");
try
{
// 创建配置
var cfg = new CfgBuilder()
.AddApollo(options =>
{
options.AppId = "apq-cfg-demo";
options.MetaServer = "http://localhost:8080";
options.Namespaces = new[] { "application" };
options.ConnectTimeout = TimeSpan.FromSeconds(3);
}, level: 0)
.Build();
Console.WriteLine(" ✓ 连接 Apollo 成功");
// 读取配置
Console.WriteLine($" App:Name = {cfg.Get("App:Name") ?? "(未配置)"}");
Console.WriteLine($" App:Version = {cfg.Get("App:Version") ?? "(未配置)"}");
// 枚举所有键
var keys = cfg.GetChildKeys();
Console.WriteLine($" 配置键数量: {keys.Count()}");
cfg.Dispose();
}
catch (Exception ex)
{
Console.WriteLine($" ✗ 连接失败: {ex.Message}");
Console.WriteLine(" 提示: 请确保 Apollo 服务正在运行");
}
Console.WriteLine();
await Task.CompletedTask;
}
}