怎么看consul 删除服务上服务的日志

服务发现 - consul 的介绍、部署和使用 - CSDN博客
服务发现 - consul 的介绍、部署和使用
什么是服务发现
相关源码:
微服务的框架体系中,服务发现是不能不提的一个模块。我相信了解或者熟悉微服务的童鞋应该都知道它的重要性。这里我只是简单的提一下,毕竟这不是我们的重点。我们看下面的一幅图片:
图中,客户端的一个接口,需要调用服务A-N。客户端必须要知道所有服务的网络位置的,以往的做法是配置是配置文件中,或者有些配置在数据库中。这里就带出几个问题:
需要配置N个服务的网络位置,加大配置的复杂性
服务的网络位置变化,都需要改变每个调用者的配置
集群的情况下,难以做负载(反向代理的方式除外)
总结起来一句话:服务多了,配置很麻烦,问题多多
既然有这些问题,那么服务发现就是解决这些问题的。话说,怎么解决呢?我们再看一张图
与之前一张不同的是,加了个服务发现模块。图比较简单,这边文字描述下。服务A-N把当前自己的网络位置注册到服务发现模块(这里注册的意思就是告诉),服务发现就以K-V的方式记录下,K一般是服务名,V就是IP:PORT。服务发现模块定时的轮询查看这些服务能不能访问的了(这就是健康检查)。客户端在调用服务A-N的时候,就跑去服务发现模块问下它们的网络位置,然后再调用它们的服务。这样的方式是不是就可以解决上面的问题了呢?客户端完全不需要记录这些服务网络位置,客户端和服务端完全解耦!
这个过程大体是这样,当然服务发现模块没这么简单。里面包含的东西还很多。这样表述只是方便理解。
图中的服务发现模块基本上就是微服务架构中服务发现的作用了。
consul 简介
做服务发现的框架常用的有
这里就不比较哪个好哪个差了,需要的童鞋自己谷歌百度。
那么consul是啥?consul就是提供服务发现的工具。然后下面是简单的介绍:
consul是分布式的、高可用、横向扩展的。consul提供的一些关键特性:
service discovery:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas提供的也可以一样注册。
health checking:健康检测使consul可以快速的告警在集群中的操作。和服务发现的集成,可以防止服务转发到故障的服务上面。
key/value storage:一个用来存储动态配置的系统。提供简单的HTTP接口,可以在任何地方操作。
multi-datacenter:无需复杂的配置,即可支持任意数量的区域。
我们这里会介绍服务发现,健康检查,还有一些基本KV存储。多数据中心有机会另一篇文章再说。
总结:只要知道它是解决我上一部分提出的问题就行,其它的东西慢慢理解
consul的几个概念
上图是我从抠出来的。
我们只看数据中心1,可以看出consul的集群是由N个SERVER,加上M个CLIENT组成的。而不管是SERVER还是CLIENT,都是consul的一个节点,所有的服务都可以注册到这些节点上,正是通过这些节点实现服务注册信息的共享。除了这两个,还有一些小细节,一一简单介绍。
CLIENT表示consul的client模式,就是客户端模式。是consul节点的一种模式,这种模式下,所有注册到当前节点的服务会被转发到SERVER,本身是不持久化这些信息。
SERVER表示consul的server模式,表明这个consul是个server,这种模式下,功能和CLIENT都一样,唯一不同的是,它会把所有的信息持久化的本地,这样遇到故障,信息是可以被保留的。
SERVER-LEADER
中间那个SERVER下面有LEADER的字眼,表明这个SERVER是它们的老大,它和其它SERVER不一样的一点是,它需要负责同步注册的信息给其它的SERVER,同时也要负责各个节点的健康监测。
其它信息包括它们之间的通信方式,还有一些协议信息,算法。它们是用于保证节点之间的数据同步,实时性要求等等一系列集群问题的解决。这些有兴趣的自己看看。
consul 基本使用
自己就一台机子,所以这里就演示下docker下部署使用consul。容器与宿主机的端口映射忽略,正常生产环境每个宿主机一个consul,端口需要映射到宿主机
docker search consul
咱们用官方的镜像玩玩
docker pull consul
不指定tag就拉取last,当前版本是0.8.0
启动consul
启动节点1(server模式)
docker run -d -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' --name=node1 consul agent -server -bind=172.17.0.2
-bootstrap-expect=3 -node=node1
-node:节点的名称
-bind:绑定的一个地址,用于节点之间通信的地址,可以是内外网,必须是可以访问到的地址
-server:这个就是表示这个节点是个SERVER
-bootstrap-expect:这个就是表示期望提供的SERVER节点数目,数目一达到,它就会被激活,然后就是LEADER了
启动节点2-3(server模式)
docker run -d -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' --name=node2 consul agent -server -bind=172.17.0.3
-join=172.17.0.2 -node-id=$(uuidgen | awk '{print tolower($0)}')
-node=node2
docker run -d -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' --name=node3 consul agent -server -bind=172.17.0.4
-join=172.17.0.2 -node-id=$(uuidgen | awk '{print tolower($0)}')
-node=node3 -client=172.17.0.4
-join:这个表示启动的时候,要加入到哪个集群内,这里就是说要加入到节点1的集群
-node-id:这个貌似版本8才加入的,这里用这个来指定唯一的节点ID,可以查看这个
-client:这个表示注册或者查询等一系列客户端对它操作的IP,如果不指定这个IP,默认是127.0.0.1。
启动节点4(client模式)
docker run -d -e 'CONSUL_LOCAL_CONFIG={"leave_on_terminate": true}' --name=node4 consul agent -bind=172.17.0.5 -retry-join=172.17.0.2 -node-id=$(uuidgen | awk '{print tolower($0)}')
-node=node4
除了没有-server,其它都是一样的,没有这个就说明这个节点是CLIENT
查看下集群的状态
docker exec -t node1 consul members
4个节点都列出来了。Status表示它们的状态,都是alive。Type表示它们的类型,三个SERVER一个CLIENT,和我们之前启动的一样。DC表示数据中心,都是dc1。
节点异常consul的处理
LEADER 挂了
leader挂了,consul会重新选取出新的leader,只要超过一半的SERVER还活着,集群是可以正常工作的。node1是leader,所以把这个容器停了。
docker stop node1
看看其他节点的日志(node2):
日志打印,心跳检查node1的ip超时,接着开始选举。node2被选举为新的leader。我们查看下现在的leader:
curl http://172.17.0.4:8500/v1/status/leader
返回的内容:
"172.17.0.3:8300"
172.17.0.3 就是 node2节点的IP
部署完了,那么可以看看怎么用这个东东了。
注册个服务
使用HTTP API 注册个服务,使用[接口API]( API)调用
PUT 注册一个服务。request body:
"ID": "userServiceId",
"Name": "userService",
"primary",
"Address": "127.0.0.1",
"Port": 8000,
"EnableTagOverride": false,
"Check": {
"DeregisterCriticalServiceAfter": "90m",
"HTTP": "",
"Interval": "10s"
使用curl调用
curl http:
"ID": "userServiceId",
"Name": "userService",
"primary",
"Address": "127.0.0.1",
"Port": 8000,
"EnableTagOverride": false,
"Check": {
"DeregisterCriticalServiceAfter": "90m",
"HTTP": "",
"Interval": "10s"
OK,注册了一个服务
发现个服务
刚刚注册了名为userService的服务,我们现在发现(查询)下这个服务
curl http://172.17.0.4:8500/v1/catalog/service/userService
返回的响应:
"Address": "172.17.0.4",
"CreateIndex": 880,
"ID": "e6e9a8cb-c47e-4be9-b13e-a24a",
"ModifyIndex": 880,
"Node": "node3",
"NodeMeta": {},
"ServiceAddress": "127.0.0.1",
"ServiceEnableTagOverride": false,
"ServiceID": "userServiceId",
"ServiceName": "userService",
"ServicePort": 8000,
"ServiceTags": [
"primary",
"TaggedAddresses": {
"lan": "172.17.0.4",
"wan": "172.17.0.4"
内容有了吧,这个就是我们刚刚注册的服务的信息,就可以获取到
服务的名称是“userService”
服务地址是“127.0.0.1”
服务的端口是“8000”
设置一个值到user/config/connections 内容为5
docker exec -t node1 consul kv put user/config/connections 5
获取特定的值
docker exec -t node1 consul kv get -detailed user/config/connections
值的内容为5,还有key等相关的值
服务发现以及配置共享的简单样例展示了下,详细的使用还是需要看官方文档,这里只是列举了一些样例,用于理解和简单的使用consul。
Spring Cloud 结合consul使用
如果是使用spring cloud来使用consul,可以查看我的相关样例:
spring cloud 结合consul的使用,下一篇文章再进行描述吧
相关文档连接
CONSUL HTTP API:
CONSUL CLI:
CONSUL Health Checks:
本文已收录于以下专栏:
相关文章推荐
Consul的一个基本功能是提供系统级和应用级健康检查。如果健康检查与某个服务关联,则称为是应用级的;如果不予服务关联,则监控整个节点的健康。
check定义在配置文件中,或运行时通过HTTP接口添加...
DNS查询系统利用健康检查以防止不良节点路由信息。当服务查询时,如果服务健康检查失败或者系统检查失败,服务信息将会从查询结果中删除。为了实现简单的负载平衡,返回的节点集合每次都是随机的。这种机制使得利...
如果使用预定义的端口,服务越多,发生冲突的可能性越大,毕竟,不可能有两个服务监听同一个端口。管理一个拥挤的比方说被几百个服务所使用的所有端口的列表,本身就是一个挑战,添加到该列表后,这些服务需要的数据...
Consul 简化了分布式环境中的服务的注册和发现流程,通过 HTTP 或者 DNS 接口发现。支持外部 SaaS 提供者等。
consul提供的一些关键特性:
service discovery...
Consul是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件,由HashiCorp公司用Go语言开发,基于Mozilla Public License 2.0的协议进行开源。Consul...
转载地址:http://blog.csdn.net/mn960mn/article/details/
服务注册 - 服务进程在注册中心注册自己的位置。它通常注册自己的主机和端...
一、前言这是我第一篇博文,中间可能存在许多纰漏,所以请大家不吝指教!另外在文中API及原理性的东西仅做简单提及,因为网上有很多,讲的很详细,我尽量将篇幅放在记录过程上,如有疑惑,欢迎评论。1.1 搭建...
Consul 介绍
Consul 提供了分布式系统的服务发现和配置的解决方案。基于go语言实现。并且在git上开放了源码consul-git。consul还包括了分布式一致协议的实现,健康检查和管理...
Docker的使用中,尤为重要的是服务发现和docker的宿主机集群及跨主机overlay网络的搭建,这里来介绍下常用来配合使用的swarm+consul集群的搭建(此处全基于docker容器)
服务注册 - 服务进程在注册中心注册自己的位置。它通常注册自己的主机和端口号,有时还有身份验证信息,协议,版本号,以及运行环境的详细资料。
服务发现 - 客户端应用进程向注册中心发起查询,来获取服务的...
他的最新文章
讲师:宋宝华
讲师:何宇健
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)IBM Bluemix
点击按钮,开始云上的开发!
developerWorks 社区
Xavier Bruhiere高级软件设计师Xavier Bruhiere 是位于巴黎的 AppTurbo
的首席开发人员,他在该公司通过开发创新性的原型来支持公司的发展。他沉溺于学习、摆弄有趣的热门技术(包括软件和硬件)和参加高强度体育运动。在闲暇时,他与好友聚集在酒吧,策划创建新世界里的主导性创业公司。
当今的大多数大型云部署依赖于外部服务: 数据库缓存和第三方
API。在虚拟机属于暂时性组件的环境中,如何获得这些资源便会成为一种挑战。在本教程中,您将了解一款普适性解决方案如何将基础架构知识纳入到应用运行时之中。此外,您还将了解如何设计通用架构来监控复杂的服务器拓扑,提升微服务的统筹安排水平。“我的非侵入性服务发现解决方案为 DevOps
提供了一款基本工具。这种工具具有即时可执行性,不会使我们受限于框架。”背景&
当今的应用部署通常会大量涉及微服务。举例来说,您无需构建单一的整体应用,就可以将某款应用拆分为多个有机协作的单一功能单元。借助这种方式,您可以将问题化整为零并自由组合,进行免费的模块式开发。但这样的实现真的是免费吗?不一定。我们在如何统筹安排基础架构的所有组件的移动性方面,仍旧存在难题。 此外,容器引擎
的广泛采用,也会加大难度。尽管
解放了程序开发、装运和运行的流程,但是很多开发人员在考虑多主机部署或解决日志管理等老问题时,仍旧遭遇了瓶颈。挑战&目前,典型 Web
应用通常会涉及到复杂性各不相同的前台、后台和数据库,尤其会涉及到第三方服务。所有这些技术都通过网络通信,我们可以借助的事实依据是:后台一般部署在具有可用资源的地方,而出于性能考虑,数据库会分布于不同的节点上。与此同时,在处理负载时,集群内的整体设置也会不断变化。后台如何在这种不断变化的云拓扑中,找到数据库 URL?您需要设计一种流程,确保为应用提供最新的基础架构知识。Consul
GitHub 上, 被称为“一种用于服务发现、监控和配置的工具”。Consul 是由 Vagrant 的开发公司
HashiCorp 开发的开源项目之一。
它可以提供一个具有高可用性的分布式系统,用以注册服务、存储共享配置并保持多个数据中心的准确视图。此外,它作为一个简单的 Go
程序,因此不需要部署。为了便于清晰了解各个步骤(并与我们的话题保持一致),我们将使用 Docker。Docker 安装完成后,由于采用了统一架构(又称为),清单 1 中的单行命令足以引导启动 Consul
服务器。清单 1. 引导启动 Consul
服务器docker run --detach --name consul --hostname consul-server-1 progrium/consul
-server -bootstrap -ui-dir /ui
container ip for further interactions
CONSUL_IP=$(docker inspect -f '{{ .NetworkSettings.IPAddress }}' consul)
# The container also runs a web UI at $CONSUL_IP:8500/ui注:正式文档中建议您至少启动三台服务器来处理故障情况,但这些考虑事项已经超出了本指南的范围。现在,您可以查询您的基础架构,发现存在一种服务:Consul 本身(请参阅 清单 2)。清单 2. 发现 Consul
服务curl $CONSUL_IP:8500/v1/catalog/services
{"consul":[]}
# we can fetch more details about a specific service
curl $CONSUL_IP:8500/v1/catalog/service/consul
[{"Node":"consul-server-1","Address":"172.17.0.1","ServiceID":"consul",
"ServiceName":"consul","ServiceTags":[],"ServiceAddress":"",
"ServicePort":8300}]您如所见,Consul 存储了一些有关服务的重要事实信息。这些信息包括信息和标签,以及以编程方式访问远程服务所需的基本数据。声明式服务&下面让我们一起来了解下注册、外部服务及 Docker 在我们的解决方案中所扮演的角色。为了便于说明,我们首先想象一个在
中存储数据并通过
发送电子邮件的现代应用。后者是一种外部服务,我们会自行运行前者。阅读下文,了解如何处理这两种情况。注册&为了找到这些重要属性,首先需要注册服务。接下来,将会在集群的每个节点上运行一个 Consul 代理,负责连接 Consul
服务器,以便找到节点的服务并执行健康检查(请参阅 清单 3)。清单 3. 注册服务# download and install the latest version
wget /mitchellh/consul/0.5.2_linux_amd64.zip -O
/tmp/consul.zip
cd /usr/local/bin && unzip /tmp/consul.zip
# create state and configuration directories
mkdir -p {/srv/consul,/etc/consul.d}
# check that everything worked
consul --helpMongoDB 的下载量超过 1,000 万次,是文档数据库的理想之选。我们使用该服务并将以下文件保存在
/etc/consul.d/mongo.json(请参阅 清单 4)。清单 4. 使用 MongoDB
作为数据库{
"service":{
"name":"mongo",
"database",
"port":27017,
"name":"status",
"script":"mongo --eval 'printjson(rs.status())'",
"interval":"30s"
}上述语法提供了简明且可读性强的声明式方法,可供您定义服务属性及健康检查。您可以在版本控制系统中提取这些文件,并立即识别应用的组件。上述文件声明了端口
27017 上一个名为“mongo”的服务。 检查部分为 Consul
代理提供了一个脚本,可用于测试节点是否处于健康状态。在向服务器请求服务时,您需要确保服务器能返回可靠的终端设备。接下来就是启动实际的 Mongo 服务器及本地 Consul 代理(请参阅 清单 5)。清单 5. 启动 Mongo 服务器及本地 Consul
代理# launch mongodb server on default port 27017
# launch local agent
consul agent \
-join $CONSUL_HOST \
# explicitly provide how to reach the server
-data-dir /data/consul \
# internal state storage
-config-dir /etc/consul.d
# configuration directory where services and checks
# are expected to be defined是否有作用?让我们来查询 Consul HTTP API(请参阅 清单 6)。清单 6. 查询 Consul HTTP
API# fetch infrastructure overview
curl $CONSUL_IP:8500/v1/catalog/nodes
[{"Node":"consul-server-1","Address":"172.17.0.1"},{"Node":"mongo-1","Address"
:"172.17.0.2"}]
# consul correctly registered mongo service
curl $CONSUL_IP:8500/v1/catalog/service/mongo
"Node":"mongo-1",
"Address":"172.17.0.2",
"ServiceID":"mongo",
"ServiceName":"mongo",
"ServiceTags":["database", "no-sql"],
"ServiceAddress":"",
"ServicePort":27017
# it also exposes health state
curl $CONSUL_IP:8500/v1/health/service/mongo
"Node":"mongo-1",
"Service":{
"ID":"mongo",
"Service":"mongo",
"Tags":["database","no-sql"],
"Address":"",
"Checks":[{
"Node":"mongo-1",
"CheckID":"service:mongo",
"Name":"Service 'mongo' check",
"Status":"passing",
"Notes":"",
"Output":"MongoDB shell version:3.0.3\nconnecting to: test\n{ \"ok\" :0,
\"errmsg\" :\"not running with --replSet\", \"code\" :76 }\n",
"ServiceID":"mongo",
"ServiceName":"mongo"
"Node":"mongo-1",
"CheckID":"serfHealth",
"Status":"passing",
"Notes":"",
"Output":"Agent alive and reachable",
"ServiceID":"",
"ServiceName":""
}]在给定 Consul 代理或服务器地址的情况下,能够处理 HTTP 请求的集群中的任何代码均可使用该信息。
下面我将会处理过程做简要说明,但首先让我们来了解一下如何注册超出控制访问的服务,以及如何借助 Docker
实现自动化。外部服务&
为了避免做无用功,将第三方服务集成到应用中是比较明智的方法。但在这种情况下,您不能再适当的节点上启动
Consul 代理。Consul 会再次将您覆盖在内(请参阅 清单 7)。清单 7. 查询 Consul HTTP
API# manually register mailgun service through the HTTP API
curl -X PUT -d \
'{"Datacenter":"dc1", "Node":"mailgun", "Address":"",
"Service":{"Service":"email", "Port":80}, "Check":{"Name":"mailgun api",
"http":"www.", "interval":"360s", "timeout":"1s"}}' \
http://$CONSUL_IP:8500/v1/catalog/register
# looks like we're all good !
curl $CONSUL_IP:8500/v1/catalog/services
{"consul":[],"email":[],"mongo":["database","nosql"]}由于 Mailgun 是一个 Web 服务,因此使用 HTTP 字段来检查 API 的可用性。若要深入了解 Consul
的强大功能,请参阅综合性说明文档。Docker
集成&到目前为止,Go 二进制库、单个 JSON 文件以及一些 HTTP
请求均支持服务发现工作流。您当然无需束缚于某种特定技术,但正如前面所说,这种灵活的设置特别适合于微服务。在这种情况下,借助 Docker,可以将服务打包至可复写的自注册容器中。在现有的 mongo.json 中,仅使用 清单 8 中的 Dockerfile 和 Procfile。清单 8. 将服务打包到可复写的自注册容器中# Dockerfile
# start from official mongo image
FROM mongo:3.0
RUN apt-get update && apt-get install -y unzip
# install consul agent
ADD /mitchellh/consul/0.5.2_linux_amd64.zip /tmp/consul.zip
RUN cd /bin && \
unzip /tmp/consul.zip&& \
chmod +x /bin/consul && \
mkdir -p {/data/consul,/etc/consul.d} && \
rm /tmp/consul.zip
# copy service and check definition, as we wrote them earlier
ADD mongo.json /etc/consul.d/mongo.json
# Install goreman - foreman clone written in Go language
ADD /mattn/goreman/releases/download/v0.0.6
/goreman_linux_amd64.tar.gz /tmp/goreman.tar.gz
RUN tar -xvzf /tmp/goreman.tar.gz -C /usr/local/bin --strip-components 1 && \
/tmp/goreman*
# copy startup script
ADD Procfile /root/Procfile
# launch both mongo server and consul agent
ENTRYPOINT ["goreman"]
CMD ["-f", "/root/Procfile", "start"]Dockerfile 用于定义在启动容器时运行的单个命令。 不过,我们需要同时运行 MongoDB 和 Consul. 我们可以通过
Goreman 实现这一点。它能够读取名为 Procfile
的配置文件,用以定义多个管理流程(生命周期、环境、日志等)。在容器领域,这种方法是一个悖论,而且其他解决方案也存在,但现在我们可以通过更简单的方式做到这一点。清单 9. Procfile# Procfile
database: mongod
consul: consul agent -join $CONSUL_HOST -data-dir /data/consul -config-dir
/etc/consul.d清单 10. 构建容器的外壳命令ls
Dockerfile
mongo.json
docker build -t article/mongo .
docker run --detach --name docker-mongo \
--hostname docker-mongo-2 \
# if not explicitly configured, consul agent
set its name to the node hostname
--env CONSUL_HOST=$CONSUL_IP article/mongo
curl $CONSUL_IP:8500/v1/catalog/nodes
"Node":"consul-server-1",
"Address":"172.17.0.1"
"Node":"docker-mongo-2",
"Address":"172.17.0.3"
"Node":"mailgun",
"Address":""
"Node":"mongo-1",
"Address":"172.17.0.2"
]太棒了!将 Docker 结合到服务发现流程中,效果非常好!我们可以按照 清单 6 中所述查询
$CONSUL_IP:8500/v1/catalog/service/mongo,找到服务端口,从而获得更多详情。Consul
可以提供容器 IP,以此作为服务地址。即便 Docker
将其映射到主机上一个随机值上,只要是容器提供端口,该方法都适用。不过,在多主机拓扑中,您需要明确地将容器的端口映射到主机的相同端口上。为了避免这一限制,我们可以考虑采用
。总的来说,在提供多个数据中心的服务信息时,大致步骤如下:至少启动 1 个 Consul 服务器,并存储其地址。在每个节点上:下载 Consul 二进制库。写入服务并检查其在 Consul 配置目录中的定义。启动应用。使用另一代理或服务器的地址启动 Consul 代理。创建基础架构感知应用&现在,您已经构建了一个简便的非侵入式工作流,用来部署和注册新服务。下一步是将这些知识导出到依赖性应用之中。Twelve-Factor App 是一种构建软件即服务应用的方法,适用于在环境中的存储配置。维持配置与不断变化的代码的严格分离。避免在资料库中签入(check in)敏感信息。确保语言和操作系统不可知。现在,我们需要编写一个打包程序,用以查询 Consul 终端设备是否能够提供服务,并将其连接属性导出到环境中,然后执行给定的命令。选择 Go
语言,不仅可为您提供一个潜在的交叉平台二进制库(如同其他工具),还可以使您访问正式客户端的 API(请参阅 清单 11)。清单 11. 将服务打包到可复写的自注册容器中package main
"/hashicorp/consul/api"
// critical quits on errors with a debug message
func critical(err error) {
if err != nil {
log.Printf("error:%v", err)
os.Exit(1)
// inject exports properties into runtime environment
func inject(properties map[string]string) []string {
// read current process environment
processEnv := os.Environ()
// allocate and copy it
env := make([]string, len(processEnv), len(properties) + len(processEnv))
copy(env, processEnv)
for k, v := range properties {
// format key/value mapping mand and system style (i.e. KEY=VALUE)
env = append(env, fmt.Sprintf("%s=%s", k, v))
return env
// discoverServices queries Consul for services data
func discoverServices(addr string, healthyOnly bool) map[string]string {
servicesEnv := make(map[string]string)
// initialize consul api client
consulConf := api.DefaultConfig()
consulConf.Address = addr
client, err := api.NewClient(consulConf)
critical(err)
// retrieve full list of services throughout our infrastructure
services, _, err := client.Catalog().Services(&api.QueryOptions{})
critical(err)
for name, _ := range services {
// query healthy services information
servicesData, _, err := client.Health().Service(name, "", healthyOnly,
&api.QueryOptions{})
critical(err)
// loop over this category of service
for _, entry := range servicesData {
// store connection information like environment variables :{"MONGO_HOST":
"172.17.0.5"}
id := strings.ToUpper(entry.Service.ID)
servicesEnv[id + "_HOST"] = entry.Node.Address
servicesEnv[id + "_PORT"] = strconv.Itoa(entry.Service.Port)
return servicesEnv
func main() {
flag.Parse()
// keep it consistent and read consul service address from environment
consulAddress = os.Getenv("CONSUL")
command = flag.Args()
log.Printf("inspecting infrastructure")
services := discoverServices(consulAddress, true)
env := inject(services)
log.Printf("running `%s`", strings.Join(command, " "))
cmd := mand(command[0], command[1:]...)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.Env = env
critical(cmd.Start())
critical(cmd.Wait())
}在 清单 12 中,下一个命令是编译该原型并验证其行为。清单 12. 编译并验证原型# install the single dependency
go /hashicorp/consul
# compile to `wrapper` (depends on your directory name)
go build ./...
export CONSUL=$CONSUL_IP:8500
./wrapper env在其他变量中,最后一个命令应打印为 MONGO_PORT=27017。此时,任何命令均应能够从其环境中读取服务数据。动态地重新配置基础架构&
目前您可能遇到的一种情况是实施方面的挑战。Web 应用可能会象上述的那样启动,并成功连接到
MongoDB,但在数据库出现故障或迁移时,仍旧会出现意外。当基础架构出现正常或非预期变更时,我们希望能够以动态的方式更新应用知识。尽管针对这个问题设计一款健全的解决方案可能需要单独的教程,但
采用了一种非常有趣的方法。Consul Template 会查询 Consul 实例并更新文件系统上指定模板的数量。此外,当某个模板更新完成时,Consul Template
还可执行任意命令。 因此,您可以使用 Consul Template
来监控服务(地址和健康状态),一旦检测到变更,便会自动重启应用。由于打包程序会获取服务数据,因此运行时环境将会映射基础架构的正确状态(请参阅
清单 13)。清单 13. 使用 Consul Template
监控服务并重启应用consul-template \
-consul $CONSUL \
# Avoid re-running multiple times on changes
-template "app.ctmpl:/tmp/app.conf:./wrapper env"现在,您已经了解了模板化配置文件的所有优势。清单 14 是来自于 GitHub 上的
的一个示例。清单 14. 模板化配置文件示例// app.ctmpl
// store third-party service information in the environment
db:'mongodb://'+ process.env.MONGO_HOST + ':'+ process.env.MONGO_PORT + '/test',
// or you can leverage consul-template built-in service discovery
{{ range service "mongo" }}
db2:'mongodb://{{ .Address }}:{{ .Port }}/test',
// Use consul-template to fetch information from consul kv store
// curl -X PUT "http://$CONSUL/v1/kv/hackathon/mailgun_user" -d "xavier"
user:'{{ key "hackathon/mailgun_user" }}',
password:'{{ key "hackathon/mailgun_password" }}'
}这种体验需要更多的考虑。可能具有一些策略性,例如通过重启应用来更新服务知识。我们可以通过发送特定信息,使其能够轻松地处理变更。
不过,这要求我们进入到应用代码库中;到现在为止,我们无需了解任何知识便可实现这一点。此外,随着不可靠云服务提供商推出了越来越多的微服务,这更有利于我们运行无状态的容错应用。无论如何,强大的工具连同清晰的服务契约,有助于您将分布式应用集成到复杂的基础架构中,而不会使您局限于某个特定提供商或应用堆栈。结论&服务发现以及更广泛的服务统筹安排,是目前开发过程中最重要的挑战之一。资深开发人员以及开发人员社区,都正在迈入并推动着技术与理念时代的发展。举例来说,IBM Bluemix™ 能够通过工作负载规划、智能数据库、监控、成本管理、数据同步、REST、API
等诸多功能应对这一挑战。唯有通过丰富的工具,才能使开发人员更加专注于这些应用中松散连接的模块。借助于 Consul 和 Go,您便可朝着这个方向迈出一大步,并构建具有以下功能的系列服务:自注册自更新堆栈不可知普适型部署容器友好性
本教程介绍了生产部署的基本知识,并展示了如何采用即插即用式方法进行服务发现,释放您的精力,使您能够更多地思考当前部署流程中的其他环节,同时也免去了所有的常规限制。
后续步骤可能包括:通过加密扩展打包程序、提供统一的集成,以便安全地提供服务令牌等证书。我希望本教程能够帮助您轻松应对超敏捷云部署过程中所遇到的挑战。
注意:评论中不支持 HTML 语法
剩余 1000 字符
developerWorks: 登录
标有星(*)号的字段是必填字段。
保持登录。
单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件。
在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。
所有提交的信息确保安全。
选择您的昵称
当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。昵称长度在 3 至 31 个字符之间。
您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。
标有星(*)号的字段是必填字段。
(昵称长度在 3 至 31 个字符之间)
单击提交则表示您同意developerWorks 的条款和条件。 .
所有提交的信息确保安全。
static.content.url=/developerworks/js/artrating/SITE_ID=10Zone=Cloud computingArticleID=1020244ArticleTitle=借助 Consul 和 Docker 支持即插即用的服务发现 (service discovery)publish-date=}

我要回帖

更多关于 微服务 consul 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信