Traefik是纯go实现的一个代理服务器,目前支持代理http、tcp、udp流量代理,http代理功能支持的相对完善。相比nginx c语言实现,traefik纯go实现入门使用和做功能开发容易上手很多,同时traefik目标为云原生场景下的边界网关路由
,在服务发现和动态配置方面支持的更好。
快速开始
我们还是从一个例子开始,快速上手traefik,再逐步展开解释其中概念。
Treafik使用go实现,安装只需从官网下载一个对应平台的二进制即可,这里跳过安装过程。
/tmp/tfk $ tree
.
├── conf.yaml
├── sd
│ └── svc.yaml
└── traefik
# /tmp/tfk/conf.yaml
entryPoints:
web:
address: :8080
providers:
file:
directory: "/tmp/tfk/sd"
# /tmp/tfk/sd/svc.yaml
http:
# Add the router
routers:
router0:
entryPoints:
- web
service: service-foo
rule: Path(`/`)
# Add the service
services:
service-foo:
loadBalancer:
servers:
- url: http://127.0.0.1:8000
主配置文件conf.yaml
定义了traefik的监听entrypoints
、基于文件的规则与服务发现providers
。svc.yaml
定义了路由规则routers
和服务组services
。Traefik静态加载的是conf.yaml
主配置,svc.yaml
服务信息修改后可以实时生效。
上面例子,我们定义了一个监听入口web
,然后定义了一个路由规则router0
,以/
为前缀的请求分发到服务组service-foo
。
特性与概念
- entrypoints 监听入口。
- routers 路由规则,一个路由规则可以关联多个entrypoint、middleware,并指定service。
- middlwares 中间件,在转发的过程中修改请求,类似nginx的rewrite和access控制便可在middleware中实现。
- services 服务组,类似nginx的upstream,可以指定多个real server并配置负载均衡。
- providers 配置动态服务发现services、routers。
应用集成
traefik通过providers支持了各种服务发现,我们可以用在各种场景下作为我们的网关入口,尤其是容器部署的无状态服务,服务更新后providers可以动态加载服务地址更新service。
目前支持的provider:
- Docker
- Kubernetes
- Consul
- KV(etcd、redis)
- 等等
性能相关
网上已有的benchmark https://github.com/NickMRamirez/Proxy-Benchmarks ,traefik与nginx的性能相比稍逊一点。
基于go原生的goroutine和底层调度相关的io循环思考,这个性能与nginx基于epoll的事件循环原理上是一样的,所以这个性能表现可以理解,需要注意的是traefik每个代理请求会丢给单独的goroutine处理,每个goroutine所占内存大小和nginx一个请求占用内存大小相比成本比较高,所以承载相同的qps traefik使用的内存会多很多。
关于go的io调度与nginx的事件机制,在网络编程文章中再仔细讨论。