服务发现与注册-Consul

426 阅读5分钟

Consul是什么?

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

Consul是HashiCorp公司推出的开源工具,Consul由Go语言开发,部署起来非常容易,只需要极少的可执行程序和配置文件,具有绿色、轻量级的特点。Consul分布式的、高可用的、 可横向扩展的用于实现分布式系统的服务发现与配置

特点

  1. 服务发现(Service Discovery)🌟重点

Consul提供了通过DNS或者HTTP接口的方式来注册服务和发现服务。一些外部的服务通过Consul很容易的找到它所依赖的服务。

  1. 健康检查(Health Checking):🌟

Consul的Client可以提供任意数量的健康检查,既可以与给定的服务相关联(“webserver是否返回200 OK”),也可以与本地节点相关联(“内存利用率是否低于90%”)。操作员可以使用这些信息来监视集群的健康状况,服务发现组件可以使用这些信息将流量从不健康的主机路由出去。

  1. Key/Value存储:

应用程序可以根据自己的需要使用Consul提供的Key/Value存储。 Consul提供了简单易用的HTTP接口,结合其他工具可以实现动态配置、功能标记、领袖选举等等功能。

  1. 安全服务通信:

Consul可以为服务生成和分发TLS证书,以建立相互的TLS连接。意图可用于定义允许哪些服务通信。服务分割可以很容易地进行管理,其目的是可以实时更改的,而不是使用复杂的网络拓扑和静态防火墙规则。

  1. 多数据中心:

Consul支持开箱即用的多数据中心. 这意味着用户不需要担心需要建立额外的抽象层让业务扩展到多个区域。

结构图

image-20220406172724352

我们可以看到有两个数据中心,Consul拥有对多个数据中心的支持。

在每个数据中心中,我们都有客户机和服务器。预计将有三到五台服务器。这在故障情况下的可用性和性能之间取得了平衡,因为随着添加更多的机器,一致性会逐渐变慢。但是,客户端的数量没有限制,可以很容易地扩展到数千或数万。 Consul 实现多个数据中心都依赖于gossip protocol协议。这样做有几个目的:首先,不需要使用服务器的地址来配置客户端;服务发现是自动完成的。其次,健康检查故障的工作不是放在服务器上,而是分布式的。这使得故障检测比单纯的心跳模式更具可伸缩性。为节点提供故障检测;如果无法访问代理,则节点可能经历了故障。

Consul的使用场景

  • 服务发现场景中consul作为注册中心,服务地址被注册到consul中以后,可以使用consul提供的dns、http接口查询,consul支持health check
  • 服务隔离场景中consul支持以服务为单位设置访问策略,能同时支持经典的平台和新兴的平台,支持tls证书分发,service-to-service加密。
  • 服务配置场景中consul提供key-value数据存储功能,并且能将变动迅速地通知出去,借助Consul可以实现配置共享,需要读取配置的服务可以从Consul中读取到准确的配置信息。

我在项目中使用了Consul作为服务发现与注册,轻量级容易上手,至于配置隔离这一块我采用了Nacos,它相比Consul在配置的隔离权限控制上更为精准。服务隔离可以使生产环境和测试环境等进行隔离!

Consul的安装与使用

$ docker pull consul:1.4.4

image-20220406174326235

然后镜像仓库里就有Consul了,启动它

image-20220406174550906

我设置了8089端口,接下里启动好了,访问它!

命令启动

./consul agent -server -bootstrap-expect 1 -data-dir=/tmp/consul -node=n1 -bind=127.0.0.1 -client=0.0.0.0 -ui
  • server: 以server身份启动。默认是client
  • bootstrap-expect:集群要求的最少server数量,当低于这个数量,集群即失效。
  • data-dir:data存放的目录,更多信息请参阅consul数据同步机制
  • node:节点id,集群中的每个node必须有一个唯一的名称。默认情况下,Consul使用机器的hostname
  • bind:监听的ip地址。默认绑定0.0.0.0,可以不指定。表示Consul监听的地址,而且它必须能够被集群中的其他节点访问。Consul默认会监听第一个private IP,但最好还是提供一个。生产设备上的服务器通常有好几个网卡,所以指定一个不会出错
  • client: 客户端的ip地址,0.0.0.0是指谁都可以访问(不加这个,下面的ui :8500无法访问)
  • ui: 可以访问UI界面
  • -config-dir指定配置文件夹,Consul会加载其中的所有文件
  • -datacenter 指定数据中心名称,默认是dc1

也可以直接启动docker-desktop的镜像,默认端口8500

image-20220406175441365

启动成功去访问:http://127.0.0.1:8500/ui/dc1/services

发现了启动了一个服务也就是我们的注册中心Consul,启动成功!

image-20220406175522045

Services: 在这个页面中可以看到注册了的所有服务的信息,这些信息包括服务的健康状况、标签、类型和源

点击服务名称即可看到服务的详细信息,比如相应实例的信息以及健康状况:

image-20220406175729430

Key\Value: 可以控制配置随时添加和删除!

image-20220406175926426

总结

通过Consul提供的web UI,Consul主要可以提供如下图形化界面操作功能

功能页面名称  web UI提供的功能说明
Services    查询(R)
Nodes       查询(R)
Key/Value   增删改查(CRUD)
Intentions  增删改查(CRUD)
ACLs        增删改查(CRUD)