0

我已经根据此入门页面在本地运行了linkerd,并且基本代理示例有效。我的用例要求我将 Web 请求代理到多个 .NET WebApi 服务之一,因此我制作了一个在本地运行的具有两条路由的小示例 WebApi 项目:

  1. 本地主机:58371 返回hello world
  2. localhost:58371/api/values 返回["value1", "value2"]

使用匹配的路由映射请求

如果我让我的linkerd.yaml文件开箱即用:

routers: - protocol: http dtab: | /svc => /#/io.l5d.fs

然后映射路由直接起作用:

curl -H "Host: web" http://localhost:4140/-->hello world

curl -H "Host: web" http://localhost:4140/api/values-->["value1", "value2"]

映射不匹配的路线

现在,我想映射localhost:4140/tacos--> localhost:58371/api/values。因此,我将 .yaml 文件更新为:

routers: - protocol: http dtab: | /svc => /#/io.l5d.fs; /tacos => /api/values; 并重新启动链接器。

然而,http://localhost:4140/似乎总是下决心http://localhost:58371/tacos,不是http://localhost:58371/api/values。我不明白什么?

我已经阅读了 linkerd 网站上的一堆示例 dtab 转换,并且在我的 yaml 文件中使用了一堆不同的配置。当然,我缺少的只是一些愚蠢的事情,因为这似乎是一个非常简单的用例。

4

1 回答 1

1

默认情况下,linkerd 使用与请求关联的 HTTP Host 标头的值来路由流量。在您的示例中,您正在设置Host: web,因此无论请求 URI 的路径如何,所有流量都将流向在服务发现中找到的“网络”服务。

因此,与其将您的请求发送至localhost:4140/tacos,不如将其发送至-H 'Host: tacos' localhost:4140/api/values。您还需要按如下方式调整 dtab:

/svc       => /#/io.l5d.fs;
/svc/tacos => /svc/web;

这会将所有流量路由Host: tacos到服务发现中找到的“网络”服务。然而,这只是默认配置。

如果您对基于 URI 路径而不是 HTTP Host 标头的路由感兴趣,可以使用 linkerd 的路径标识符。就像是:

routers:
- protocol: http
  identifier:
    kind: io.l5d.path
    segments: 1
  dtab: |
    /svc => /#/io.l5d.fs;

使用该配置,请求localhost:4140/api/values将被路由到服务发现中的“api”服务,并且请求localhost:4140/tacos将被路由到“tacos”服务,并且可以通过修改您的 dtab 来更改这两个路由决策。

我应该注意到,linkerd 不会根据 dtab 规则进行任意 HTTP URI 路径重写。由于它是一个代理,它期望在不修改的情况下代理请求,除了少数例外(例如consume路径标识符上的选项)。您总是可以编写一个linkerd 插件,尽管它适合您的特定用例。

于 2017-06-14T23:42:14.357 回答