traefix是类似于nginx的可以做反向代理的边缘路由网关,根据介绍原生支持微服务和各种集群,目前只接触到单机静态部署,因为刚接触不了解,一直按nginx的思维去配置,绕了不少弯路,所以写这篇文章记录一下。
基本介绍※
traefix不像nginx那样监听、路由、目标服务地址都配在一处,他支持动态服务发现,动态路由,一般请求需要经过三大步骤:入口、路由、服务

这涉及到几个核心组件:
Providers:服务提供商,用来动态注册服务以及路由的
Entrypoints:定义入口端点,也就是要监听的端口
Routers:路由,根据请求的数据做响应匹配,判断调用哪个服务
Services:定义后端服务api,提供给路由调用
Middlewares:中间件,路由之后可以调用一系列的中间件处理请求,之后再调用服务
静态配置※
providers是基础组件,用来动态注册服务和路由的,他可以来自docker,可以来自kubernetes,也可以来自配置文件,起先刚接触的时候见到了其他教程,将上面的三大组件放到一起介绍,导致我误以为静态配置时,是配置在同一个配置文件同一个层级的,一直不生效,折腾了一整晚。
其实,traefik分为静态配置部分和动态配置部分,Providers和Entrypoints是静态配置部分,配置入口端点以及动态发现地址。
# traefik.yml
entrypoints:
# 自定义入口名称
web:
address: ":80"
http:
# 重定向到另外一个入口
redirections:
entryPoint:
to: websecure
# 自定义入口名称
websecure:
address: ":443"
http:
tls: {}
providers:
# 定义一个来自文件的服务提供商
file:
filename: dynamic_conf.yml
# 监听文件变更,一般不轻易变更的话就不用配置这个
watch: true这里只需要配置好监听哪些端口,以及如何去动态的获取Routers、Services、Middlewares。watch选项设置为true,那么traefix会去监视dynamic_conf.yml的变化,如果dynamic_conf.yml不需要经常变更,则不用配置
动态配置部分※
另外创建一个配置文件给traefix获取路由、中间件、服务。
# dynamic.yaml
http:
# 路由配置
routers:
# 为路由自定义一个名称
blog:
# 路由规则,这里表示匹配域名为dards.cn的请求,所有前缀为/的请求
rule: "Host(`blog.dards.cn`) && PathPrefix(`/`)"
# 调用哪个服务,这里的服务在下面的services里定义。
service: blogService
# 启用ssl,需要在tls里配置blog.dards.cn对应的证书,这里还有高级配置先不展开
tsl: {}
# 服务配置
services:
# 自定义服务名
blogService:
loadBalancer:
servers:
- "http://localhost:8080"
- "http://localhost:8090"
# 定义证书路径
tls:
certificates:
- certFile: /ssl/blog.dards.cn.crt
keyFile: /ssl/blog.dards.cn.key有时候我们后端服务url地址可能不在根目录,用反向代理也可以轻易变更路径,而不用去变更原有的后端服务,在路由那边添加middlewares。
# dynamic.yaml
http:
# 路由配置
routers:
# 为路由自定义一个名称
blog:
# 路由规则,这里表示匹配域名为blog.dards.cn的请求,所有前缀为/的请求
rule: "Host(`blog.dards.cn`) && PathPrefix(`/`)"
# 调用哪个服务,这里的服务在下面的services里定义。
service: blogService
# 声明调用后端服务之前,需要执行的中间件列表,对请求数据做处理
middlewares:
- rootToShare
# 启用ssl,需要在tls里配置blog.dards.cn对应的证书,这里还有高级配置先不展开
tsl: {}
# 服务配置
services:
# 自定义服务名
blogService:
loadBalancer:
servers:
- "http://localhost:8080"
- "http://localhost:8090"
# 中间件定义
middlewares:
# 自定义名称
rootToShare:
# 这个中间件的功能是对路径做正则表达式替换
# 以下配置的效果就是所有对根路径/的请求,都增加/share/前缀后再请求后端
replacePathRegex:
regex: "^/(.*)"
replacement: "/share/$1"
# 定义证书路径
tls:
certificates:
- certFile: /ssl/blog.dards.cn.crt
keyFile: /ssl/blog.dards.cn.key