@bergus
2016-03-21T12:51:21.000000Z
字数 1679
阅读 4578
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。
