【问题标题】:Requests failing when made to service URL, but not to version url向服务 URL 发出请求失败,但对版本 url 没有
【发布时间】:2021-03-21 02:54:11
【问题描述】:

我正在尝试在 Google App Engine 上设置服务,但无法让 XmlHttp 与它一致地工作。

部署后,可以从2个不同的url访问网站:service-dot-project.appspotversion-dot-service-dot-project.appspot,由于某种原因,两者之间存在不一致。

这里有一些可验证给我带来麻烦的演示代码。

# routes.py
from flask import render_template
from . import app

@app.route("/test", methods=["GET"])
def test():
  return render_template("test.html")

@app.route("/api/test", methods=["GET"])
def api_test():
  return "It Works!"
# templates/test.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8" />
  <title>Debug</title>
</head>
<body>
  <div id="out"></div>
  <button type="button" onclick="run()">
    Test the thing.
  </button>
  <script>
    function run() {
      let xmlHttp = new XMLHttpRequest();
      xmlHttp.onreadystatechange = () => {
        if (xmlHttp.readyState === 4 && xmlHttp.status === 200)
          document.getElementById("out").innerText = xmlHttp.responseText;
      }
      xmlHttp.open("GET", "/api/test", true);
      xmlHttp.send(null);
    }
  </script>
</body>
</html>
# service.yaml
runtime: python38
service: name
automatic_scaling:
  min_idle_instances: 1
instance_class: F4
entrypoint: gunicorn -b :$PORT main:app
env_variables:
  ...

当我尝试按下版本网址上的按钮时,它按预期工作,并且“它工作!”打印到按钮上方的 div 中,但在服务 url(未指定版本)上,页面本身会加载,但按下按钮会导致请求挂起几秒钟,然后再将其打印到控制台:

GET https://service-dot-project.appspot.com/api/test [HTTP/2 404 Not Found 7912ms]

使用本地flask调试环境进行测试时,不会出现问题。

我应该知道 Google App Engine 所做的哪些事情可能会导致此问题发生? /api 是保留端点吗?我的其余端点在服务 url 上工作,它只有 api 端点中断。我唯一的 app.before_request 方法因 403 而失败,而不是 404,所以这不是原因。

【问题讨论】:

  • xmlHttp 是否会发生这种情况,或者如果您直接提出请求,您是否会得到相同的行为,例如通过curl? curl -I https://service-dot-project.appspot.com/api/test 的输出是什么?
  • 在浏览器中打开/api 端点具有相同的效果。在版本 URL 上,它按预期工作,但在服务 URL 上,它没有......如果我在 curl 或 postman 中打开,由于 Google IAP,我会立即点击登录屏幕。

标签: javascript python google-app-engine flask


【解决方案1】:

如果你去https://console.cloud.google.com/appengine/versions

并选择您遇到问题的服务,是否有其他版本正在接收流量而不是您想要的版本?

另外,尝试转到日志,找到 404 的条目,展开它并查看哪个版本引发了该错误,在 protoPayload > versionId

【讨论】:

  • 所有流量都流向我正在尝试使用的版本。没有流量鸿沟。
  • 我刚刚添加了一个编辑,尝试转到日志,找到 404 的条目,展开它并查看哪个版本在 protoPayload > versionId 下抛出了该错误
  • 日志中什么都没有。显示通过版本 URL 的成功运行,但是导致 404 的任何原因都没有。然而,那里有很多关于谷歌云调试器的追溯。会不会跟这有关系?
  • 也许分享其中一个追溯,但我不这么认为。如果您在日志中根本没有看到 404,那么我认为您的应用引擎服务甚至没有收到请求。
  • 为了更深入地检查您的 App Engine 日志和设置,我建议您使用 GCP 打开一个案例。这里需要更多细节来理解为什么会这样。
【解决方案2】:

问题似乎是由我们项目上运行的其他服务之一引起的。

我们的默认服务在 dispatch.yaml 中定义

dispatch:
  - url: "/api*"
    module: otherservice

拦截所有发给myservice-dot-project的请求并将它们重定向到otherservice-dot-project

为什么版本url不是这样,可能是因为默认服务没有相同版本号的版本。

解决方法是更改​​默认服务的调度 url,或者更改新服务的 API 端点的 url。

【讨论】:

    猜你喜欢
    • 2022-01-05
    • 1970-01-01
    • 2010-11-22
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 2012-08-31
    相关资源
    最近更新 更多