专栏首页架构进阶微服务注册中心:Consul——概念与基础操作
原创

微服务注册中心:Consul——概念与基础操作

系列文章:

微服务架构:网关概念与 zuul

微服务网关:Spring Cloud Gateway —— Zuul

微服务网关:Spring Cloud Config- 配置中心

微服务网关方案:Kong & Nacos

Nacos 实践

微服务网关:Nacos 源码实践(二)

公众号:程序员架构进阶

楔子

好久不见。由于工作的原因停更了一段时间,今天开始继续更新。前面介绍过微服务相关的一些技术方案,注册中心除了 Zookeeper、Nacos 之外,其实 Consul 也可以,只不过使用比例上看并不算高。最近发现某大厂的一个部门中有对 Consul 的使用,正好借机做一次了解。

一 简介

1.1 官网

consul(Consul 的官网地址:https://www.consul.io/)是 google 开源的一个使用 go 语言开发的服务发现、配置管理中心服务。内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等)。服务部署简单,只有一个可运行的二进制的包。每个节点都需要运行 agent,有 server 和 client 两种运行模式。每个数据中心官方建议需要 3 或 5 个 server 节点以保证数据安全,同时保证 server-leader 的选举能够正确的进行。

1.2 Consul VS Eureka

在官方的方案对比文档中,列举了 Consul 与 ZooKeeper/doozerd/etcd,Eureka,Istio 等方案的对比。由于使用的技术栈是 Java,Spring Cloud 体系中最常用的就是 Eureka,所以这里只分析 Consul vc Eureka 的一些对比。

1.2.1 Eureka

Eureka 是一个服务发现工具,体现在 client/server 架构上,每个数据服务节点都是一个 Eureka 服务器,一般来说每个可用区域有一个。(PS:Eureka 的数据分布在多个数据节点中,这也是 Eureka 在接下来需要面临的数据复制 TTL 问题)举一个典型的例子:EurekaClient 使用了嵌入 SDK 的方式去注册和发现服务。对于客户端没有一个强一致的控制力,比如 Eureka 的服务发现用的是 Ribbon。

1.2.2 Eureka 的弱一致问题

Eureka 提供了一个弱一致服务视图,因为 Eureka 集群的每个数据服务节点都是一个 Eureka 服务器,导致它需要尽最大努力去复制这些,来尽可能解决一致性问题。当一个 Client 注册到 Server 时,Server 会尝试把这个一个服务复制到其他的服务上,但并不保证此次操作的可靠性。服务注册有一个短的 TTL,需要客户端和服务器保持心跳,不健康的服务或节点将会被服务器 KILL 掉,造成超时或被从注册中心移除。服务发现的请求将会被路由至其他服务,由于这种尽力的复制,可能会导致服务过期或数据丢失的问题。正是这种简易模型,以至于更加适用于简单的集群管理和他的高扩展性。

1.2.3 Consul 的功能

        Consul 提供了一些更加丰富的功能,包含了丰富的健康度检查,KV 存储(PS:想到了 WOT 的咪咪 5#滑稽),和多数据中心预知。Consul 需要在每个数据中心都有一套服务,每个客户端都有一个代理,这一点和 Ribbon 相似。Consul 的代理在大部分应用中和 Consul 没有太大关系。服务注册经过配置文件,DNS 发现,或负载均衡来实现。

1.2.4 Consul 优势

        Consul 提供了强一致保证,是因为服务复制使用了 Raft 协议(Raft 协议可以看我后续的文章)。Consul 支持一套丰富的监看检查,包含 TCP/HTTP/Nagios/Sensu 的兼容脚本,或者像 Eureka 的 TTL 一样。客户端阶段参与了一些不太重要的健康度检查,比如分配了一些健康度检查的工作,和 Eureka 的集中式心跳不同,分布式心跳将对服务注册/发现带来更强的伸缩性和扩展性。服务发现请求会被路由到已被确定的 Consul 中,这样可以在默认情况下具有强一致性。同样也允许已被过时版本的客户端处理其服务,从而保证像 Eureka 一样线性和可伸缩性的工作。

        Consul 的强一致性意味着它可以用来作为服务选举和集群服务协调时的服务控制(PS:像 ZK 一样用来做一致性处理的)。Eureka 没有相似的功能,如果需要进行协调或具有更强一致性需求服务的话需要使用 ZK 来达到。

二 Mac 下的安装使用

2.1 brew 安装命令

由于有万能的 brew,所以安装比较简单,执行下面的两条命令即可:

brew tap hashicorp/tap
brew install hashicorp/tap/consul

安装时有一些输出信息,重点看使用部分:

xxx common % brew install hashicorp/tap/consul
==> Installing consul from hashicorp/tap
==> Downloading https://releases.hashicorp.com/consul/1.9.5/consul_1.9.5_darwin_amd64.zip
######################################################################## 100.0%
==> Caveats
The darwin_arm64 architecture is not supported for this product
at this time, however we do plan to support this in the future. The
darwin_amd64 binary has been installed and may work in
compatibility mode, but it is not fully supported.

To have launchd start hashicorp/tap/consul now and restart at login:
  brew services start hashicorp/tap/consul
Or, if you don't want/need a background service you can just run:
  consul agent -dev -bind 127.0.0.1
==> Summary
🍺  /opt/homebrew/Cellar/consul/1.9.5: 4 files, 107MB, built in 3 seconds

2.2 启动 Consul

输出信息中给出了启动方式,采用 brew services start hashicorp/tap/consul 启动:

common % brew services start hashicorp/tap/consul
==> Successfully started `consul` (label: homebrew.mxcl.consul)

启动完毕。

2.3 验证

控制台 执行 consul:

common % consul
Usage: consul [--version] [--help] <command> [<args>]

Available commands are:
    acl            Interact with Consul's ACLs

三 基础操作

可以参考 Consul 官方的quick start手册

consul 的通用启动命令是 consul agent -dev。 由于上面已经通过 brew services 启动完毕,所以这里不必再次执行。不过尝试执行报错,也可以看到 consul 的默认端口(8300)。

3.1 发现数据中心成员

consul member 命令:

可见输出的是 agent 及 agent 的 ip 地址(&端口),健康状态(正常是 alive),类型等等。

使用 consul members -detailed 可以查看更详细的信息:

Node                           Address         Status  Tags
xxx-Pro.local  127.0.0.1:8301  alive   acls=0,build=1.9.5:3c1c2267,dc=dc1,ft_fs=1,ft_si=1,id=f47cfd55-f256-4b1e-4a42-984501993b85,port=8300,raft_vsn=3,role=consul,segment=<all>,vsn=2,vsn_max=3,vsn_min=2,wan_join_port=8302

3.2 HTTP API

除了 8300,Consul 还占用了 8500 端口,作为 HTTP 的 API。通过下面命令获取 API 信息:

curl localhost:8500/v1/catalog/nodes

输出如下:

[
    {
        "ID": "f47cfd55-f256-4b1e-4a42-984501993b85",
        "Node": "xxx-Pro.local",
        "Address": "127.0.0.1",
        "Datacenter": "dc1",
        "TaggedAddresses": {
            "lan": "127.0.0.1",
            "lan_ipv4": "127.0.0.1",
            "wan": "127.0.0.1",
            "wan_ipv4": "127.0.0.1"
        },
        "Meta": {
            "consul-network-segment": ""
        },
        "CreateIndex": 11,
        "ModifyIndex": 12
    }
]

3.3 DNS 接口

除了 HTTP API,Consul 还提供了 DNS 接口来发现节点,Consul agent 的 DNS Server 启动于 8600 端口。通过 dig 命令查询方式如下:

dig @127.0.0.1 -p 8600 Judiths-MBP.node.consul

; <<>> DiG 9.10.6 <<>> @127.0.0.1 -p 8600 Judiths-MBP.node.consul
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 42102
;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;Judiths-MBP.node.consul.	IN	A

;; AUTHORITY SECTION:
consul.			0	IN	SOA	ns.consul. hostmaster.consul. 1621941931 3600 600 86400 0

;; Query time: 18 msec
;; SERVER: 127.0.0.1#8600(127.0.0.1)
;; WHEN: Tue May 25 19:25:31 CST 2021
;; MSG SIZE  rcvd: 102

8600 端口详情:

common % lsof -i:8600
COMMAND   PID       USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
consul  98048 xxx   14u  IPv4 0xba7147981abf21ab      0t0  TCP localhost:asterix (LISTEN)
consul  98048 xxx   15u  IPv4 0xba71479806ef4c6b      0t0  UDP *:asterix

3.4 停止 agent

命令:consul leave,优雅退出。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 微服务注册中心:Consul——服务注册

    微服务注册中心:Consul——概念与基础操作介绍了consul的安装和基本操作,本篇开始在consul上进行服务注册与发现,语言使用Java,框架使用Spri...

    程序员架构进阶
  • 微服务注册中心:Consul——服务发现

    说完了Consul的服务注册,那么就该到服务发现了。大家有过rpc框架使用经验的,例如nacos、eureka、dubbo等,就会了解服务中的角色,也就是生产者...

    程序员架构进阶
  • 微服务技术栈:常见注册中心组件,对比分析

    在分布式架构的系统中注册中心这个概念就已经被提出了,最经典的就是Zookeeper中间件。

    知了一笑
  • ASP.NET Core微服务框架Ocelot+Consul+IdentityServer4实战演练

    ASP.NET Core微服务框架Ocelot+Consul+IdentityServer4实战演练

    跟着阿笨一起玩NET
  • .Net微服务实战之负载均衡(下)

    相关源码:https://github.com/SkyChenSky/Sikiro

    陈珙
  • springcloud学习手册-什么是springcloud?

    导读 | springcloud 概念 springboot框架。 了解springcloud前先简单了解一下springboot框架。 springboot是...

    程序源代码
  • 【Spring Cloud 系列】一、Spring Cloud 入门前章:初识Spring Cloud

    Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线...

    爱鼓捣的程序猿
  • 基于SpringCloud的微服务架构演变史?

    在公司业务初创时期,面对的主要问题是如何将一个想法变成实际的软件实现,在这个时候整个软件系统的架构并没有搞得那么复杂,为了快速迭代,整个软件系统就是由“App...

    用户5927304
  • 基于SpringCloud的微服务架构演变史?

    在公司业务初创时期,面对的主要问题是如何将一个想法变成实际的软件实现,在这个时候整个软件系统的架构并没有搞得那么复杂,为了快速迭代,整个软件系统就是由“App...

    纯洁的微笑

扫码关注云+社区

领取腾讯云代金券