7 17
Vulcand使用实践

背景

最近一直想通过Etcd的集群配置能力去构建一个应用动态负载均衡的项目,一开始想到的是使用目前广泛使用的Confd+Etcd的方案。 在学习实践中发现复杂度一点都不低,如果初学者想通过Etcd去做一些工具,我感觉不够简单。

后来,我在etcd的官网了解了一个同样基于Etcd的开源工具 Vulcand 。作为一个专用的工具,它的使用比Confd更加简单。

进步一说,Vulcand还能为我们的服务提供零停机的web更新。

Vulcand 是什么

想详细了解可以进入官方项目页面 : github.com/vulcand/vulcand

Vulcand 是一个专门为HTTP API管理与微服务而开发的 反向代理 服务, 它底层基于 Netflix 的 Hystrix

它的功能特性分别为:

  • 使用Etcd作为配置后端
  • 提供API和命令行的交互方式
  • 支持插件式的中间件服务
  • 支持实时监控和弹性部署

功能架构如下图:

nsq

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

nsq

nsq

nsq

至此,一个简单的可运行的例子就搭建起来,当然vulcand的用法远不于这样,我们可以结合官方文档提供更复杂的功能。