24.4 基于consul服务发现模式

news2024/11/25 22:38:55

本节重点介绍 :

  • 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]
Description=consul server
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/bin/consul agent  -config-file=/opt/app/consul/single_server.json
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=consul
[Install]
WantedBy=default.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 (
	"fmt"
	consul "github.com/hashicorp/consul/api"
	"log"
)

type client struct {
	consul *consul.Client
}

func NewConsulClient(addr string) (*client, error) {
	config := consul.DefaultConfig()
	config.Address = addr
	c, 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 = srvName

	thisId := fmt.Sprintf("%s_%d", srvHost, srvPort)
	reg.ID = thisId
	reg.Port = srvPort
	reg.Address = srvHost
	reg.Meta = metaMap
	log.Printf("ServiceRegisterStart :%v", thisId)
	//增加check
	check := new(consul.AgentServiceCheck)
	check.HTTP = fmt.Sprintf("http://%s:%d%s", reg.Address, reg.Port, healthyCheckPath)
	//设置超时 5s。
	check.Timeout = "2s"
	check.DeregisterCriticalServiceAfter = "5s"
	//设置间隔 5s。
	check.Interval = "5s"
	//注册check服务。
	reg.Check = check

	return c.consul.Agent().ServiceRegister(reg)
}

编写获取服务信息的方法

  • 使用consul.Health().Service获取 passing的服务
// Service return a service
func (c *client) GetService(service, tag string) ([]*consul.ServiceEntry, error) {
	passingOnly := true
	ss, _, 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_exporter"
	for _, 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 main

import (
	"fmt"
	consul "github.com/hashicorp/consul/api"
	"log"
)

type client struct {
	consul *consul.Client
}

func NewConsulClient(addr string) (*client, error) {
	config := consul.DefaultConfig()
	config.Address = addr
	c, 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 = srvName

	thisId := fmt.Sprintf("%s_%d", srvHost, srvPort)
	reg.ID = thisId
	reg.Port = srvPort
	reg.Address = srvHost
	reg.Meta = metaMap
	log.Printf("ServiceRegisterStart :%v", thisId)
	//增加check
	check := new(consul.AgentServiceCheck)
	check.HTTP = fmt.Sprintf("http://%s:%d%s", reg.Address, reg.Port, healthyCheckPath)
	//设置超时 5s。
	check.Timeout = "2s"
	check.DeregisterCriticalServiceAfter = "5s"
	//设置间隔 5s。
	check.Interval = "5s"
	//注册check服务。
	reg.Check = check

	return 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 := true
	ss, _, 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_exporter"
	for _, 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

image.png

注销服务

配置 node_exporter的job为consul服务发现模式

  • 配置文档
  • 配置文件
  - job_name: 'node_exporter'
    honor_timestamps: true
    scrape_interval: 15s
    scrape_timeout: 10s
    metrics_path: /metrics
    scheme: http
    consul_sd_configs:
      - server: 172.20.70.205:8500
        services:
          - node_exporter
    relabel_configs:
      - source_labels:  ["__meta_consul_dc"]
        target_label: "dc"
      - separator: ;
        regex: __meta_consul_service_metadata_(.+)
        replacement: $1
        action: labelmap
  • target页面和service discovery 页面观察服务发现结果
  • image.png
  • image.png

本节重点总结 :

  • consul 安装
  • consul go代码注册服务,注销服务,获取服务
  • node_exporter改造为consul服务发现
  • 在数量比较大时,在注册服务的时候,关闭check,可以降低consul的压力

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2205115.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实践体验密集小目标检测,以小麦麦穗颗粒为基准,基于YOLOv9全系列【yolov9/t/s/m/c/e】参数模型开发构建智能精准麦穗颗粒检测计数系统

对于常规的目标检测任务来说&#xff0c;诸如&#xff1a;COCO、VOC这类基础的数据场景&#xff0c;涌现出来了一些列性能初衷的检测模型&#xff0c;YOLO系列就是其中的佼佼者&#xff0c;不断地刷榜取得了越来越好的效果&#xff0c;不过这些评测指标是基于COCO、VOC这类公开…

信息系统项目管理师(十大管理域、五大过程组)

前言&#xff1a;信息系统项目管理师重点掌握每个过程中的ITO&#xff0c;即输入(Inputs)、工具(Tools)、输出(Outputs)。还有每个过程属于哪个过程组。 十大管理&#xff1a;整体管理、范围管理、进度管理、成本管理、质量管理、人力资源管理、沟通管理、干系人管理、风险管理…

猫头虎分享:Python库 Django 的简介、安装、用法详解入门教程

猫头虎分享&#xff1a;Python库 Django 的简介、安装、用法详解入门教程 &#x1f680;&#x1f40d; 今天猫头虎收到了一位粉丝的问题&#xff1a;“猫哥&#xff0c;如何在项目中使用Django搭建一个Web应用呢&#xff1f;”。这可是很多刚接触Python开发的朋友常遇到的困惑…

C++和OpenGL实现3D游戏编程【连载14】——VBO、VAO和EBO应用

&#x1f525;C和OpenGL实现3D游戏编程【目录】 1、本节实现的内容 我们从一开始学OpenGL到现在&#xff0c;OpenGL的图形绘图必须在glBegin()和glEnd()函数之间完成&#xff0c;在此基础之上&#xff0c;才能进行后续操作功能。但是我们今天要讨论一下OpenGL图形绘制的模式&a…

前端父子传递属性值

1. Vue3.4.X之前 &#xfeff; 2. Vue3.4.X之后版本 defineModel 父页面 &#xfeff; 子页面 &#xfeff; &#xfeff; &#xfeff;

Python | Leetcode Python题解之第463题岛屿的周长

题目&#xff1a; 题解&#xff1a; class Solution:def islandPerimeter(self, grid: List[List[int]]) -> int:rowlen(grid)collen(grid[0])nums0c0gridgrid[[0]*col]for i in range(row):grid[i].append(0)for j in range(col):if grid[i][j]1:nums1if grid[i][j]1 and …

跨境独立站还能做多久?谈谈独立站的长期价值

这几年&#xff0c;品牌出海与跨境独立站成了商业圈子的热门话题。伴随而来的则是日益激烈的市场竞争&#xff0c;不少新入局的卖家纷纷抱怨&#xff1a;“现在做独立站已经赚不到钱了&#xff01;”都发出了灵魂拷问&#xff0c;**跨境独立站还能做几年&#xff1f;**跨境电商…

【hot100-java】合并 K 个升序链表

链表篇 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; }* }*/ class Solu…

基于Python的在线音乐平台

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

qemu启动busybox虚拟机网络连接配置

一、busybox文件系统网络问题 由于根文件是用busybox构建&#xff0c;所以很多配置文件是没有的&#xff0c;包括部分网络的默认设置。启动虚拟机后只能使用ip命令和ifconfig命令查看网络状态。 二、开启qemu网络支持 想要使虚拟机上网&#xff0c;最简单的方式可以使用 -netde…

javaweb 文件存储

文件上传&#xff0c;是指将本地图片、视频、音频等文件上传到服务器&#xff0c;供其他用户浏览或下载的过程。 文件上传在项目中应用非常广泛&#xff0c;我们经常发微博、发微信朋友圈都用到了文件上传功能。 上传文件的原始form表单&#xff0c;要求表单必须具备以下三点…

双十一买些提高幸福感的生活单品!五款精选好物推荐~

双十一购物狂欢即将来临&#xff0c;这是一年一度的购物盛宴&#xff0c;家电和数码产品通常会在这个时期提供诱人的折扣。但品牌众多&#xff0c;每款产品又各有千秋&#xff0c;让人难以抉择。今天&#xff0c;我将分享一些在双十一期间值得考虑的高品质好物&#xff0c;让我…

【视频笔记】408新增知识点信号——里昂视频

文章目录 **2.信号****3.信号的实现**4.信号的处理**①忽略信号****②执行信号的默认操作****③捕获井处理信号**几个Linux支持的典型信号&#xff1a; **5.信号的产生**① **通过终端按键(键盘)产生信号**例如&#xff0c;CtrlC发送2号信号SIGINT、Ctrl\发送3号信号SIGQUIT② …

Matlab实现海洋捕食者优化算法优化回声状态网络模型 (MPA-ESN)(附源码)

目录 1.内容介绍 2部分代码 3.实验结果 4.内容获取 1内容介绍 海洋捕食者优化算法&#xff08;Marine Predators Algorithm, MPA&#xff09;是一种基于海洋生物捕食行为的新型群体智能优化算法。MPA通过模拟海洋捕食者如鲨鱼、海豚等在寻找猎物时的追踪、包围和攻击行为&…

双十一购买清单,应该如何选购宠物空气净化器,有哪几款推荐

作为一个宠物博主&#xff0c;每天都有人来问我家里养了猫应该怎么样才能清理浮毛&#xff0c;到底有哪些值得推荐。 这我可是有话说&#xff0c;当初就是心血来潮养了两只长毛猫&#xff0c;直到现在都还一直在清理猫咪掉毛的问题。猫咪掉的毛&#xff0c;不仅是会掉在沙发上…

EmEditor传奇脚本编辑器

主程序&#xff1a;EmEditor.exe 目前已有功能 可以自己指定一个快捷键 实现以下功能&#xff08;默认快捷键为&#xff1a;F1&#xff09; 以下全功能 都是鼠标所在行 按快捷键 &#xff08;默认快捷键&#xff1a;F1&#xff09; 1.在Merchant.txt中 一键打开NPC 没有…

11.Lab Ten —— mmap

内存映射文件&#xff08;Memory-Mapped File&#xff09;是一种将文件内容映射到进程的虚拟地址空间的技术&#xff0c;使得文件的内容可以像内存一样被访问。 通过内存映射文件&#xff0c;可以高效地访问和操作文件内容 首先切换到mmap分支 git checkout mmap make clean…

【机器学习】随机森林算法(看我以弱博强)

目录 算法引入&#xff1a; 算法介绍&#xff1a; 1. 集成学习&#xff1a; 2. 训练过程&#xff1a; 3. 分类和回归&#xff1a; 算法优点&#xff1a; 算法缺点&#xff1a; 算法实现&#xff1a; 1. 数据准备 2. 划分数据集 3. 创建随机森林模型 4. 训练模型 5…

Kubesphere4.1版本创建应用Mysql并实现外网访问

目前Kubesphere4.1版本可查创建应用资料较少&#xff0c;特此记录作为参考。 目标 使用Kubesphere4.1完成Mysql服务部署并实现外网访问。 具体流程如下&#xff1a; 1.创建企业空间 2.创建项目 3.创建应用仓库 4.创建应用&#xff08;mysql&#xff09; 5.配置外网访…

抖去推--短视频矩阵系统源码对外资料包

#短视频矩阵系统源码# #短视频矩阵系统源码开发# #短视频矩阵系统源码打包# 一、短视频矩阵系统源码安装 安装环境 短视频矩阵系统源码需要以下环境&#xff1a; PHP 7.0 及以上 MySQL 5.5 及以上 Nginx / Apache Redis FFMpeg 下载源码 从官网下载最新版本的短视频矩阵系统…