0

我的 App Engine 应用程序中有两个不同的服务,称为 auth 和 app。auth 服务工作得很好,图像、css、js 和 php 都得到了正确的服务和执行。当我第一次启动 App Engine 应用程序时,auth 服务也是我的默认服务。

我的问题是应用程序服务。起初我得到的只是一堆太多的重定向错误,但后来我能够修复它,但现在没有任何 CSS JS,或者应用程序服务无法正确提供图像。唯一提供的 CSS 实际上来自 auth 服务,并且没有提供 JS,并且提供了一个来自 auth 服务的背景图像。同样,这是两个完全不同的东西,甚至生活在他们自己的自定义子域中。

此外,我的身份验证服务中的路由器被用作我的应用服务的路由器。

我认为所有这些问题都与我的默认服务(我什至不应该再使用它)干扰我的应用程序服务有关(而且它不会影响我的身份验证服务,因为它们是我认为的同一个它涉及谷歌云)。这是我的 app.yaml。除了服务名称和路由器名称外,这两个服务都是相同的:

runtime: php73
service: app
entrypoint: serve /approuter.php

handlers:

- url: /assets
  static_dir: assets

# Serve static files as static resources.
- url: /(.+\.(gif|png|jpg|svg|webp|jpeg|js))$
  static_files: \1
  upload: .+\.(gif|png|jpg|svg|webp|jpeg|js)$

- url: /style
  static_dir: style

- url: /js
  static_dir: js

- url: /.*
  script: auto

这是我的 dispatch.yaml:

dispatch:

  - url: "app.example.com/"
    service: app

  - url: "auth.example.com/"
    service: auth

所以这最终是我的问题:
当涉及到不同的服务时,我如何才能真正分离关注点?(即......没有默认服务为我的应用服务提供所有服务)

4

2 回答 2

0

所以这个答案真的很简单,但同样,它没有记录在任何地方,所以我想在这里给出一个非常深入的答案。

TLDR;答案如下(dispatch.yaml):

dispatch:

  - url: "app.example.com/*"
    service: app

  - url: "auth.example.com/*"
    service: auth

从字面上看,只是在每条路径的末尾添加一个 * ......让我们深入探讨一下并讨论它。

首先请记住,我的默认服务现在已成为“身份验证”服务。这很快就会很重要。

我想每个人都明白这里发生了什么……*域名后面的意思是它需要匹配指向该域的任何url。没有 的情况*是,该服务提供的唯一路径是我的根路径(或/)。其他一切都由默认服务处理......这让我们明白了为什么我在我的应用服务中看到来自默认服务的静态资产。

当 App Engine 遇到一个不是由 dispatch.yaml 专门处理的 URL(所以除了 app.example.com 和 auth.example.com 的根之外的任何东西)它会“默认”到默认服务,如果你记得,是我的身份验证服务。这就是为什么我的身份验证服务看起来运行良好,而我的应用服务却出现问题的原因。

因此,总而言之,将星号添加到调度 URL 允许应用引擎导航到正确的子文件夹。

于 2019-07-26T17:44:10.373 回答
0

请记住,您的项目中仍然需要默认服务,请参阅默认服务在 Google 的应用引擎中服务的目的

我的建议是将您的app服务设为默认服务并从文件中删除相应的条目dispatch.yaml(不匹配任何调度规则的请求将被发送到默认服务)。不要忘记使用app服务名称删除现有部署)。

亚当的回答也适用于auth服务(你需要通配符)。从 语法

提示:您可以在 url 元素中包含诸如 * 通配符之类的 glob 模式;但是,这些模式只能在主机名之前和 URL 路径的末尾使用。

可以包含主机名和 URL 路径的 URL 模式。全局字符可用于匹配模式。Glob 字符只能在模式的开头和结尾指定。

auth服务可能看起来运行良好,因为它实际上是由当前的默认服务(即它的旧版本)提供的。您可以在开发者控制台版本页面中检查哪些版本和服务处于活动状态。

于 2019-07-26T20:52:05.603 回答