【问题标题】:google app engine local server manual scaling issues谷歌应用引擎本地服务器手动缩放问题
【发布时间】:2018-01-12 19:44:23
【问题描述】:

我有一个在 Google App Engine 的标准实例上运行的 Java Spring 应用程序。我们最近从自动缩放切换到手动缩放,以适应更长的 cronjobs。

尝试在本地运行服务器时遇到问题./gradlew startServer。这是由于我们在 *appengine-web.xml" 中的手动缩放配置:

<instance-class>B8</instance-class>
<manual-scaling>
    <instances>1</instances>
</manual-scaling>

即使我们尝试将实例数设置为 1。Gradle 尝试启动应用程序超过 1 次,导致错误。只有当我将设置切换回自动缩放时,问题才会得到解决:

<instance-class>@server.instance.class@</instance-class>
<automatic-scaling>
    <min-idle-instances>@min.idle.instances@</min-idle-instances>
    <max-idle-instances>@max.idle.instances@</max-idle-instances>
    <min-pending-latency>@min.pending.latency@</min-pending-latency>
    <max-pending-latency>@max.pending.latency@</max-pending-latency>
</automatic-scaling>

对此的一种解决方案是将手动缩放交换为基于env 的自动缩放,并使用脚本将其添加到./gradlew startServer

从配置的角度来看,有没有办法不走脚本路线

【问题讨论】:

  • 有一种方法可以确定您的应用程序在哪个环境中运行,在“检测应用程序运行时环境”子中的documentation“使用本地开发服务器”中提供了解决方案-章节。该解决方案基于检查 SERVER_SOFTWARE 环境变量: if os.getenv('SERVER_SOFTWARE', '').startswith('Google App Engine/'): # Production else: # Local development server
  • @George 问题是您的建议只能在运行时动态工作,而扩展配置是静态的,只能通过修改后的配置文件重新部署来更改。
  • 感谢大家的回复。我实际上想出了一个解决方案,可以根据环境动态更改部署。往下看

标签: java spring google-app-engine


【解决方案1】:

这不是最优雅的解决方案,但它的优点是每次我想在本地启动服务器时都不会更改.xml 文件。唯一的缺点是它迫使我像这样编写我的 xml:

<application>@sublink.project.id@</application><!-- unused for Cloud SDK based tooling -->
<service>sublink</service>
<runtime>java8</runtime>
<threadsafe>true</threadsafe>
<instance-class>@server.instance.class@</instance-class>

<!--<automatic-scaling>-->
    <!--<min-idle-instances>@min.idle.instances@</min-idle-instances>-->
    <!--<max-idle-instances>@max.idle.instances@</max-idle-instances>-->
    <!--<min-pending-latency>@min.pending.latency@</min-pending-latency>-->
    <!--<max-pending-latency>@max.pending.latency@</max-pending-latency>-->
<!--</automatic-scaling>-->

<manual-scaling>
    <instances>@scaling.manual.instances@</instances>
</manual-scaling>

<env-variables>
    <env-var name="SPRING_PROFILES_ACTIVE" value="@active.deploy.env@"/>
</env-variables>

然后在我的build.gradle 我这样做:

   from('src/main/webapp/WEB-INF')
include '*.xml'
into("build/exploded/WEB-INF")

filter(ReplaceTokens, tokens: props)

if (deployEnv == "local") {
    // Use a closure to remove lines
    filter { String line ->
        line.trim().startsWith('<instance-class>') ? null : line
    }
    filter { String line ->
        line.trim().startsWith('<manual-scaling>') ? null : line
    }
    filter { String line ->
        line.trim().startsWith('<instances>') ? null : line
    }
    filter { String line ->
        line.trim().startsWith('</manual-scaling>') ? null : line
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    • 2016-04-29
    • 2013-02-07
    • 2013-09-04
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多