28.7 服务代理工具
服务代理(又叫反向代理)是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。服务代理服务器也可以作为负载均衡器,隐藏后端真正服务器的细节,提高统一访问接口地址。参见图28-15。

图28-15 服务代理工具的功能
下面介绍支持Docker环境的一些服务代理开源项目。
28.7.1 Traefik
Traefik项目官方网址为https://traefik.io/。代码网址为https://github.com/containous/traefik。
Traefix是一个可以用来简化微服务部署的HTTP代理服务器和负载均衡服务器,支持多种后端服务,包括Docker、Swarm、Mesos/Marathon、Kubernetes、Consul、Etcd、Zookeeper、BoltDB、Rest API、file等。
传统的代理服务器不适应于动态环境,配置的动态改变一般难以实现,而微服务架构恰恰是动态的,服务的添加、去除和升级经常发生。Traefix可以监听服务注册/编排的API,当服务状态发生改变时,可动态更新反向代理服务器的配置。功能逻辑图参见图28-16。

图28-16 Traefik服务代理流程
还提供可视化的WebUI进行配置和状态监测,如图28-17所示。

图28-17 Traefik的可视化管理界面
运行方式包括二进制模式和容器模式。
二进制模式运行时需下载binary和配置文件(https://github.com/containous/traefik/releases和https://raw.githubusercontent.com/containous/traefik/master/traefik.sample.toml),然后直接运行:
- $ ./traefik -c traefik.toml
容器模式的命令如下:
- $ docker run -d -p 8080:8080 -p 80:80 -v $PWD/traefik.toml:/etc/traefik
- /traefik.toml traefik
28.7.2 Muguet
Muguet代码网址为:https://github.com/mattallty/muguet。
Muguet除了提供服务代理功能外,还提供DNS解析功能,这样应用可以使用域名来访问容器,而不需要再使用静态端口和IP。功能逻辑图如下图28-18所示。

图28-18 Muguet进行反向代理和域名解析的过程
Muguet的安装和使用都比较简单:
- Install Muguet
- $ npm install -g muguet
- Start Muguet (as root)
- $ sudo muguet up
- Usage
- $ sudo muguet up [options]
Muguet提供WebUI,默认域名http://muguet.docker,如图28-19所示。
28.7.3 nginx-proxy
nginx-proxy代码网址为https://github.com/jwilder/nginx-proxy。
nignx-proxy以容器方式运行Nginx和docker-gen,其中docker-gen负责产生代理配置文件并在容器启动时进行加载。使用方法如下。

图28-19 Muguet的Web管理界面
运行nignx-proxy:
- $ docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder
- /nginx-proxy
运行需要proxy的容器:
- $ docker run -d -e VIRTUAL_HOST=demo.tenxcloud.net --expose 8080 index.
- tenxcloud.com/tenxcloud/tomcat
注意,需要设置VIRTUAL_HOST环境变量修改DNS,使其值指向niginx-proxy所在机器IP,同时需要使用—expose暴露容器服务端口。访问http://demo.tenxcloud.com即可,参见图28-20。

图28-20 Nginx的管理界面
