Garnet 配置
代码概述
每个可配置的 Garnet 设置在 Options 类 (GarnetServer\Configuration\Options.cs
) 中都有一个匹配的属性。
当 GarnetServer.exe 初始化时,它通过调用 ServerSettingsManager.TryParseCommandLineArguments(),使用命令行变量、默认文件和配置(如果提供)来创建一个新的 Options 对象。
然后它调用实例方法 GetServerOptions(),该方法返回一个 GarnetServerOptions 实例,该实例可用于创建 GarnetServer 的新实例。
选项解析
通过调用 ServerSettingsManager.TryParseCommandLineArguments() 并传入一组输入的命令行参数来初始化 Options 对象。
对象的初始化包括:
- 将 默认配置文件 解析到 Options 对象中(默认为
defaults.conf
,除非命令行参数另有指定) - 解析 配置文件(如果由命令行参数指定)并填充已初始化的对象,覆盖默认设置。
- 解析 命令行变量 并再次填充对象,覆盖默认设置或配置文件提供的设置。
配置文件解析
配置文件解析通过调用 ServerSettingsManager.TryImportServerOptions() 完成。此方法支持从多个源读取文件(目前支持:本地文件 和 Azure 存储 上的远程文件),以及读取多种文件格式(由 ConfigFileType 枚举指定)。这是通过调用以下工厂方法完成的:
- StreamProviderFactory.GetStreamProvider() - 返回一个 StreamProviderBase 用于从相应的文件源读取
- ConfigProviderFactory.GetConfigProvider() - 返回一个 IConfigProvider 用于读取相应的文件格式
注意: 当在命令行提供程序中指定配置导出文件路径时,ServerSettingsManager.TryExportServerOptions() 将类似地使用 StreamProviderFactory 和 ConfigProviderFactory 将指定格式的配置文件写入指定的文件源。
支持的文件格式
目前我们支持 2 种不同的配置文件格式(所有支持的文件格式都由 ConfigFileType 枚举描述)
GarnetConf
GarnetConf 配置文件格式是 Garnet 配置文件的默认格式。
此格式由一个 JSON 序列化 的 Options 对象组成。
GarnetConfigProvider 是 IConfigProvider 的实现,它允许从 Options 对象(或导入到 Options 对象)序列化和反序列化选项(分别从 StreamProviderBase 实例导入或导出),使用 Newtonsoft.Json 序列化器进行 JSON 反序列化,使用 System.Text 序列化器进行 JSON 序列化。
RedisConf
RedisConf 配置文件格式是用于配置 Redis 服务器的文件格式(在此处阅读更多 here)。
此格式中每个 Garnet 支持的设置在 RedisOptions 类 (GarnetServer\Configuration\RedisOptions.cs
) 中都有一个匹配的属性。
每个属性都用 RedisOptionAttribute 装饰,该属性用于指定键(Redis 关键字)、与此属性匹配的 Garnet 属性名称,以及可选的 - 在将 Redis 属性转换为 Garnet 属性时使用的转换器类型。
RedisConfigProvider 是 IConfigProvider 的实现,它允许将选项反序列化为 Options 对象(从 StreamProviderBase 实例)。它使用自定义序列化器 RedisConfigSerializer (GarnetServer\Configuration\RedisConfigSerializer.cs
) 来反序列化并填充 Options 对象。反序列化可以使用自定义转换器将字符串值转换为 Redis 类型(所有 Redis 类型和自定义转换器可在 GarnetServer\Configuration\RedisTypes.cs
和 GarnetServer\Configuration\TypeConverters.cs
中找到)。
通过 RedisOptionAttribute 中匹配的 Options 属性来填充 Options 对象,然后要么将 RedisOptions 属性转换为目标 Options 属性(如果在属性中指定了自定义转换器),要么使用 TypeConverter 转换属性(如果存在)。如果转换器或类型转换器都不存在,则尝试进行简单转换。如果所有尝试都失败,则序列化将失败。
命令行参数解析
命令行参数的解析由名为 CommandLineParser 的第三方库完成。每个 Options 属性都用 OptionAttribute 装饰,该属性指定其长名称和/或短名称(例如,分别为“memory”/“m”),以及在运行 GarnetServer.exe -h
或 GarnetServer.exe --help
时显示的帮助文本。
OptionsAttribute 也支持指定默认值,该默认值 不使用,以免与默认配置文件中指定的默认值混淆。
命令行参数解析实际上执行两次,我们首先解析命令行参数以检索默认配置文件和配置文件(如果指定)。然后,我们向命令行参数解析器提供一个初始化函数,该函数按照 配置文件解析 部分所述填充 Options 对象。然后解析器继续用命令行中指定的设置填充已初始化的对象。
选项验证
选项解析完成后,ServerSettingsManager.TryParseCommandLineArguments() 然后调用实例方法 Options.IsValid() 来验证最终的 Options 对象。
每个 Options 属性都可以用 ValidationAttribute 装饰(所有自定义 Garnet 验证属性都可以在 GarnetServer\Configuration\OptionsValidators.cs
中找到),然后可以使用它来检查每个属性值的有效性。如果发现任何无效的属性值,该方法将返回一个 null 选项对象,以及一个无效属性名称列表。
验证器返回的所有错误都将写入控制台。
如何添加新设置
要向 Garnet 添加新设置,请按照以下步骤操作:
- 向 Options 类 (
GarnetServer\Configuration\Options.cs
) 添加新属性 - 用 OptionAttribute 装饰您的属性,并为其分配长名称、短名称或两者。还要添加适当的帮助文本来描述该属性
- 如果您的属性需要验证,请用
GarnetServer\Configuration\OptionsValidators.cs
中的自定义 ValidationAttribute 装饰它(如果需要,添加一个新的) - 在
defaults.conf
中添加您的属性的默认值 - 如果核心 Garnet 代码中需要新设置 - 向 GarnetServerOptions 类添加匹配的属性,并在 Options.GetServerOptions() 中构造 GarnetServerOptions 对象时添加属性设置
- 如果该设置在 Redis 中有匹配的设置,并且您希望在 Redis 格式的配置文件中支持它
- 向 RedisOptions 类 (
GarnetServer\Configuration\RedisOptions.cs
) 添加匹配的属性 - 用 RedisOptionAttribute 装饰您的属性。在属性构造函数中指定键(Redis 关键字)、与此属性匹配的 Garnet 属性名称,以及可选的 - 在将 Redis 属性转换为 Garnet 属性时使用的转换器类型。在 RedisConf 部分阅读有关如何正确转换属性的更多信息。
- 向 RedisOptions 类 (
- 通过将新设置添加到配置文件并确保其被正确解析来测试您的代码。或者,您可以在 GarnetServerConfigTests (
Garnet.test\GarnetServerConfigTests.cs
) 中为您的设置添加检查。
如何添加新的配置文件格式
要向 Garnet 添加新的配置文件格式,请按照以下步骤操作:
- 向 ConfigFileType 枚举添加一个与新文件类型匹配的新值
- 实现 IConfigProvider 的新实例,用于从新文件格式导入/导出选项或导出到新文件格式
- 向 ConfigProviderFactory.GetConfigProvider() switch 语句添加一个新的 case,并返回您的 IConfigProvider 实现的新实例
- 如果需要,添加自定义序列化器来序列化或反序列化新文件格式
- 向 GarnetServerConfigTests (
Garnet.test\GarnetServerConfigTests.cs
) 添加新的测试用例,以检查您的代码是否正确导入/导出选项