Consul入门|服务发现、服务注册与查询

2,960 阅读4分钟

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

引言

Consul是google开源的一个使用go语言开发的服务发现、配置管理中心服务,Consul属于微服务架构的基础设置中用于发现和配置服务的一个工具。

本文介绍了Consul服务发现的原理以及服务注册与查询的过程。希望本文能让你对Consul在微服务架构中的作用有一个整体的认识。

1、Consul服务发现原理

使用以下案例进行Consul服务发现原理的讲解,如图所示:

Consul服务发现原理

1、部署集群。首先需要有一个正常的Consul集群,有Server,有Leader。这里在服务器Server1、Server2、Server3上分别部署了Consul Server。

2、选举Leader节点。假设他们选举了Server2上的 Consul Server 节点为Leader。这些服务器上最好只部署Consul程序,以尽量维护Consul Server的稳定。

3、注册服务。然后在服务器Server4和Server5上通过Consul Client分别注册Service A、B、C,这里每个Service 分别部署在了两个服务器上,这样可以避免Service的单点问题。服务注册到Consul可以通过 HTTP API(8500 端口)的方式,也可以通过 Consul 配置文件的方式。

4、Consul client转发注册消息。Consul Client 可以认为是无状态的,它将注册信息通过RPC转发到Consul Server,服务信息保存在Server的各个节点中,并且通过Raft实现了强一致性。

5、服务发起通信请求。最后在服务器Server6中Program D需要访问Service B,这时候Program D首先访问本机Consul Client提供的HTTP API,本机Client会将请求转发到 Consul Server。

6、Consul Server查询到Service B当前的信息返回,最终Program D拿到了Service B的所有部署的IP和端口,然后就可以选择Service B的其中一个部署并向其发起请求了。

2、定义一个服务

服务的定义通过一个.json的json文件来进行定义,该文件中使用json格式定义所要注册服务的相关内容,以下为服务的json格式示例:

{
  "service": {
    "id": "firstservice",
    "name": "firstservice",
    "tags": ["dev"],
    "port": 80,
  }
}

3、服务注册

3.1、创建服务文件所存放的文件夹

sudo mkdir /etc/consul.d

说明:.d做后缀,表示一系列配置文件的存放目录

3.2、编写如章节2中的服务内容,并保存为文件

vim firstservice.json

内容是章节一部分的json中的内容。

说明:每一个服务都是以json文件格式的形式被单独声明在一个文件中,然后集中放到一个目录下。供consul启动时读取。

3.3、保存firstservice.json文件到指定目录

mv firstservice.json /etc/consul.d/

通过如上命令将自定义的firstservice.json服务文件移动至集中存放consul集群启动时要启动的服务目录中,即/etc/consul.d

4、服务查询

4.1、启动consul

由于我们添加了服务,启动的服务是以配置文件的形式进行配置的,因此,在启动时有必要指定服务配置文件所对应的目录,如下所示:

consul agent -dev -config-dir /etc/consul.d/

如上的命令表示:根据-config-dir指定的服务注册的目录中的文件来启动服务。

4.2、服务查询

服务的查询支持两种方式的查询,分别为:DNSHTTP

  • a、第一种:DNS
dig @127.0.0.1 -p 8600 dev.firstservice.service.consul

【说明:】

  1. dev.firstservice.service.consul是固定的格式组合,具体格式为:tag.servicename.service.consul,即tag和servicename为服务创建时自定义配置内容。
  2. DNS访问的端口是8600
  • b、第二种:HTTP
curl http://localhost:8500/v1/catalog/service/firstservice

【说明:】

  1. HTTP访问路径:host:port/版本号/service/服务名。
  2. Address:用于指定一个特定的Service的IP地址,默认情况下,使用的是该service使用的agent。

5、注册多个服务

5.1、每一个服务分别写一个json文件

例如,新建第二个服务sendservice,将新建secondservice.json文件,如下:

{
  "service": {
    "id": "secondservice",
    "name": "secondservice",
    "tags": ["dev"],
    "port": 80,
  }
}
  • 使用http格式访问:

    curl http://localhost:8500/v1/catalog/service/secondservice
    

5.2、将多个服务写到一个json文件中

除了将每一个服务单独定义为一个json配置文件外,consul还允许将多个服务组合定义在一个json文件中,具体的方式是对json文件的格式稍作修改,将原来的service修改为sevices,将原来service对应的对象类型,修改为数组类型。举例如下:

{
  "services": [
  {
    "id": "firstservice",
    "name": "firstservice",
    "tags": ["dev"],
    "port": 80
  },
  {
    "id": "secondservice",
    "name": "secondservice",
    "tags": ["dev"],
    "port": 80
  }
  ]
}

说明:

  • 1、放在多个services中而不是原来的service
  • 2、多个服务放在一个数组中,起名为services

在实际的开发过程中,微服务数量众多。如果每个文件都放在一个文件里,文件会非常多;而如果所有服务都放在一个文件里,文件太大,也不合适。因此,在实践中,往往二者结合使用。例如,假设有100个微服务,则,放在10json文件中,每个文件中放10个微服务。