概述¶
请求发生了什么?
让我们来放大下 Traefik 的架构,来分析下路由被创建的相关组件。
首先,当启动 Traefik 时,需要定义 entrypoints。然后,根据连接到这些 entrypoints 的 路由 来分析传入的请求,来查看他们是否与一组 规则 相匹配,如果匹配,则路由可能会将请求通过一系列 中间件 转换过后再转发到你的 服务 上去。
明确责任¶
- Providers 来发现基础设施上存在的服务(它们的 IP、运行状况等...)
- Entrypoints 监听传入的流量(端口等...)
- Routers 分析请求(host, path, headers, SSL, ...)
- Services 将请求转发到你的服务(load balancing, ...)
- Middlewares 中间件,用来修改请求或者根据请求来做出一些判断 (authentication, rate limiting, headers, ...)
File Provider 示例¶
下面是一个 file provider 的完整配置文件示例,该配置文件将 http://domain/whoami/
的请求转发到一个可访问的服务 http://private/whoami-service/
上。
在该过程中,Traefik 会使用中间件来对用户进行身份验证(使用 BasicAuth 中间件)。
静态配置如下:
[entryPoints]
[entryPoints.web]
# 在8081端口上监听传入的请求
address = ":8081"
[providers]
# 开启 file provider,可以在一个文件夹中来定义 路由/中间件/服务
[providers.file]
filename = "dynamic_conf.toml"
entryPoints:
web:
address: :8081
providers:
file:
filename: dynamic_conf.yml
--entryPoints.web.address=:8081
--providers.file.filename=dynamic_conf.toml
动态配置如下所示:
# http 路由部分
[http]
[http.routers]
# 定义请求和服务之间的连接
[http.routers.to-whoami]
rule = "Host(`domain`) && PathPrefix(`/whoami/`)"
# 如果匹配上面的规则,则使用下面的中间件
middlewares = ["test-user"]
# 如果经过中间件过后仍然OK,则转发请求到下面定义的 whoami 服务。
service = "whoami"
[http.middlewares]
# 定义一个认证机制=
[http.middlewares.test-user.basicAuth]
users = ["test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/"]
[http.services]
# 定义在我们的环境中如何获得现有的服务
[http.services.whoami.loadBalancer]
[[http.services.whoami.loadBalancer.servers]]
url = "http://private/whoami-service"
http:
routers:
to-whoami:
rule: "Host(`domain`) && PathPrefix(`/whoami/`)"
middlewares:
- test-user
service: whoami
middlewares:
test-user:
basicAuth:
users:
- test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/
services:
whoami:
loadBalancer:
servers:
- url: http://private/whoami-service
在该示例中,我们使用 file provider,即使这是配置 Traefik 最普通的一种方法,但是也明确描述了每个可用的概念。
HTTP / TCP
在该示例中,我们仅仅为 http 请求定义了路由规则,此外 Traefik 还支持 TCP 请求。我们可以添加 TCP 路由 和 TCP 服务,然后在 TCP 部分进行声明,如下所示。
在 whoami.traefik.io 上面为 TCL 请求添加一个 TCP 路由
静态配置
[entryPoints]
[entryPoints.web]
# 在8081端口上监听传入请求
address = ":8081"
[providers]
# 开启 file provider,可以在一个文件夹中来定义 路由/中间件/服务
[providers.file]
filename = "dynamic_conf.toml"
entryPoints:
web:
address: :8081
providers:
file:
filename: dynamic_conf.yml
--entryPoints.web.address=":8081"
--providers.file.filename=dynamic_conf.toml
动态配置
# http 路由部分
[http]
[http.routers]
# 定义请求和服务之间的连接
[http.routers.to-whoami]
rule = "Host(`domain`) && PathPrefix(`/whoami/`)"
# 如果匹配上面的规则,则使用下面的中间件
middlewares = ["test-user"]
# 如果经过中间件过后仍然OK,则转发请求到下面定义的 whoami 服务。
service = "whoami"
[http.middlewares]
# 定义一个认证机制
[http.middlewares.test-user.basicAuth]
users = ["test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/"]
[http.services]
# 定义在我们的环境中如何获得现有的服务
[http.services.whoami.loadBalancer]
[[http.services.whoami.loadBalancer.servers]]
url = "http://private/whoami-service"
[tcp]
[tcp.routers]
[tcp.routers.to-whoami-tcp]
rule = "HostSNI(`whoami-tcp.traefik.io`)"
service = "whoami-tcp"
[tcp.routers.to-whoami-tcp.tls]
[tcp.services]
[tcp.services.whoami-tcp.loadBalancer]
[[tcp.services.whoami-tcp.loadBalancer.servers]]
address = "xx.xx.xx.xx:xx"
http:
routers:
to-whoami:
rule: Host(`domain`) && PathPrefix(`/whoami/`)
middlewares:
- test-user
service: whoami
middlewares:
test-user:
basicAuth:
users:
- test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/
services:
whoami:
loadBalancer:
servers:
- url: http://private/whoami-service
tcp:
routers:
to-whoami-tcp:
service: whoami-tcp
rule: HostSNI(`whoami-tcp.traefik.io`)
services:
whoami-tcp:
loadBalancer:
servers:
- address: xx.xx.xx.xx:xx