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、基于文件的规则与服务发现providerssvc.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的事件机制,在网络编程文章中再仔细讨论。