11

我们的团队目前正在探索使用 Consul 为 Symfony2 应用程序服务发现的想法。处于相对前沿,讨论的方式很少。到目前为止,我们已经发现:

  • 运行时配置先前已被击落
  • 存在一个来处理这样的用例,但最近也没有看到很多活动。
  • 所述捆绑包的一位贡献者建议外部参数可能是问题的答案。
  • Sensio 创建了自己的 Consul SDK。但是,文档/官方博客文章re:Symfony2集成的方式似乎很少
  • Consol提供了可以在各种变化时触发的手表

当前的想法是探索利用 Consul 观察者重新触发缓存构建以及外部参数。也就是说,如果服务半频繁地更改,则对此类操作的开销存在一些担忧。

基于上述内容,以及对 Consul/Symfony 内部的了解,这是一种可取的方法吗?如果不是,为什么,以及有哪些替代方案?

4

2 回答 2

4

在我工作的公司,我们走的是不同的路线。

我们决定让 Consul 更新 Symfony 配置,而不是与 Symfony 对抗以接受运行时配置(例如 Spring Data Consul),在概念上相似,在实现上与 Frank 不同。

我们安装了 Consul 和 Consul Template。我们创建一个包含整个 parameters.yml 文件的 K/V 条目对。例子:

钥匙:eblock/config/parameters.yml

parameters:
    router.request_context.host: dev.eblock.ca
    router.request_context.scheme: http
    router.request_context.base_url: /

然后在位置添加了一个领事模板配置文件/opt/consul-template/config/eblock.cfg

template {
    source = "/opt/consul-template/templates/eblock-parameters.yml.ctmpl"
    destination = "/var/www/eblock/app/config/parameters.yml"
    command = "/opt/eblock/scripts/parameters_updated.sh"
}

ctmpl文件内容为:

{{key "eblock/config/parameters.yml"}}

最后,我们的parameters_updated.sh脚本会:

#!/bin/bash

readonly PROGNAME=$(basename "$0")
readonly LOCKFILE_DIR=/tmp
readonly LOCK_FD=201

lock() {
    local prefix=$1
    local fd=${2:-$LOCK_FD}
    local lock_file=$LOCKFILE_DIR/$prefix.lock

    # create lock file
    eval "exec $fd>$lock_file"

    # acquire the lock
    flock -n $fd \
        && return 0 \
            || return 1
}

lock $PROGNAME || exit 0

export HOME=/root
logger "Starting composer install" && \
/usr/local/bin/composer install -d=/var/www/eblock/ --no-interaction && \
logger "Running composer dump-autoload" && \
/usr/local/bin/composer dump-autoload -d=/var/www/eblock/--optimize && \
logger "Running app/console c:c/c:w" && \
/usr/bin/php /var/www/eblock/app/console c:c -e=prod --no-warmup && \
/usr/bin/php /var/www/eblock/app/console c:w -e=prod && \
logger "Running doctrine commands" && \
/usr/bin/php /var/www/eblock/app/console doctrine:database:create --env=prod --if-not-exists && \
/usr/bin/php /var/www/eblock/app/console doctrine:migrations:migrate -n --env=prod && \
logger "Restarting php-fpm" && \
/bin/systemctl restart php-fpm &

知道 consul 和 consul-template 服务都已启动,只要您在 consul 模板的指定键中更改值,它就会将文件转储到配置的目标并运行更新参数的命令。

它就像一个魅力。=)

于 2016-07-26T20:08:41.967 回答
2

一个简单的 KV 观察器,将值放入 parameters.yml,触发缓存:清除在我看来是最简单的选项,并且还提供了编译的好处,因此它不必每次都去 Consul 来检查值是否是更新。就像你说的那样,有一些开销,但如果你不每 5 分钟更改一次参数似乎没问题。

我们现在正在探索该选项,但如果您在此方面取得任何进展,我们将不胜感激。

[2016-02-23 更新] 我们已经实现了我上面提到的想法,它按预期工作:很好。请注意,我们仅在部署新版本时更改参数(因为我们还使用 Consul 的服务发现,因此无需更新参数中的服务列表)。我们这样做主要是因为它省去了我们在多个服务器上更改参数的无聊工作。像往常一样:这可能对你不起作用,但我认为如果像我之前所说的那样,你不每 5 分钟更改一次参数,你会很安全 :)

于 2016-02-09T12:07:45.500 回答