sapse/approuter当业务应用由多个不同应用(微服务)组成时,应用路由器用于为该业务应用提供单一入口点。其主要职责包括:
!应用路由器概述图
可将不同应用(微服务)视为请求将被转发到的“目标”(destinations)。决定哪些请求应转发到哪个目标的规则称为“路由”(routes)。每个目标可对应多个路由。有关路由的更多概念将在本文档后续部分介绍。如果后端微服务需要身份验证,应用路由器可配置为对用户进行身份验证并传播用户信息。同样通过路由,应用路由器可以提供静态内容服务。
应用路由器设计用于 XS Advanced - Cloud Foundry 和 XS OnPremise Runtime 环境。
仅当没有可用 JWT 令牌时(例如,用户通过 Web 浏览器调用应用),调用组件才通过应用路由器访问目标服务。如果已存在 JWT 令牌(例如,用户已通过身份验证,或调用组件使用 JWT 令牌作为其自身 OAuth 客户端),调用组件将直接调用目标服务,无需使用应用路由器。
注意:应用路由器不会以任何方式隐藏后端微服务。它们仍然可以绕过应用路由器直接访问。因此,后端微服务必须通过验证 JWT 令牌并实施适当的范围检查来保护其所有端点。平台目前不提供网络隔离。
例如,我们有一个具有以下结构的业务应用:
+-- manifest.yml +-- manifest-op.yml | +-- microservice-1 | | +-- ... | | +-- ... | +-- microservice-2 | | +-- ... | | +-- ... | +-- web | | +-- ... | | +-- ...
manifest.yml 文件用于在 Cloud Foundry 上部署业务应用,manifest-op.yml 用于在 XS OnPremise Runtime 上部署。这些文件应描述该业务应用的所有微服务。
文件夹用于隔离不同的微服务。假设应用路由器是 web 文件夹中的微服务(每个业务应用都有自己的应用路由器)。以下是包含应用路由器的方法:
json{ "name": "hello-world-approuter", "dependencies": { "@sap/approuter": "2.6.1" }, "scripts": { "start": "node node_modules/@sap/approuter/approuter.js" } }
使用应用路由器无需编写任何 JavaScript 代码。只需在 web 文件夹中提供一些配置。以下是完整示例:
+-- web | +-- package.json | +-- xs-app.json | +-- resources | | +-- hello-world.html | | +-- my-page.html | +-- node_modules | | +-- ... | +-- default-env.json | +-- default-services.json
web 文件夹包含 package.json、node_modules、应用路由器使用的一些配置文件以及要提供的静态资源。有关配置的更多信息将在本文档后续部分介绍。
默认情况下,应用路由器在端口 5000 上运行(如果本地启动),或从 PORT 环境变量获取端口。
工作目录包含应用路由器所需的配置文件和可在运行时提供的静态资源。在前面的示例中,web 文件夹是工作目录。默认情况下,当前目录为工作目录。可在应用路由器启动期间使用以下命令行参数配置工作目录:
bashnode approuter.js -w <working-dir>
如果工作目录不包含 xs-app.json 文件,应用路由器将终止。
应用路由器使用以下配置:
主配置 - 即 xs-app.json 文件。此文件是必需的,包含应用路由器的主要配置。
UAA 配置 - 应用路由器从 VCAP_SERVICES 环境变量(部署在 Cloud Foundry 或 XS Advanced OnPremise Runtime 时)或 default-services.json 文件(本地运行时)读取此配置。有关更多详细信息,请参阅 @sap/xsenv 包的文档。
环境配置 - 这些配置从应用路由器的环境(部署在 Cloud Foundry 或 XS Advanced OnPremise Runtime 时)或 default-env.json 文件(本地运行时)读取。有关更多详细信息,请参阅 @sap/xsenv 包的文档。应用路由器考虑的环境变量如下:
| 配置 | 环境变量 | 描述 |
|---|---|---|
| UAA 服务名称 | UAA_SERVICE_NAME | 包含要使用的 UAA 服务名称。 |
| 目标 | destinations | 提供有关可用目标的信息。 |
| 附加标头 | httpHeaders | 提供应用路由器将在其响应中返回给客户端的标头。 |
| 附加 Cookie | COOKIES | 提供应用路由器将在其响应中返回给客户端的 Cookie。目前仅支持 SameSite Cookie。 |
| 插件 | plugins | 插件类似于路由,但无法配置某些内部属性。 |
| 会话超时 | SESSION_TIMEOUT | 表示会话超时(以分钟为单位)的正整数。默认超时为 15 分钟。 |
| X-Frame-Options | SEND_XFRAMEOPTIONS、httpHeaders | X-Frame-Options 标头值的配置。 |
| 允许列表服务 | CJ_PROTECT_WHITELIST | 用于防止点击劫持***的允许列表配置。 |
| WebSockets 源允许列表 | WS_ALLOWED_ORIGINS | 用于在建立 WebSocket 连接时验证初始升级请求的 Origin 标头的允许列表配置。 |
| JWT 令牌刷新 | JWT_REFRESH | JWT 令牌过期前应用路由器应触发令牌刷新例程的时间(以分钟为单位)。 |
| 传入连接超时 | INCOMING_CONNECTION_TIMEOUT | 客户端连接的最长时间(以毫秒为单位)。超过该时间后连接将关闭。如果设置为 0,则禁用超时。默认值:***(2 分钟) |
| 租户主机模式 | TENANT_HOST_PATTERN | 包含带捕获组的正则表达式的字符串。请求主机与此正则表达式匹配。第一个捕获组的值用作租户 ID。 |
| 目标主机模式 | DESTINATION_HOST_PATTERN | 包含带捕获组的正则表达式的字符串。请求主机与此正则表达式匹配。捕获组的值用作目标名称。 |
| 压缩 | COMPRESSION | 有关在响应客户端之前压缩资源的配置。 |
| 会话 Cookie 的 Secure 标志 | SECURE_SESSION_COOKIE | 可设置为 true 或 false。默认情况下,会话 Cookie 的 Secure 标志根据应用路由器运行的环境设置。例如,当应用路由器位于配置为提供 HTTPS 流量的路由器(Cloud Foundry 的路由器或 SAP Web Dispatcher)后面时,将存在此标志。本地开发期间不设置该标志。此环境变量可用于强制设置或省略 Secure 标志。注意:如果强制设置 Secure 标志,应用路由器将拒绝通过未加密连接(http)发送的请求。 |
| 受信任的 CA 证书 | XS_CACERT_PATH | 用于出站 https 连接(UAA、目标等)的受信任 CA 证书的文件路径列表。文件路径由 path.delimiter 分隔。如果省略此选项,将使用几个众所周知的“根”CA(如 VeriSign)。XSA On-premise 运行时会自动设置此变量。 |
| 拒绝不受信任的证书 | NODE_TLS_REJECT_UNAUTHORIZED | 默认情况下,如果远程端未提供受信任的证书,出站 https 连接将终止。可通过将 NODE_TLS_REJECT_UNAUTHORIZED 设置为 0 来禁用此检查。这是 Node.js 的内置功能。注意:不要在生产环境中使用此功能,因为它会损害安全性! |
| 外部反向代理标志 | EXTERNAL_REVERSE_PROXY | 指示在外部反向代理(Cloud Foundry 域之外)后面使用应用路由器的布尔值 |
| 启动时跳过客户端凭据令牌加载 | SKIP_CLIENT_CREDENTIALS_TOKENS_LOAD | 指示在应用路由器启动阶段不应创建客户端凭据令牌的布尔值 |
| 跨域资源共享 | CORS | 有关启用 CORS 的配置。 |
| 保留 URL 片段 | PRESERVE_FRAGMENT | 当设置为 true 或未设置时,未登录用户对受保护路由的第一个请求所提供的 URL 的片段部分将被保留,登录流程后用户将重定向到包含片段部分的原始 URL。但是,这可能会破坏对 Approuter 的编程访问(例如端到端测试),因为它引入了与 Approuter 4.0.1 及更早版本不兼容的登录流程更改。将值设置为 false 使登录流程向后兼容,但不会考虑 URL 的片段部分。 |
| 直接路由 URI 模式 | DIRECT_ROUTING_URI_PATTERNS | 直接路由 URI 模式的配置。 |
| NodeJS 最低日志级别 | CF_NODEJS_LOGGING_LEVEL | NodeJS 最低日志级别的配置。 |
| 动态身份提供商 | DYNAMIC_IDENTITY_PROVIDER | 动态身份提供商的配置。 |
| 后端 Cookie 密钥 | BACKEND_COOKIES_SECRET | 用于在服务到应用路由器流中加密后端会话 Cookie 的密钥。在使用多个应用路由器实例时应设置。默认情况下使用随机字符序列。 |
| 服务到应用路由器 | SERVICE_2_APPROUTER | 如果为 true,当从应用路由器接收到 SAP Passport 标头时,它将不加修改地传输到后端应用。 |
| 客户端证书标头名称 | CLIENT_CERTIFICATE_HEADER_NAME | 设置后,应用路由器将使用此标头名称从订阅回调的请求标头中获取客户端证书。如果未提供,默认标头名称为 x-forwarded-client-cert。 |
| 服务器保持连接 | SERVER_KEEP_ALIVE | 服务器保持连接超时(以毫秒为单位的正整数)。 |
| 最小令牌有效期 | MINIMUM_TOKEN_VALIDITY | 以秒为单位的正整数。设置后,approuter 将检查授权服务返回的令牌的过期时间是否高于最小令牌有效期值。 |
注意:所有这些环境变量都是可选的。
目标配置可由 destinations 环境变量或目标服务提供。业务应用的每个应用(微服务)都必须有一个目标。
目标配置是对象数组。目标可具有以下属性:
| 属性 | 类型 | 可选 | 描述 |
|---|---|---|---|
| name | String | 否 | 目标的唯一字母数字标识符。 |
| url | String | 否 | 应用(微服务)的 URL。 |
| proxyHost | String | 是 | 代理服务器的主机,用于请求应通过代理到达目标的情况。 |
| proxyPort | String | 是 | 代理服务器的端口,用于请求应通过代理到达目标的情况。 |
| forwardAuthToken | Boolean | 是 | 如果为 true,则将 OAuth 令牌发送到目标。默认值为 false。此令牌包含用户身份、范围和其他属性。它由 UAA 或 IAS 服务签名,因此可用于后端服务的用户身份验证和授权。 |
| strictSSL | Boolean | 是 | 配置应用路由器是否应拒绝不受信任的证书。默认值为 true。注意:不要在生产环境中使用此功能,因为它会损害安全性! |
| timeout | Number | 是 | 表示等待目标响应的最长时间(以毫秒为单位)的正整数。默认值为 30000ms。 |
| setXForwardedHeaders | Boolean | 是 | 如果为 true,应用路由器会将 X-Forwarded-(Host, Path, Proto) 标头添加到后端请求。默认值为 true。 |
| proxyType | String | 是 | 配置目标用于访问内部网络还是公共 Internet 上的应用。可能的值:OnPremise。如果未提供该属性,则假定为公共 Internet 访问。注意:如果设置了 OnPremise 值,则需要绑定到 SAP Cloud Platform 连接服务,并且不应设置 forwardAuthToken 属性。 |
注意:指定的超时也将应用于目标的注销路径或服务的注销路径(如果已设置)。
注意:proxyHost 和 proxyPort 是可选的,但如果定义了其中一个,则另一个变为必需的。
目标环境变量的示例内容:
json[ { "name" : "ui5", "url" : "[***]", "proxyHost" : "proxy", "proxyPort" : "8080", "forwardAuthToken" : false, "timeout" : 1200 } ]
也可将目标包含在 manifest.yml 和 manifest-op.yml 文件中:
yml- name: node-hello-world memory: 100M path: web env: destinations: > [ {"name":"ui5", "url":"[***]"} ]
目标配置也可从 目标服务 读取。
以下是应用路由器对从目标服务获取的目标属性配置的限制:
| 属性 | 附加属性 | 描述 |
|---|---|---|
| 类型 | 仅支持 HTTP。 | |
| 身份验证 | 支持所有身份验证类型。 注意:如果身份验证类型为 基本身份验证,则 用户 和 密码 是必需的。注意:如果身份验证类型设置为 主体传播,则 ProxyType 必须为 on-premise。注意:如果身份验证类型设置为 OAuth2SAMLBearerAssertion,则 xs-security.json 中需要 uaa.user 范围。 | |
| ProxyType | 支持的代理类型:on-premise、internet、private-link。注意:如果 ProxyType 设置为 on-premise,则需要绑定到 SAP Cloud Platform 连接服务。注意: private-link 代理类型是测试功能,不适合生产使用。仅在 Azure 环境中可用。 |
可选附加属性:
| 属性 | 附加属性 | 描述 |
|---|---|---|
| HTML5.ForwardAuthToken | 是 | 如果为 true,则将 OAuth 令牌发送到目标。默认值为 false。此令牌包含用户身份、范围和其他属性。它由 UAA 签名,因此可用于后端服务的用户身份验证和授权。注意:如果 ProxyType 设置为 on-premise,则不应设置 ForwardAuthToken 属性。注意:如果身份验证类型不是 NoAuthentication,则不应设置 ForwardAuthToken 属性。 |
| HTML5.Timeout | 是 | 表示等待目标响应的最长时间(以毫秒为单位)的正整数。默认值为 30000ms。注意:指定的超时也将应用于目标的注销路径或服务的注销路径(如果已设置)。 |
| HTML5.PreserveHostHeader | 是 | 如果为 true,应用路由器会保留后端请求中的主机标头。某些后端系统(如 AS ABAP)需要此标头,它们不处理 x-forwarded-* 标头。 |
| HTML5.DynamicDestination | 是 | 如果为 true,应用路由器允许在主机或路径级别动态使用此目标。 |
| HTML5.SetX |
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
无需登录使用专属域名
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
VS Code Dev Containers 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
Harbor Proxy Repository 对接专属域名
Portainer Registries 加速拉取
Nexus3 Docker Proxy 内网缓存
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
manifest unknown
no matching manifest(架构)
TLS 证书失败
DNS 超时
410 Gone 排查
402 与流量用尽
401 认证失败
429 限流
D-Bus 凭证提示
413 与超大单层
来自真实用户的反馈,见证轩辕镜像的优质服务