Consul的Agent Caching缓存代理

Posted talk.push

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Consul的Agent Caching缓存代理相关的知识,希望对你有一定的参考价值。

Consul Agent Caching


注册中心是微服务架构中非常重要的一个组成部分,注册中心的高可用直接关系到整个微服务架构的可用性,是系统稳定的重要保障,这篇主要是回答关于consul作为注册中心时,consul集群宕掉时如何做到服务发现的。

安装docker-consul


#启动第1个Server节点,集群要求要有3个Server,将容器8500端口映射到主机8900端口,同时开启管理界面
docker run -d --name=consul1  -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --bootstrap-expect=3 --client=0.0.0.0 


#启动第2个Server节点,并加入集群
docker run -d --name=consul2 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --client=0.0.0.0 --join 172.17.0.5

#启动第3个Server节点,并加入集群
docker run -d --name=consul3 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --client=0.0.0.0 --join 172.17.0.5

#启动第4个Client节点,并加入集群
docker run -d --name=consul4 -p 8900:8500  -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=false --client=0.0.0.0 --join 172.17.0.5 -ui


一般第一个容器启动之后ip地址是172.17.0.5.然后启动第2(server)、3(server)、4(client)个节点.第四个节点是我们应用程序连接client agent,指定8500端口的主机端口映射:8900.并开启UI界面。


然后可以看到consul的三个server实例。

在docker的可视化界面中也可以看到我们安装的四个节点:

验证Agent Caching

agent提供了两种方式的代理缓存,simple和background refresh caching,详细参考:https://www.consul.io/api/features/caching#background-refresh-caching。当consul server节点不可用的时候,为了让我们的服务可以正常的进行服务发现,consul提供了这两种模式的缓存支持。并不是所有的consul http API都支持Agent Caching,详情参考官方文档说明。接下来我们验证下当consul集群都宕掉的情况下,是不是可以从Client Agent拿到服务节点信息呢?

停止consul server

只保留我们的client agent.

请求服务发现接口


从官方文档可以看到服务发现的接口是:

而它默认就支持background refresh类型的Agent Caching.详情请参考:https://www.consul.io/api-docs/health#list-nodes-for-service

仔细看调用的接口,会发现后边有一个?cached的后缀,正是有了这个后缀告知Client Agent是要从缓存中获取服务列表。缓存之后的后续请求在3天之内都可以命中缓存。除非3天内没有任何请求到来才会失效。
没有这?cached参数,会访问不到服务列表:

报错信息是:rpc error making call: No cluster leader!
这是因为集群的三个Server节点我杀死了2个,导致无法选举出leader来,那么再启动一个Server就可以了,可以自己验证下。但是这时没加?cached是不会走缓存的,agent还是请求到了server去。

Consul的Blocking Query

点击请求之后,发现请求阻塞住了,这是consul的Blocking Query机制,详细细节可以参考:https://www.consul.io/api-docs/features/blocking。这里主要说下概要,许多的consul http api都支持这个特性,如下图所示给API后缀加上一个index=xxx的参数,当发起请求时,只要这个参数值大于等于上次请求响应头里的X-Consul-Index这个Header的值,就会触发"blocking queries"。其实本质就是一个长轮询(long polling)。按照官方文档说法,X-Consul-Index是代表了请求资源的当前状态的唯一标识符。

以上是关于Consul的Agent Caching缓存代理的主要内容,如果未能解决你的问题,请参考以下文章

consul-agent

consul服务注册与发现应用实战

Consul使用指南

Consul的应用

Prometheus-Consul-Api

Consul:ANTI-ENTROPY