gpt4 book ai didi

Erlang,覆盖环境

转载 作者:行者123 更新时间:2023-12-02 08:33:37 32 4
gpt4 key购买 nike

我有一个带有一些应用程序的 erlang 节点。我想让我的应用程序从某个集中式服务器(例如 hiera server)获取它们的环境变量。有什么方法可以覆盖 .app 文件中的环境变量,将其替换为从某个地方获取的自定义变量?当然,我不想对我的应用程序代码进行任何更改。

最佳答案

如果您想完全避免更改应用程序代码,最好的办法是使用外部配置文件并将其从中央服务器复制到每个“本地”服务器。如果您在 sys.config 中的应用程序列表末尾指定文件路径(假设您使用的是发行版),BEAM VM 也会加载此文件作为附加配置。

使用它,您可以在/etc/my_service/extended.config 之类的位置创建一个文件,并让它使用某些服务或其他服务自动更新。 Puppet 是一个可以为您完成这部分工作的工具示例;看起来 Hiera(我不熟悉)会是另一个。

为清楚起见,使用这种方法,您的 sys.config 文件应如下所示:

[
{my_app1, [
{my_param1, 1},
{my_param2, "string"}
]},
{my_app2, [
...
]},
"/etc/my_service/extended.config"
].

但是,这种方法有一些明显的局限性,即配置文件只加载一次,如果您想在服务运行时更改它,则必须重新启动 BEAM VM。如果您正在生成 Erlang 版本(因此生成 sys.config),它也最有效。

如果您没有使用 Erlang 版本并且没有 sys.config 文件,您仍然可以使用带有 erl 的 -config 命令行参数指定配置文件

在我看来,最好的方法是要求您对应用程序进行一些小的修改。我建议将您的参数存储在分布式 mnesia 表中(或者任何其他数据库,真的,只要您可以轻松查询它)。随后,将 application:get_env/2,3 调用替换为对您定义的函数的调用,该函数会在回退到 application:get_env/2,3 之前检查您存储设置的数据库

例如:

-record(setting, {key, value}).
get_setting(App, Key) ->
get_setting(App, Key, undefined).

get_setting(App, Key, Default) ->
case mnesia:dirty_read(settings, {App, Key}) of
[] ->
application:get_env(App, Key, Default);
[_ = #setting{value = Value}] ->
Value
end.

关于Erlang,覆盖环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24198034/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com