Express Gateway,如何根据URL模式选择服务端点?

Express Gateway,如何根据URL模式选择服务端点?,express,api-gateway,express-gateway,Express,Api Gateway,Express Gateway,我试图在网关后面的同一个域上获得一组单独的服务器。目前,外部世界可以通过多个名称访问这些服务器。我们的销售团队希望为客户提供一个唯一的url,因此,如果一台服务器为10位客户服务,我们就有10条指向它的CNAME记录 如您所见,对于5台或6台服务器,apidendpoints的数量相当大。最重要的是,可以在任何给定的时间创建新的CNAME,这使得硬编码的apidentpoints成为管理的难题 是否可以有一个动态的serviceEndpointurl。我的想法是这样的: apiEndpoints

我试图在网关后面的同一个域上获得一组单独的服务器。目前,外部世界可以通过多个名称访问这些服务器。我们的销售团队希望为客户提供一个唯一的url,因此,如果一台服务器为10位客户服务,我们就有10条指向它的CNAME记录

如您所见,对于5台或6台服务器,
apidendpoints
的数量相当大。最重要的是,可以在任何给定的时间创建新的CNAME,这使得硬编码的
apidentpoints
成为管理的难题

是否可以有一个动态的
serviceEndpoint
url。我的想法是这样的:

apiEndpoints:
  legacy:
    host: '*.mydomain.com'
    paths: '/v1/*'
serviceEndpoints:
  legacyEndPoint:
    url: '${someVarWithValueofStar}.internal.com'
pipelines:
  default:
    apiEndpoints:
      - legacy:
    policies:
      - proxy:
          - action:
              serviceEndpoint: legacyEndPoint
基本上,我想要实现的是将所有
x.mydomain.com
重定向到
x.internal.com
,其中
x
可以是任何内容


我可以在url字符串中使用变量吗?有没有办法获取与主机中的通配符匹配的字符串?有没有其他办法来解决这个问题呢?

谢谢你的提问,我想在接下来的几个月里会有很多人问这个问题

Express Gateway支持环境变量;不幸的是,目前,
apiEndpoint
只能是一个定义良好的端点,没有任何替换功能

这是我们在不久的将来可能会改变的事情——使用代理表API,您可以插入一些更难的模板

如果这对您来说很紧迫,我会邀请您这样做,以便团队中的每个人都知道这样的功能,并且我们可以有效地对其进行优先级排序

同时,不幸的是,您将不得不处理大量的API端点


V.

为了满足我的需要,我最终破解了一个代理插件。非常基本,需要更多的工作和测试,但这是我开始的:

代理插件(我的代理)

gateway.config.xml

http:
  port: 8080
apiEndpoints:
  legacy:
    host: '*.external.com'
    paths: '/v1/*'
serviceEndpoints:
  legacy_end_point:
    url: 'https://*.internal.com'
policies:
  - my-proxy
pipelines:
  default:
    apiEndpoints:
      - legacy
    policies:
      - my-proxy:
          - action:
              serviceEndpoint: legacy_end_point 
              changeOrigin: true

这一切都归结为regex解析
apidendpoints
serviceEndpoints
主机和URL中的通配符,到目前为止还没有什么特别之处。我查看了内置代理插件的源代码,我认为我的天真方法不太适合,但它可以满足我的需要。

感谢您的反馈。起初我想提出一个问题,但不知道如何陈述。我想我现在知道了。就我的问题而言,我已经解决了,我创建了自己的代理策略,知道如何解析
serviceEndPoint
URL中的通配符,并用请求主机名中的服务器名称替换通配符。它非常粗糙,只适用于我的用例,如果我有时间想出一个更优雅的解决方案,我会创建一个PR。嘿,太好了。如果你能给我指一下你修改/编写的代码,我很想看看是否有机会在我们的主要分支中找到它。谢谢我已经添加了我自己的答案来描述我的解决方案。顺便说一句,我在这里创建了一个功能请求,非常棒。我们会调查的!
http:
  port: 8080
apiEndpoints:
  legacy:
    host: '*.external.com'
    paths: '/v1/*'
serviceEndpoints:
  legacy_end_point:
    url: 'https://*.internal.com'
policies:
  - my-proxy
pipelines:
  default:
    apiEndpoints:
      - legacy
    policies:
      - my-proxy:
          - action:
              serviceEndpoint: legacy_end_point 
              changeOrigin: true