转载

微服务Consul系列之服务注册与发现

在进行服务注册之前先确认集群是否建立,关于服务注册可以看上篇 微服务Consul系列之集群搭建 的介绍,两种注册方式:一种是注册HTTP API、另一种是通过配置文件定义,下面讲解的是基于后者配置文件定义的形式,也是Consul官方所建议的方式。

推荐技术博客: Node.js技术栈

准备工作

以下是上节做Consul集群的时候列的机器列表,下面我们将192.168.6.131机器安装了Node服务,起了两个端口

机器 模式 节点名称
192.168.6.128 Server consul_1(初始设置为Leader)
192.168.6.129 Server consul_2
192.168.6.130 Server consul_3
192.168.6.131 Client consul_4
  • 服务一:order_service
$ curl http://192.168.6.131:3010/health
ok
复制代码
  • 服务二:user_service
$ curl http://192.168.6.131:3011/health
ok
复制代码

服务注册

对order_service、user_service两个服务在consul_4节点上进行服务定义,配置中包含了服务的名称、地址、端口以及每10秒中对服务进行一次健康检查。

  • 注册服务一:order_service

order_service.json

{
    "service":{
        "name":"order_service",
        "address":"192.168.1.131",
        "port": 3010,
        "enable_tag_override": false,
        "check":{
            "deregisterCriticalServiceAfter":"90m",
            "http":"http://192.168.1.131:3010/health",
            "interval":"10s"
        }
    }
}
复制代码
  • 注册服务二:user_service

user_service.json

{
    "service":{
        "name":"user_service",
        "address":"192.168.1.131",
        "port": 3011,
        "enable_tag_override": false,
        "check":{
            "deregisterCriticalServiceAfter":"90m",
            "http":"http://192.168.1.131:3011/health",
            "interval":"10s"
        }
    }
}
复制代码
  • 启动consul_4进行服务注册

Consul Agent启动过程中通过指定 -config-dir 参数可以定位到配置文件所在目录,且目录下文件为.json的都会被Consul Agent配置文件所读取。

$ sudo consul agent -config-file=/usr/src/consul/consul_config.json -join=192.168.6.128 -config-dir=/etc/consul.d
复制代码

服务注册成功之后查看我们的Web管理界面,在consul_4中展示了我们上面定义的两个服务及端口号

微服务Consul系列之服务注册与发现

下图为Web管理界面展示的健康检查情况,可以看到进行了接口请求,且响应状态为200,输出结果为ok。

微服务Consul系列之服务注册与发现

服务发现

Consul服务发现支持H TTP APIDNS 两种方式

  • HTTP API
$ curl http://192.168.6.128:8500/v1/catalog/service/order_service?passing=true
复制代码

执行命令之后返回Consul的注册信息、服务信息及健康检查信息,且指定passing=true,表示返回时过滤掉一些不健康的节点。

[
    {
        "ID":"cf35869a-edba-5e1f-77e0-922b55ddfad4",
        "Node":"consul_4",
        "Address":"192.168.6.131",
        "Datacenter":"consul_cluster",
        "TaggedAddresses":{
            "lan":"192.168.6.131",
            "wan":"192.168.6.131"
        },
        "NodeMeta":{
            "consul-network-segment":""
        },
        "ServiceKind":"",
        "ServiceID":"order_service",
        "ServiceName":"order_service",
        "ServiceTags":[

        ],
        "ServiceAddress":"192.168.6.131",
        "ServiceWeights":{
            "Passing":1,
            "Warning":1
        },
        "ServiceMeta":{

        },
        "ServicePort":3010,
        "ServiceEnableTagOverride":false,
        "ServiceProxyDestination":"",
        "ServiceProxy":{

        },
        "ServiceConnect":{

        },
        "CreateIndex":3818,
        "ModifyIndex":3818
    }
]

复制代码
  • DNS方式

现在使用第二种DNS方式查询具体的服务,Consul提供了默认的名字 NAME.service.consul ,NAME代指注册的服务名称。

对于上面注册的两个Web服务对应域名分别为 order_service.service.consuluser_service.service.consul ,下面先对于 order_service.service.consul 进行服务查询

$ dig @192.168.6.128 -p 8600 order_service.service.consul        

; <<>> DiG 9.10.3-P4-Ubuntu <<>> @192.168.6.128 -p 8600 order_service.service.consul
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31324
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 2
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;order_service.service.consul.  IN      A

;; ANSWER SECTION:
order_service.service.consul. 0 IN      A       192.168.6.131

;; ADDITIONAL SECTION:
order_service.service.consul. 0 IN      TXT     "consul-network-segment="

;; Query time: 1 msec
;; SERVER: 192.168.6.128#8600(192.168.6.128)
;; WHEN: Thu Mar 28 16:55:27 PDT 2019
;; MSG SIZE  rcvd: 109
复制代码

如上所示, ANSWER SECTION: 一个A记录返回了一个服务所在的节点IP地址为: 192.168.6.131

为了展示更详细的信息,在dig命令中我们可以加上 SRV 参数,可以返回服务所在的节点信息、端口号。

$ dig @192.168.6.128 -p 8600 order_service.service.consul SRV

; <<>> DiG 9.10.3-P4-Ubuntu <<>> @192.168.6.128 -p 8600 order_service.service.consul SRV
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52707
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 3
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;order_service.service.consul.  IN      SRV

;; ANSWER SECTION:
order_service.service.consul. 0 IN      SRV     1 1 3010 consul_4.node.consul_cluster.consul.

;; ADDITIONAL SECTION:
consul_4.node.consul_cluster.consul. 0 IN A     192.168.6.131
consul_4.node.consul_cluster.consul. 0 IN TXT   "consul-network-segment="

;; Query time: 1 msec
;; SERVER: 192.168.6.128#8600(192.168.6.128)
;; WHEN: Thu Mar 28 17:19:29 PDT 2019
;; MSG SIZE  rcvd: 164

复制代码

如上所示, ADDITIONAL SECTION: 一个A记录不止,返回了一个服务所在的节点IP地址为: 192.168.6.131 ,还有节点名称及数据中心,在 ANSWER SECTION: 中还可以看到服务的端口号信息。

服务异常情况

现在我们来做些处理将consul_4节点上的order_service服务停掉,此时可以看到故障服务order_service已经不在当前结果列表页了,保证了客户端在服务发现过程中只能获取当前可用的服务节点。

$ dig @192.168.6.128 -p 8600 order_service.service.consul                      

; <<>> DiG 9.10.3-P4-Ubuntu <<>> @192.168.6.128 -p 8600 order_service.service.consul
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 45049
;; 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:
;order_service.service.consul.  IN      A

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

;; Query time: 0 msec
;; SERVER: 192.168.6.128#8600(192.168.6.128)
;; WHEN: Thu Mar 28 20:38:00 PDT 2019
;; MSG SIZE  rcvd: 107
复制代码

如上所示,已经没有了 ADDITIONAL SECTION: 区域信息。

再来看下在健康检查端,列出了不健康的节点consul_4,标注了哪些是健康状态和哪些是非正常状态的服务。

微服务Consul系列之服务注册与发现

点击consul_4可以看到详细的健康检查信息结果,例如上面我们停掉的order_service服务返回链接被拒。

微服务Consul系列之服务注册与发现
原文  https://juejin.im/post/5cac8d5b6fb9a06892320ab1
正文到此结束
Loading...