我已linkerd在this getting started page本地运行,基本代理示例有效。我的用例要求我将Web请求代理到几个.NET WebApi服务之一,所以我在本地运行了一个带有两个路径的示例WebApi项目:
hello world
["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;
并重新启动linkerd。
但是,http://localhost:4140/
似乎总是解析为http://localhost:58371/tacos
,而不是http://localhost:58371/api/values
。我不明白的是什么?
我已经在链接器网站上阅读了一堆示例dtab转换,并且我在yaml文件中使用了大量不同的配置。当然,我错过了一些愚蠢的东西,因为这似乎是一个非常简单的用例。
答案 0 :(得分:1)
默认情况下,linkerd使用与请求关联的HTTP Host标头的值来路由流量。在您的示例中,您正在设置Host: web
,因此无论请求URI的路径如何,所有流量都将转到服务发现中的“Web”服务。
因此,您应将其发送至localhost:4140/tacos
,而不是将您的请求发送至-H 'Host: tacos' localhost:4140/api/values
。您还需要按如下方式调整dtab:
/svc => /#/io.l5d.fs;
/svc/tacos => /svc/web;
这将使用Host: tacos
将所有流量路由到服务发现中的“Web”服务。但这只是默认配置。
如果您对基于URI路径而非HTTP主机头的路由感兴趣,可以使用linkerd的path identifier。类似的东西:
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 plugin,但这符合您的特定用例。