@bergus
2016-03-21T20:51:21.000000Z
字数 1679
阅读 4402
consul
目前仅考虑开发环境
Consul是用go语言编写的,提供方便的服务注册与发现、全局配置等分布式系统所需要的核心功能。尤其非常适合当前微服务架构模式下的核心功能解决。
Consul是一个非常简单的应用,没有庞大的依赖体系,简单下载一个文件就能解决安装问题,下载路径为:下载Consul
理论上,分布式环境中的每台机器都应该作为一个Node加入Consul,其中至少3台节点(最好是5台)作为Server,其余节点都作为Client,建立部署环境的配置方法我在这里就不说了,可以自习研读官方文档。
开发阶段,执行如下命令就可以快速启动一个Consul环境,当然,也要求所有的微服务都跑在同一个虚拟机上:
consul agent -dev -bind 127.0.0.1 > ./consul.log 2>&1 &
在咱们的开发服务器上,我已经跑了一个consul的服务,大家可以直接用了,不用再次启动
注册微服务也非常简单,只需要通过curl命令调用consul提供的HTTP restful的接口就可以了,例如我启动account服务后,将服务的地址和端口号注册到consul中,命令如下:
curl -X PUT -d '{"Name":"account", "Port": 13010}' -i http://localhost:8500/v1/agent/service/register
发现微服务最好的方法是使用DNS,我推荐dns-clb-go来完成dns解析,如果有多个服务,这个包还可以做服务之间的选择,支持一些很简单的选择策略(如RoundRobin等)。
上面account注册服务后,采用account.service.dc1.consul
进行解析和发现,具体代码如下:
import (
"github.com/benschw/dns-clb-go/clb"
)
const (
consulHost = "127.0.0.1"
consulPort = "8600"
srvName = "account.service.dc1.consul"
)
...
func main() {
c := clb.NewClb(consulHost, consulPort, clb.RoundRobin) // 这两行是关键
address, err := c.GetAddress(srvName)
if err != nil {
log.Fatal(err)
}
transportFactory := thrift.NewTFramedTransportFactory(thrift.NewTTransportFactory())
protocolFactory := thrift.NewTBinaryProtocolFactoryDefault()
transport, err := thrift.NewTSocket(address.String()) // 这里的addess.String() 就是 "127.0.0.1:13010"
if err != nil {
log.Fatalf("error resolving %s : %s", address.String(), err)
}
useTransport := transportFactory.GetTransport(transport)
accountService = account.NewAccountServiceClientFactory(useTransport, protocolFactory)
if err := transport.Open(); err != nil {
log.Fatalf("error connecting to %s : %s", address.String(), err)
}
log.Infof("Connected to AccountService %s", address.String())
}
Consul还有一个重要作用,就是可以作为全局的key/value的存储,可用于全局配置,详细使用大家可以参考consul/api。