Vulcand使用实践
背景
最近一直想通过Etcd的集群配置能力去构建一个应用动态负载均衡的项目,一开始想到的是使用目前广泛使用的Confd+Etcd的方案。 在学习实践中发现复杂度一点都不低,如果初学者想通过Etcd去做一些工具,我感觉不够简单。
后来,我在etcd的官网了解了一个同样基于Etcd的开源工具 Vulcand
。作为一个专用的工具,它的使用比Confd更加简单。
进步一说,Vulcand还能为我们的服务提供零停机
的web更新。
Vulcand 是什么
想详细了解可以进入官方项目页面 : github.com/vulcand/vulcand
Vulcand
是一个专门为HTTP API管理与微服务而开发的 反向代理
服务, 它底层基于 Netflix 的 Hystrix
它的功能特性分别为:
- 使用Etcd作为配置后端
- 提供API和命令行的交互方式
- 支持插件式的中间件服务
- 支持实时监控和弹性部署
功能架构如下图:
TL;DR
环境准备
好了,基本了解Vulcand,我们可以创建三个用于模拟应用负载的简单web程序。
这三个web的程序我是基于Gin构建的,因为Gin简单高效,它一直作为我web服务的首选之一。
我们用于部署的服务器地址约定为 192.168.139.140
以下是源码:
web应用:app-0
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.String(200, "hello devops 0")
})
r.Run(":8081")
}
web应用:app-1
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.String(200, "hello devops 1")
})
r.Run(":8082")
}
web应用:app-2
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.String(200, "hello devops 3")
})
r.Run(":8083")
}
编写完三个web应用代码后,我们分别对它们进行启动
此时我们可以在浏览器输入
http://192.168.139.140:8081
http://192.168.139.140:8082
http://192.168.139.140:8083
观察app是否正常启动
三个web app 服务都正常启动后,我们接下来就开始最重要的工作了。
vuland搭建
为了最大限度降低复杂度,我使用了通过容器构建方式,因为相比源码构建,docker容器构建简单快捷。
在搭建vuland前,我们需要确保Etcd服务已经搭建并启动, 关于搭建方式可以参考我之前的文档 : Etcd环境搭建
具体步骤 :
1.下载镜像:
$ sudo docker pull mailgun/vulcand:v0.8.0-beta.2
2.构建容器
$ sudo docker run -p 8182:8182 -p 8181:8181 mailgun/vulcand:v0.8.0-beta.2 /go/bin/vulcand -name vulcand_server -apiInterface=0.0.0.0 -interface=0.0.0.0 --etcd=http://192.168.139.134:2379
3.查看日志可以用以下的命令:
$ sudo docker logs $(sudo docker ps -a | grep vulcand | awk '{ print $1 }')
4.配置backend
配置backend, 我们直接通过etcd的命令工具进行:
$ etcdctl set /vulcand/backends/b1/backend '{"Type": "http"}'
5.配置app服务
这环境,我们需要把我们之前搭建web app 的相关信息注册到我们的vulcand集群配置中:
$ etcdctl set /vulcand/backends/b1/servers/srv1 '{"URL": "http://192.168.139.140:8081"}'
$ etcdctl set /vulcand/backends/b1/servers/srv2 '{"URL": "http://192.168.139.140:8082"}'
$ etcdctl set /vulcand/backends/b1/servers/srv3 '{"URL": "http://192.168.139.140:8083"}'
6.配置 frontend
./etcdctl set /vulcand/frontends/f1/frontend '{"Type": "http", "BackendId": "b1", "Route": "Path(`/`)"}'
程序测试:
我们可以很直观地使用浏览器进行大量的请求,观察我们的请求是否都被负载分配到每个web应用上
或通过命令工具 curl http://localhost:8181
至此,一个简单的可运行的例子就搭建起来,当然vulcand的用法远不于这样,我们可以结合官方文档提供更复杂的功能。