标签: api-gateway

去掉 Zuul API 网关中的前缀

我正在尝试使用转发调用的 zuul 配置 API 调用路由器。有两种服务:users 服务使用路径版本控制,即/v1/users, /v2/users,...accounts 服务不使用路径版本控制,因此所有路由都省略前缀v*( /accounts)。

为了提供一个通用接口,我想接受对/v*/accounts我的 api 路由器的调用并将它们转发到/accounts我的帐户服务。呼叫应按/v*/user/原样转发至用户服务。

我的 application.yml 看起来像这样

zuul:
  routes:
    users: 
      path: /v*/users/**
      url: ${microservices.usersServiceUrl}
      stripPrefix: false
    accounts: 
      path: /v*/accounts/**
      url: ${microservices.accountsServiceUrl}
      stripPrefix: true
Run Code Online (Sandbox Code Playgroud)

不幸的是,这并没有达到预期的效果。帐户路径中的任何内容都不会被删除,并且会按原样转发。

如果我删除正则表达式 ( v*) 并放入path: /v1/accounts/**,则整个前缀/v1/accounts将被删除。显然,正则表达式可以防止前缀被剥离,从而发挥path: /v1/**/accounts/**作用。然而,我想避免明确命名所有版本,因为我们的 API 目前正在快速发展。

使用全局zuul.prefix也没有帮助,因为你只能全局决定将其剥离或保持完整。

我主要依赖这个文档

有没有更好的方法来指定转发的 URL 的格式?

spring-boot netflix-zuul api-gateway

5
推荐指数
0
解决办法
7920
查看次数

AWS 资源(Lambda 和 API Gateway)之间传输的加密

我试图查明 API Gateway 和 lambda 之间的传输是否使用 TLS 等加密。我通读了 AWS 安全白皮书,但没有看到任何迹象表明这一点。如果不是,如何在网关和 lambda 之间安全地传输信息。

提前致谢。

amazon-web-services aws-lambda tls1.2 api-gateway

5
推荐指数
1
解决办法
6233
查看次数

AWS:为同一域下的多个站点提供服务

我拥有一个域名my-portal.com。我想从 提供静态网站my-portal.com/site/a/。我想从 提供另一个静态网站my-portal.com/site/b/

如何使用 AWS 提供的资源来做到这一点?

我试图将两个网站设置为两个独立的 S3 存储桶,并启用静态网站托管,然后创建一个包含资源的 API 网关/site/a,并将/site/b其配置为 S3 网站的 HTTP 代理。

此设置在大多数情况下都可以正常工作。但是,当浏览器尝试从我的静态网站加载二进制文件(字体、图像等)时,API 网关无法正确处理该文件并以损坏的文件进行响应(因为它对二进制文件的行为很奇怪)。

我还有哪些其他方法可以达到相同的结果?

amazon-s3 amazon-web-services aws-api-gateway api-gateway

5
推荐指数
1
解决办法
1805
查看次数

FluentValidation Method Not Found 异常的原因是什么?

我有一个域驱动设计解决方案,由于某种原因,当通过GateWay进行 API 调用时,我在运行时遇到此异常:

One or more errors occurred. (Method not found: 'Void FluentValidation.AbstractValidator`1.When(System.Func`2<!0,Boolean>, System.Action)'.)
Run Code Online (Sandbox Code Playgroud)

出现错误如下:

我有这样的解决方案:

我现在关注的主要 4 个项目是:

  1. 核心模型
  2. 账户.Api
  3. 服务.Api.网关
  4. 网络客户端

Web.ClientSite发出请求,Service.Api.Gateway然后调用Account.Api. 请注意,到处都Core.Model引用了

非常重要:如果我从 中删除 FluentValidation 的引用Core.Model,异常就会消失。

我希望这些信息足够了。您认为我为什么会遇到此异常以及如何消除。

exception fluentvalidation api-gateway

5
推荐指数
1
解决办法
9530
查看次数

使用拥有自己数据库的微服务进行聚合、排序、过滤和分页

方法和要求: 我们有一个使用 Sql Server 数据库在 ASP.Net Core 中开发的微服务架构,其中每个微服务都有自己的 SQL 数据库,并且不允许我们进行跨微服务通信来聚合数据并将数据从微服务发送回 api 网关和进一步回到 UI(浏览器)。

我们的浏览器有一个数据网格,需要从不同的微服务聚合数据后显示数据,例如一个数据网格必须显示客户姓名、地址、预订参考号。电话号码、国家/地区名称、酒店名称、酒店地址、酒店费用和其他更多详细信息。

上面的数据网格中还有一个功能,可以根据其中的每一列对上面的网格数据进行排序;根据不同的列值过滤网格也是一个要求。此外,我们还需要在同一网格中进行分页,页面大小为 10 条记录。

目前,据我所知,数据聚合必须发生在 API 网关层,并且在其之上必须应用排序、过滤和分页功能。

我们使用 EF Core 2.0 作为数据 ORM,将数据发送回微服务并进一步响应。

问题1

哪一层(UI、API 网关、微服务)应该执行这种排序、过滤和分页功能,以便获得最佳性能和更好的用户体验?

问题2

是否有可能所有参数(例如排序顺序、排序列名称、页面大小、页码、筛选列名称、筛选列值)都应始终从 API 网关层发送到微服务 api,并成功实现所有功能而没有任何延迟以及读取操作的最佳性能?

问题3:

我们创建一个粗粒度的微服务来代替上述选项,对数据进行聚合、排序、过滤和分页,而不是 API 网关层进行聚合(目前 API 网关仅在其他微服务中进行聚合),这是一个好的模式吗? ?

pagination microservices asp.net-core-webapi api-gateway ef-core-2.0

5
推荐指数
1
解决办法
3921
查看次数

微服务架构中的身份验证处理 - Lumen、Laravel 和 SPA


我正在创建一个基于微服务架构的应用程序。
该应用程序用于自由职业相关活动,因此我创建了一个:

  1. 身份验证微服务(使用 Laravel)处理身份验证,它还具有用户数据库
  2. Lumen(Microframework)中构建的另一个微服务基本上处理自由职业者发布其工作并与他们一起管理

到目前为止,我的架构基本上是这样的:

建筑学


到目前为止我们还没有实现 API 网关。对于身份验证微服务中的身份验证,我们使用 Passport,它在后台使用 Oauth2 和 JWT。
我的情况的问题是,由于我从前端(REACT)直接向微服务发出请求,因此路由不受保护,例如在演出微服务中,每个人都可以发出请求。
所以我的问题是如何保护这些路由,我正在考虑制作一个中间件,每当我们有一个发送到该微服务的请求时,检查用户是否经过身份验证(解码令牌并验证用户是否经过身份验证) 。

当我将所有代码基本上放在 Laravel 的同一环境中时,通过 Laravel 提供的中间件很容易,但是由于仅用于身份验证的微服务和需要从中提供服务的其他微服务没有直接绑定,这给我带来了问题。


因此,如果你们有任何示例、建议或任何相关内容,我们将不胜感激。

authentication microservices lumen api-gateway

5
推荐指数
0
解决办法
999
查看次数

从 API 网关 AWS S3 集成的 XML 响应返回 JSON 响应

我已经为 S3 设置了一个 API 网关集成,用于调用 ListBucket 端点。这会返回 XML,例如

<?xml version="1.0" encoding="UTF-8"?>
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <Name>bucketname</Name>
  <Prefix/>
  <Marker/>
  <MaxKeys>1000</MaxKeys>
  <IsTruncated>false</IsTruncated>
  <Contents>
    <Key>foldername</Key>
    <LastModified>2020-05-28T09:56:21.000Z</LastModified>
    <Size>0</Size>
    <StorageClass>STANDARD</StorageClass>
  </Contents>
  <Contents>
    <Key>times/sporting.json</Key>
    <LastModified>2020-06-02T09:57:23.000Z</LastModified>
    <Size>14</Size>
    <Owner>
      <ID>ID</ID>
      <DisplayName>ACCOUNT-NAME</DisplayName>
    </Owner>
    <StorageClass>STANDARD</StorageClass>
  </Contents>
  <Contents>
    <Key>key/test.json</Key>
    <LastModified>2020-05-28T11:02:17.000Z</LastModified>
    <Size>16</Size>
    <StorageClass>STANDARD</StorageClass>
  </Contents>
</ListBucketResult>
Run Code Online (Sandbox Code Playgroud)

有没有办法使用 VTL 映射模板将此响应转换为 JSON?XML 似乎作为字符串返回,并且没有任何 JSONPath 指令返回类似$inputRoot['?xml'] or$inputRoot.ListBucketResult`的内容

amazon-s3 api-gateway

5
推荐指数
0
解决办法
541
查看次数

GCP:错误:(gcloud.services.enable)PERMISSION_DENIED:启用API时调用者没有权限

我正在尝试使用 API Gateway,但无法启用 apigateway.googleapis.com API。它没有显示在 中gcloud services list。我正在尝试遵循 gcp doc 的说明。https://cloud.google.com/api-gateway/docs/configure-dev-env#enabling_required_services

当尝试在控制台中启用它时,它不会返回任何内容。

当尝试在 gcloud 中启用它时,它返回错误,如下所示。 gcloud services enable apigateway.googleapis.com ERROR: (gcloud.services.enable) PERMISSION_DENIED: The caller does not have permission

我无法附加角色,因为我无法找到哪个角色与 apigateway 相关。由于没有相关政策,我无法创建自定义角色。

我有什么办法可以解决这个问题吗?

google-cloud-platform api-gateway google-cloud-api-gateway

5
推荐指数
1
解决办法
1万
查看次数

在没有 Kubernetes 的本地开发环境中运行大使

我正在尝试在本地开发环境上运行大使 API 网关,以便模拟我最终在生产中得到的结果 - 不同之处在于,在生产中我的解决方案将在 Kubernetes 中运行。为此,我将 Ambassador 安装到 Docker Desktop 中,并添加所需的配置以将请求路由到我的微服务。不幸的是,它对我不起作用,我收到以下错误:

upstream connect error or disconnect/reset before headers. reset reason: connection failure

我认为这是由于映射文件中的问题造成的,如下所示:

apiVersion: ambassador/v2
kind:  Mapping
name:  institutions_mapping
prefix: /ins/
service: localhost:44332
Run Code Online (Sandbox Code Playgroud)

所以我基本上想做的是重写所有发送到http://{ambassador_url}/insIIS Express(通过 Visual Studio)在 port 上本地运行的服务的请求44332

我缺少什么?

docker kubernetes microservices api-gateway ambassador

5
推荐指数
1
解决办法
569
查看次数

如何将新的 Lambda 函数部署到现有 RestApi 的 Stage?

所以,我遇到了很多线索,但没有一个能解决我的问题。我正在尝试使用现有的 DEV-Stage 将 Lambda 函数部署到现有的 RestApi。我的 API 是这样构建的:

this.RestAPIDev = new gw.RestApi(this, 'StagingGatewayDev', {
  restApiName: 'gateway-DEV',
  deploy: true,
  deployOptions: {
    stageName: 'DEV',
    description: 'DEV Stage',
    variables: { ALIAS: 'DEV' },
  }
});
Run Code Online (Sandbox Code Playgroud)

Lambda Stack 独立于其自己的存储库中,包括管道和 lambda 代码。我尝试通过添加资源和方法将这些 Lambda 函数部署到此现有网关,并假设因为我在deploy:true网关上设置,所以它将自行部署。这是 Lambda 堆栈:

const restApi = gw.RestApi.fromRestApiAttributes(this, 'RestApi', {
  restApiId: props.restApiId,
  rootResourceId: props.restApiRoot,
});

const authenticate = new lambda.Function(this, 'AuthenticateFunction', {
  code: this.lambdaCode, // is a property
  runtime: lambda.Runtime.NODEJS_12_X,
  handler: 'src/api/authenticate.handler',
  description: 'API: Authenticates the token',
  role: <executionRole>, // is …
Run Code Online (Sandbox Code Playgroud)

typescript api-gateway aws-cdk

5
推荐指数
1
解决办法
491
查看次数