【问题标题】:How to Handle Runtime Configuration of Symfony2 Using Consul Service Discovery如何使用 Consul 服务发现处理 Symfony2 的运行时配置
【发布时间】:2015-09-23 13:56:39
【问题描述】:

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

目前的想法是探索利用 Consul 观察者重新触发缓存构建以及外部参数。也就是说,如果服务半频繁地更改,那么这种操作的开销就会引起一些担忧。

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

【问题讨论】:

    标签: symfony service-discovery consul 12factor runtime-configuration


    【解决方案1】:

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

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

    我们安装了 Consul 和 Consul 模板。我们创建一个包含整个 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位置添加了一个consul模板配置文件:

    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 模板的指定键中的值发生更改,它就会将文件转储到配置的目标并运行更新参数的命令。

    它就像一个魅力。 =)

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 如果您有新问题,请点击 按钮提出问题。如果您有足够的声誉,you may upvote 的问题。或者,将其“加注”为收藏夹,您将收到任何新答案的通知。
      • 我可能会误解,但这对我来说是一个与该主题相关的问题。我要求更新他自己的问题,而不是让其他人直接回答(尽管那会很好)
      • 所以这是一个评论,并且 cmets 可能不会作为答案发布在 StackOverflow 上。用户earn the privilege of commenting通过问答和编辑活动参与。
      • 请阅读我之前的cmets中的链接。它解释了原因。
      • @Frank 这有点像鸡蛋的场景,cmets。我自己对此有点挑战。对于你的问题,我们还没有继续探索这个。它被搁置了,因为我们的 Consul 价值观目前保持不变。如果您最终采用建议的路线并根据您的发现更新此答案,我认为它可以证明是一个更符合 Tunaki 所提到的答案的好答案。我认为删除第一段并清理第二段,因为更多的陈述比问题更重要。
      猜你喜欢
      • 2017-08-16
      • 2017-12-10
      • 1970-01-01
      • 1970-01-01
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 2020-11-02
      • 2017-01-20
      相关资源
      最近更新 更多