## 基于Consul的服務發現
## 一、Consul的安裝和配置
基于Consul實現的服務發現,一定程度上可以解決基于fie文件的服務發現的弊端。
### 1.1 docker安裝
centos1上,此處使用docker方式安裝啟動Consu單節點服務,直接獲取官方鏡像consul:1.14.5 命令如下
孝拉取鏡像
docker pull consul:1.14.5
#運行consul容器,占據8500端口
docker run.name consul -d -p 8500:8500 consul:1.14.5
#查看正在運行的consu1容器
docker ps -a|grep 8500
### 1.2 訪問Consul
http://192.168.100.87:8500/
### 1.3 api方式服務注冊

* 命令行方式注冊node1
centos1上運行
curl -X PUT -d '{ "id":"node1","name":"node_exporter","address":"node_exporter","port":9100,"tags":["exporter"],"meta":{"job":"node_exporter","instance":"Prometheus服務器所在Linux監控"},"checks":[{"http":"http://192.168.100.87:9100/metrics","interval":"10s"}]}' http://localhost:8500/v1/agent/service/register
#id字段,不允許重復
#name字段 服務得名稱
#address 服務地址
#port 服務端口
#meta 元數據,可以理解是這個待監測服務的一些輔助參數
#checks 這個待監測服務的健康檢查的地址信息
* json方式注冊node2
centos1上創建json文件
mkdir /data/consul
cd /data/consul
#創建json文件
cat >node2_exporter.json<<"EOF"
{
"id": "node2",
"name": "node_exporter",
"tags":[
"exporter"
],
"address":"192.168.100.141",
"port": 9100,
"meta":{
"job": "node_exporter",
"instance":"centos2股務器Linux"
},
"check":{
"http": "http://192.168.100.141:9100/metrics",
"interval":"10s"
}
}
EOF
執行json文件,注冊node2
curl --request PUT --data @node2_exporter.json http://localhost:8500/v1/agent/service/register
刷新8500的web界面,可看到注冊的兩個node1/node2成功

備注:除了我們自己注冊的兩個Lnux操作系統服務node1/node2之外,Consul的agent還會將自己注冊為一個名為consul的服務。
### 1.4 api方式注銷某個服務
如果要注銷掉某個服務,可以通過如下 API命令操作,例如注銷上邊添加的 node2服務
curl -X PUT http://localhost:8500/v1/agent/service/deregister/node2
#說明一下這里最后的node2是consul中exporter的id.
## 二、配置Prometheus實現自動服務發現
現在 ConsuI服務已經啟動完畢,并成功注冊了兩個服務,接下來,我們需要配置Prometheus 來使用 Consu自動服務發現,目的就是能夠將上邊添加的服務自動發現到Prometheus的Targets中,首先備份源配置文件
#將上一章節的基于文件的服務發現配置文件備份一下
cd /data/docker-prometheus/prometheus
cp -a prometheus.yml prometheus.yml.filebak
ll *.filebak
### 2.1增加consul_sd_configs的配置
增加 prometheus.yml配置如下
vi prometheus.yml
- job_name: "consul_exporter"
consul_sd_configs:
- server: 192.168.100.87:8500
services: []
relabel_configs:
- source_labels: [__meta_consul_tags]
regex: .*exporter.*
action: keep
- regex: __meta_consul_service_metadata_(.+)
action: labelmap
保存后輸入命令更新:
curl -XPOST http://localhost:9090/-/reload
成功監聽

### 2.2 驗證自動發現
* 增加node3
curl -X PUT -d '{ "id":"node3","name":"node_exporter","address":"node_exporter","port":9100,"tags":["exporter"],"meta":{"job":"node_exporter","instance":"Prometheus服務器所在Linux監控"},"checks":[{"http":"http://192.168.100.87:9100/metrics","interval":"10s"}]}' http://localhost:8500/v1/agent/service/register
* 制除node3
#注銷剽除node3的id
curl -X PUT http://localhost:8500/v1/agent/service/deregister/node3
## 三、將其他的服務加入Consul自動發現
### 3.1 創建添加腳本
centos1上執行
cat>/data/consul/api.sh <<"EOF"
#nginx
curl -X PUT -d '{ "id":"nginx1","name":"nginx_exporter","address":"192.168.100.141","port":9113,"tags":["exporter"],"meta":{"job":"nginx_exporter","instance":"centos2服務器所在nginx監控"},"checks":[{"http":"http://192.168.100.141:9113/metrics","interval":"10s"}]}' http://localhost:8500/v1/agent/service/register
#rabbitmq
curl -X PUT -d '{ "id":"rabbitmq1","name":"rabbitmq_exporter","address":"192.168.100.141","port":9419,"tags":["exporter"],"meta":{"job":"rabbitmq_exporter","instance":"centos2服務器所在rabbitmq監控"},"checks":[{"http":"http://192.168.100.141:9419/metrics","interval":"10s"}]}' http://localhost:8500/v1/agent/service/register
#redis
curl -X PUT -d '{ "id":"redis1","name":"redis_exporter","address":"192.168.100.141","port":9121,"tags":["exporter"],"meta":{"job":"redis_exporter","instance":"centos2服務器所在redis監控"},"checks":[{"http":"http://192.168.100.141:9121/metrics","interval":"10s"}]}' http://localhost:8500/v1/agent/service/register
#mongo
curl -X PUT -d '{ "id":"mongodb1","name":"mongodb_exporter","address":"192.168.100.141","port":9216,"tags":["exporter"],"meta":{"job":"mongodb_exporter","instance":"centos2服務器所在mongodb監控"},"checks":[{"http":"http://192.168.100.141:9216/metrics","interval":"10s"}]}' http://localhost:8500/v1/agent/service/register
#mysqld
curl -X PUT -d '{"id":"mysqld1","name":"mysqld_exporter","address":"192.168.100.141","port":9104,"tags":["exporter"],"meta":{"job":"mysqld_exporter","instance":"centos2服務器所在mysql監控"},"checks":[{"http":"http://192.168.100.141:9104/metrics","interval":"10s"}]}' http://localhost:8500/v1/agent/service/register
#cadvisor
curl -X PUT -d '{"id":"cadvisor2","name":"cadvisor","address":"192.168.100.141","port":8079,"tags":["exporter"],"meta":{"job":"cadvisor","instance":"centos2服務器所在docker監控"},"checks":[{"http":"http://192.168.100.141:8079/metrics","interval":"10s"}]}' http://localhost:8500/v1/agent/service/register
curl -X PUT -d '{"id":"cadvisor1","name":"cadvisor","address":"192.168.100.87","port":8079,"tags":["exporter"],"meta":{"job":"cadvisor","instance":"centos1服務器所在docker監控"},"checks":[{"http":"http://192.168.100.87:8079/metrics","interval":"10s"}]}' http://localhost:8500/v1/agent/service/register
#process
curl -X PUT -d '{"id":"process1","name":"process_exporter","address":"192.168.100.141","port":9256,"tags":["exporter"],"meta":{"job":"process_exporter","instance":"centos2服務器所在進程監控"},"checks":[{"http":"http://192.168.100.141:9256/metrics","interval":"10s"}]}' http://localhost:8500/v1/agent/service/register
#golang自定義程序
curl -X PUT -d '{"id":"golang_exporter1","name":"golang_exporter","address":"192.168.100.58","port":8182,"tags":["exporter"],"meta":{"job":"golang_exporter","instance":"go自定義程序監控"},"checks":[{"http":"http://192.168.100.58:8182/metrics","interval":"10s"}]}' http://localhost:8500/v1/agent/service/register
#prometheus
curl -X PUT -d '{"id":"prometheus1","name":"prometheus","address":"192.168.100.87","port":9090,"tags":["exporter"],"meta":{"job":"prometheus","instance":"Prometheus服務器 Prometheus Server"},"checks":[{"http":"http://192.168.100.87:9090/metrics","interval":"10s"}]}' http://localhost:8500/v1/agent/service/register
#domain
curl -X PUT -d '{"id":"domain1","name":"domain_exporter","address":"baidu.com","port":9222,"tags":["domain"],"meta":{"job":"domain_exporter","instance":"百度域名監控"},"checks":[{"http":"http://192.168.100.141:9222/metrics","interval":"10s"}]}' http://localhost:8500/v1/agent/service/register
curl -X PUT -d '{"id":"domain2","name":"domain_exporter","address":"qq.com","port":9222,"tags":["domain"],"meta":{"job":"domain_exporter","instance":"qq域名監控"},"checks":[{"http":"http://192.168.100.141:9222/metrics","interval":"10s"}]}' http://localhost:8500/v1/agent/service/register
#snmp
curl -X PUT -d '{"id":"snmp1","name":"snmp_exporter","address":"192.168.100.141","port":9116,"tags":["snmp"],"meta":{"job":"snmp_exporter","instance":"centos2服務器所在snmp監控"},"checks":[{"http":"http://192.168.100.141:9116","interval":"10s"}]}' http://localhost:8500/v1/agent/service/register
#blackbox_http
curl -X PUT -d '{"id":"blackbox_http1","name":"blackbox_http_exporter","address":"https://www.baidu.com","port":9115,"tags":["blackbox_http"],"meta":{"job":"blackbox_http_exporter","instance":"centos1服務器所在黑盒http監控"},"checks":[{"http":"http://192.168.100.87:9115","interval":"10s"}]}' http://localhost:8500/v1/agent/service/register
curl -X PUT -d '{"id":"blackbox_http2","name":"blackbox_http_exporter","address":"https://wy.ldw520.top","port":9115,"tags":["blackbox_http"],"meta":{"job":"blackbox_http_exporter","instance":"centos1服務器所在黑盒http監控"},"checks":[{"http":"http://192.168.100.87:9115","interval":"10s"}]}' http://localhost:8500/v1/agent/service/register
#blackbox_tcp
curl -X PUT -d '{"id":"blackbox_tcp1","name":"blackbox_http_exporter","address":"192.168.100.87:9090","port":9115,"tags":["blackbox_tcp"],"meta":{"job":"blackbox_http_exporter","instance":"centos1服務器所在黑盒tcp監控"},"checks":[{"http":"http://192.168.100.87:9115","interval":"10s"}]}' http://localhost:8500/v1/agent/service/register
curl -X PUT -d '{"id":"blackbox_tcp2","name":"blackbox_tcp_exporter","address":"192.168.100.141:9100","port":9115,"tags":["blackbox_tcp"],"meta":{"job":"blackbox_tcp_exporter","instance":"centos1服務器所在黑盒tcp監控"},"checks":[{"http":"http://192.168.100.87:9115","interval":"10s"}]}' http://localhost:8500/v1/agent/service/register
#blackbox_icmp
curl -X PUT -d '{"id":"blackbox_icmp1","name":"blackbox_icmp_exporter","address":"192.168.100.87","port":9115,"tags":["blackbox_icmp"],"meta":{"job":"blackbox_icmp_exporter","instance":"centos1服務器所在黑盒icmp監控"},"checks":[{"http":"http://192.168.100.87:9115","interval":"10s"}]}' http://localhost:8500/v1/agent/service/register
curl -X PUT -d '{"id":"blackbox_icmp2","name":"blackbox_icmp_exporter","address":"192.168.100.141","port":9115,"tags":["blackbox_icmp"],"meta":{"job":"blackbox_icmp_exporter","instance":"centos1服務器所在黑盒icmp監控"},"checks":[{"http":"http://192.168.100.87:9115","interval":"10s"}]}' http://localhost:8500/v1/agent/service/register
EOF
增加 prometheus.yml配置如下
vi prometheus.yml
- job_name: "consul_snmp-exporter"
scrape_interval: 30s
scrape_timeout: 30s
metrics_path: snmp
params:
module: [if_mib]
consul_sd_configs:
- server: '192.168.100.87:8500'
services: [ ]
relabel_configs:
- source_labels: [__meta_consul_tags]
regex: .*snmp.*
action: keep
- regex: __meta_consul_service_metadata_(.+)
action: labelmap
- source_labels: [ '__meta_consul_service_address' ]
target_label: __param_target
- source_labels: [ __param_target ]
target_label: instance
- target_label: __address__
replacement: 192.168.100.141:9116
- job_name: "consul_blackbox_http"
metrics_path: probe
params:
module: [ http_2xx ]
consul_sd_configs:
- server: '192.168.100.87:8500'
services: [ ]
relabel_configs:
- source_labels: [ __meta_consul_tags ]
regex: .*blackbox_http.*
action: keep
- regex: __meta_consul_service_metadata_(.+)
action: labelmap
- source_labels: [ '__meta_consul_service_address' ]
target_label: __param_target
- source_labels: [ __param_target ]
target_label: instance
- target_label: __address__
replacement: blackbox_exporter:9115
- job_name: "consul_blackbox_tcp"
metrics_path: probe
params:
module: [ tcp_connect ]
consul_sd_configs:
- server: '192.168.100.87:8500'
services: [ ]
relabel_configs:
- source_labels: [ __meta_consul_tags ]
regex: .*blackbox_tcp.*
action: keep
- regex: __meta_consul_service_metadata_(.+)
action: labelmap
- source_labels: [ '__meta_consul_service_address' ]
target_label: __param_target
- source_labels: [ __param_target ]
target_label: instance
- target_label: __address__
replacement: blackbox_exporter:9115
- job_name: "consul_blackbox_icmp"
metrics_path: probe
params:
module: [ icmp ]
consul_sd_configs:
- server: '192.168.100.87:8500'
services: [ ]
relabel_configs:
- source_labels: [ __meta_consul_tags ]
regex: .*blackbox_icmp.*
action: keep
- regex: __meta_consul_service_metadata_(.+)
action: labelmap
- source_labels: [ '__meta_consul_service_address' ]
target_label: __param_target
- source_labels: [ __param_target ]
target_label: instance
- target_label: __address__
replacement: blackbox_exporter:9115
保存后輸入命令更新:
curl -XPOST http://localhost:9090/-/reload
成功監聽

<hr>
## 四、基于Consul與基于文件兩種服務發現模式的比較
| 基于Consul | 基于文件
優點 | Consul是獨立服務,可以做高可用提升配置可靠性 | 實現簡單,去中心化
缺點 | 增加了一層服務去管理配置 | 配置文件與Prometheus服務器耦合 ,配置文件的備份與恢復麻煩
## 五、ConsulManager圖形界面管理
### 4.1 ConsulManager是什么
傳統的Consul項目的配置管理是基于命令行模式或者json配置模式,管理效率低、不直觀。可以借助于ConsulManager開源項日實現圖形界面的管理,增強管理的易用性
### 4.2安裝配置ConsulManager
* 優先完成Consul配置1.14.5
下載ConsulManager的docker-compose.yml進入centos1的服務器
mkdir /data/consulmanager -p
cd /data/consulmanager
wget https://starsl.cn/static/img/docker-compose.yml
* 修改dockercompose.yml
#修改3個環境交量
#cosul token:consul的登錄token:當前測試環境可以不填token,這樣consul使用無密碼
#consul_url:consul的 URL(http開頭:/v1要保留)
#admin passwd:錄ConsulManager web的admin密碼
cd /data/consulmanager
dacker-compose pull
docker-compose up -d
docker ps -a lgrep consul
訪問地址
http://192.168.100.87:1026


### 4.3 使用ConsulManager管理服務發現
* 添加待監控targets

* 刪除監控targets

- Prometheus教程
- 一. dokcer 安裝
- 二. 安裝docker-compose
- 三. docker-compose安裝Prometheus
- 四. 配置grafana的數據源
- 五. Prometheus的Exporter
- 六. Prometheus的基本術語
- 七. 監控Linux
- 八. 監控redis和mongodb
- 九. 監控mysql數據庫
- 十. 監控go程序
- 十一. 監控nginx
- 十二. 監控消息隊列
- 十三. 監控docker
- 十四. 監控進程
- 十五. 域名監控
- 十六. SNMP監控
- 十七. 黑盒監控
- 十八. 自定義監控
- 十九. go實現自定義監控
- 二十. 服務發現概述
- 二十一. 基于文件的服務發現
- 二十二. 基于Consul的服務發現
- 二十三. relabeling機制