Prometheus的服务发现之Consul介绍篇一

一、引言

Prometheus是一套开源的系统监控报警框架,此前对Prometheus有过介绍Prometheus的介绍与实践,Prometheus会去各个监控节点Pull数据。现在存在一个问题,如何让Prometheus去新增的监控节点Pull数据。

二、Prometheus的服务发现机制

本博主对Prometheus的服务发现机制亲自进行验证的方式有两种,一种是基于文件的服务发现;一种是基于Consul的服务发现。

2.1基于文件的服务发现

基于文件的服务发现有三步:
1.在一个Json文件中定义被监控的主机列表信息;
2.在Prometheus的配置文件中关联这个Json文件,以及对这个文件的扫描周期;
3.如果有新增的监控节点,将监控节点的主机列表信息写入到Json文件中,Prometheus通过周期扫描就会发现新增的节点。
关于文件的服务发现的具体配置可以参考基于文件的服务发现

2.2 基于Consul的服务发现

基于的Consul服务发现可以分为两步:
1.在Prometheus的配置中关联上Consul服务发现。
2.新增的节点向Consul进行注册,Prometheus便可添加上新增的服务。
关于Prometheus的服务发现的两种机制的细节本博客不做深入研究,下面将只会从Consul的安装、Prometheus的配置,新增服务的注册和解注册。

三、Consul服务发现的安装配置流程

3.1 Consul的安装

docker pull consul  //用docker拉取最新的镜像
docker run --name consul -d -p 8500:8500 consul  //最简单的docker run命令,将consul镜像运行在docker容器中,并将容器端口8500映射到主机端口8500

3.2 在Prometheus的yml配置文件中关联Consul
Prometheus的配置参考文件如下:

- job_name: 'consul-prometheus'
    consul_sd_configs:
    #consul 地址
      - server: 'xx.xx.xx.xx:8500'
        services: []
    relabel_configs:
      - source_labels: [__meta_consul_tags]
        regex: .*prometheus-target.*
        action: keep

relabel_configs在上述配置中起过滤作用:表示只有consul的service的tag为prometheus-target时才会被动态发现。
3.3 服务注册到Consul
服务注册到Consul需要编写一个Json文件或者Json信息,可以参考如下:

{
  "ID": "userServiceId", //服务id
  "Name": "userService", //服务名
  "Tags": [              //服务的tag,自定义,可以根据这个tag来区分同一个服务名的服务
    "primary",
    "v1"
  ],
  "Address": "127.0.0.1",//服务注册到consul的IP,服务发现,发现的就是这个IP
  "Port": 8000,          //服务注册consul的PORT,发现的就是这个PORT
  "EnableTagOverride": false,
  "Check": {             //健康检查部分
    "DeregisterCriticalServiceAfter": "90m",
    "HTTP": "http://www.baidu.com", //指定健康检查的URL,调用后只要返回20X,consul都认为是健康的
    "Interval": "10s"   //健康检查间隔时间,每隔10s,调用一次上面的URL
  }
}

备注:在注册Consul的过程中,服务ID要求唯一,服务名可以相同,Tag用于对服务的信息进行标注。
直接使用上述Json进行注册

curl http://10.240.185.2:8500/v1/agent/service/register -X PUT -i -H "Content-Type:application/json" -d '
{
  "ID": "userServiceId", //服务id
  "Name": "userService", //服务名
  "Tags": [              //服务的tag,自定义,可以根据这个tag来区分同一个服务名的服务
    "primary",
    "v1"
  ],
  "Address": "127.0.0.1",//服务注册到consul的IP,服务发现,发现的就是这个IP
  "Port": 8000,          //服务注册consul的PORT,发现的就是这个PORT
  "EnableTagOverride": false,
  "Check": {             //健康检查部分
    "DeregisterCriticalServiceAfter": "90m",
    "HTTP": "http://www.baidu.com", //指定健康检查的URL,调用后只要返回20X,consul都认为是健康的
    "Interval": "10s"   //健康检查间隔时间,每隔10s,调用一次上面的URL
  }
}'

将上述的信息保存成regitor.json文件后进行注册:

curl --request PUT --data @regitor.json http://localhost:8500/v1/agent/service/register

3.4 注册服务的查询
服务成功注册到Consul之后可以在Consul查看到所有注册的服务,也可以选择通过命令行进行查询注册的服务的结果状态,参考如下:

curl http://10.240.185.2:8500/v1/catalog/service/userService1  //userService1为查询的服务名
[
    {
        "ID": "7894fedb-9d68-0aa5-2f81-4dfb36ff575c",
        "Node": "55d85741eea1",
        "Address": "127.0.0.1",
        "Datacenter": "dc1",
        "TaggedAddresses": {
            "lan": "127.0.0.1",
            "wan": "127.0.0.1"
        },
        "NodeMeta": {
            "consul-network-segment": ""
        },
        "ServiceKind": "",
        "ServiceID": "userServiceId1",
        "ServiceName": "userService1",
        "ServiceTags": [
            "primary",
            "v1"
        ],
        "ServiceAddress": "10.240.185.4",
        "ServiceWeights": {
            "Passing": 1,
            "Warning": 1
        },
        "ServiceMeta": {},
        "ServicePort": 9105,
        "ServiceEnableTagOverride": false,
        "ServiceProxyDestination": "",
        "ServiceProxy": {},
        "ServiceConnect": {},
        "CreateIndex": 419,
        "ModifyIndex": 419
    }
]

3.5 服务解注册
在服务成功注册Consul之后,如果希望将服务从Consul解绑下来,可以考虑使用Consul的解绑命令,参考如下:

curl --request PUT http://localhost:8500/v1/agent/service/deregister/userService1 //为删除的服务名

另外Consul提供的其它操作API,可以参考Consul文档中列举的API接口。

四、参考

1.Consul文档
2.Consul手册
3.Prometheus 通过consul动态修改Targets接入
4.CentOS7下利用docker搭建prometheus+grafana+consul监控环境

你可能感兴趣的:(Java后端知识)