浙江网站建设公司推荐,小程序店铺怎么开,用phpmysql做图书网站,苏州市住建局官网本节重点介绍 :
consul 安装consul go代码注册服务#xff0c;注销服务#xff0c;获取服务node_exporter改造为consul服务发现在数量比较大时#xff0c;在注册服务的时候#xff0c;关闭check#xff0c;可以降低consul的压力
consul 安装
准备工作 # 下载consul
wge…本节重点介绍 :
consul 安装consul go代码注册服务注销服务获取服务node_exporter改造为consul服务发现在数量比较大时在注册服务的时候关闭check可以降低consul的压力
consul 安装
准备工作 # 下载consul
wget -O /opt/tgzs/consul_1.9.4_linux_amd64.zip https://releases.hashicorp.com/consul/1.9.4/consul_1.9.4_linux_amd64.zip cd /opt/tgzs/
unzip consul_1.9.4_linux_amd64.zip/bin/cp -f consul /usr/bin/
启动单机版consul #
mkdir /opt/app/consul# 准备配置文件
cat EOF /opt/app/consul/single_server.json
{datacenter: dc1,node_name: consul-svr-01,server: true,bootstrap_expect: 1,data_dir: /opt/app/consul/,log_level: INFO,log_file: /opt/logs/,ui: true,bind_addr: 0.0.0.0,client_addr: 0.0.0.0,retry_interval: 10s,raft_protocol: 3,enable_debug: false,rejoin_after_leave: true,enable_syslog: false
}
EOF# 多个ip地址时将bind_addr 改为一个内网的ip# 写入service文件
cat EOF /etc/systemd/system/consul.service
[Unit]
Descriptionconsul server
Wantsnetwork-online.target
Afternetwork-online.target[Service]
ExecStart/usr/bin/consul agent -config-file/opt/app/consul/single_server.json
StandardOutputsyslog
StandardErrorsyslog
SyslogIdentifierconsul
[Install]
WantedBydefault.target
EOF# 启动服务
systemctl daemon-reload systemctl start consul systemctl status consul
验证访问
http://localhost:8500/
node_exporter的job改造为consul的服务发现
编写go代码注册服务到consul
初始化consul
使用包 github.com/hashicorp/consul/api
import (fmtconsul github.com/hashicorp/consul/apilog
)type client struct {consul *consul.Client
}func NewConsulClient(addr string) (*client, error) {config : consul.DefaultConfig()config.Address addrc, err : consul.NewClient(config)if err ! nil {return nil, err}return client{consul: c}, nil
}
编写注册服务方法
需要指定参数为 服务的名称实例地址实例端口实例探活path实例标签map check.HTTP 代表使用http类型的check调用 consul.Agent().ServiceRegister(reg)注册服务
// 注册服务
func (c *client) ServiceRegister(srvName, srvHost string, srvPort int, healthyCheckPath string, metaMap map[string]string) error {reg : new(consul.AgentServiceRegistration)reg.Name srvNamethisId : fmt.Sprintf(%s_%d, srvHost, srvPort)reg.ID thisIdreg.Port srvPortreg.Address srvHostreg.Meta metaMaplog.Printf(ServiceRegisterStart :%v, thisId)//增加checkcheck : new(consul.AgentServiceCheck)check.HTTP fmt.Sprintf(http://%s:%d%s, reg.Address, reg.Port, healthyCheckPath)//设置超时 5s。check.Timeout 2scheck.DeregisterCriticalServiceAfter 5s//设置间隔 5s。check.Interval 5s//注册check服务。reg.Check checkreturn c.consul.Agent().ServiceRegister(reg)
}
编写获取服务信息的方法
使用consul.Health().Service获取 passing的服务
// Service return a service
func (c *client) GetService(service, tag string) ([]*consul.ServiceEntry, error) {passingOnly : truess, _, err : c.consul.Health().Service(service, tag, passingOnly, nil)if len(ss) 0 err nil {return nil, fmt.Errorf(service ( %s ) was not found, service)}return ss, err
}
编写根据服务id注销服务的方法
// 根据server id注销服务
func (c *client) DeRegister(id string) error {return c.consul.Agent().ServiceDeregister(id)
}注册node_exporter服务
func main() {c, err : NewConsulClient(http://172.20.70.205:8500)if err ! nil {log.Printf(NewConsulClient.err:%v, err)return}nodes : []string{172.20.70.205,172.20.70.215,}nodeExporterSrv : node_exporterfor _, h : range nodes {m : map[string]string{region: bj, cloud: huawei}err c.ServiceRegister(nodeExporterSrv, h, 9100, /, m)if err ! nil {log.Printf([ServiceRegister.err][srv:%v][host:%v][err:%v], nodeExporterSrv, h, err)} else {log.Printf([ServiceRegister.success][srv:%v][host:%v], nodeExporterSrv, h)}}ss, err : c.GetService(nodeExporterSrv, )for _, s : range ss {log.Printf([c.GetService][service_id:%v][err:%v], s.Service.ID, err)//c.DeRegister(s.Service.ID)}}
完整的go代码
package mainimport (fmtconsul github.com/hashicorp/consul/apilog
)type client struct {consul *consul.Client
}func NewConsulClient(addr string) (*client, error) {config : consul.DefaultConfig()config.Address addrc, err : consul.NewClient(config)if err ! nil {return nil, err}return client{consul: c}, nil
}// 注册服务
func (c *client) ServiceRegister(srvName, srvHost string, srvPort int, healthyCheckPath string, metaMap map[string]string) error {reg : new(consul.AgentServiceRegistration)reg.Name srvNamethisId : fmt.Sprintf(%s_%d, srvHost, srvPort)reg.ID thisIdreg.Port srvPortreg.Address srvHostreg.Meta metaMaplog.Printf(ServiceRegisterStart :%v, thisId)//增加checkcheck : new(consul.AgentServiceCheck)check.HTTP fmt.Sprintf(http://%s:%d%s, reg.Address, reg.Port, healthyCheckPath)//设置超时 5s。check.Timeout 2scheck.DeregisterCriticalServiceAfter 5s//设置间隔 5s。check.Interval 5s//注册check服务。reg.Check checkreturn c.consul.Agent().ServiceRegister(reg)
}// 根据server id注销服务
func (c *client) DeRegister(id string) error {return c.consul.Agent().ServiceDeregister(id)
}// Service return a service
func (c *client) GetService(service, tag string) ([]*consul.ServiceEntry, error) {passingOnly : truess, _, err : c.consul.Health().Service(service, tag, passingOnly, nil)if len(ss) 0 err nil {return nil, fmt.Errorf(service ( %s ) was not found, service)}return ss, err
}func main() {c, err : NewConsulClient(http://172.20.70.205:8500)if err ! nil {log.Printf(NewConsulClient.err:%v, err)return}nodes : []string{172.20.70.205,172.20.70.215,}nodeExporterSrv : node_exporterfor _, h : range nodes {m : map[string]string{region: bj, cloud: huawei}err c.ServiceRegister(nodeExporterSrv, h, 9100, /, m)if err ! nil {log.Printf([ServiceRegister.err][srv:%v][host:%v][err:%v], nodeExporterSrv, h, err)} else {log.Printf([ServiceRegister.success][srv:%v][host:%v], nodeExporterSrv, h)}}ss, err : c.GetService(nodeExporterSrv, )for _, s : range ss {log.Printf([c.GetService][service_id:%v][err:%v], s.Service.ID, err)//c.DeRegister(s.Service.ID)}}
注册服务的结果 注册service 注销服务 配置 node_exporter的job为consul服务发现模式
配置文档配置文件 - job_name: node_exporterhonor_timestamps: truescrape_interval: 15sscrape_timeout: 10smetrics_path: /metricsscheme: httpconsul_sd_configs:- server: 172.20.70.205:8500services:- node_exporterrelabel_configs:- source_labels: [__meta_consul_dc]target_label: dc- separator: ;regex: __meta_consul_service_metadata_(.)replacement: $1action: labelmaptarget页面和service discovery 页面观察服务发现结果
本节重点总结 :
consul 安装consul go代码注册服务注销服务获取服务node_exporter改造为consul服务发现在数量比较大时在注册服务的时候关闭check可以降低consul的压力