Go微服务: Http服务注册在Consul的示例(非Go-Micro)

概述

  • 现在,我们使用consul客户端的api来把Http服务注册到consul上,非Go-Micro的形式
  • 其实,consul官方提供了对应的接口调用来实现,golang中的consul/api包对其进行了封装
  • 我们使用consul/api来进行展示

目录结构

gitee.com/go-micro-services/consul-http
	├── conf
	│     └── conf.go
	├── controllers
	│     └── ctl.go
	├── utils
	│     └── consul.go
	├── main.go
	└── go.mod

1 ) conf/conf.go

package conf

var (
	ConsulAddr = "127.0.0.1:8500"
	HttpAddr   = "127.0.0.1:8100"
	HttpHost   = "127.0.0.1"
	HttpPort   = 8100
	HttpName   = "http_consul_001"
	HttpId     = "hc_xxxxx"
	HttpTags   = []string{"a", "b"}
)
  • 这里,定义了一些全局配置的变量值
  • 注意,HttpName 这里在后面过滤服务时默认是不能使用 -
  • 这里,使用下划线来代替连字符

2 ) controllers/ctl.go

package controller

import (
	"net/http"

	"gitee.com/go-micro-services/consul-http/conf"
	"gitee.com/go-micro-services/consul-http/utils"
	"github.com/gin-gonic/gin"
)

// 用于健康检查的处理程序
func HealthHandler(c *gin.Context) {
	c.JSON(http.StatusOK, gin.H{
		"msg": "ok",
	})
}

// 获取服务列表的处理程序
func ServiceListHandler(c *gin.Context) {
	services, err := utils.GetServiceList()
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}
	// 将服务列表转换为 JSON 并返回
	c.JSON(http.StatusOK, services)
}

// 获取服务列表的处理程序
func CurrentServiceHandler(c *gin.Context) {
	services, err := utils.FilterService(conf.HttpName) // 这里默认来说,名称不能用连字符 - 否则会报错,否则就需要自定义函数
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}
	// 将服务列表转换为 JSON 并返回
	c.JSON(http.StatusOK, services)
}
  • 这里定义了三个控制器,用于处理对应的路由

3 ) utils/consul.go

package utils

import (
	"fmt"

	"gitee.com/go-micro-services/consul-http/conf"
	"github.com/hashicorp/consul/api"
)

var ConsulClient *api.Client

// 获取consul客户端
func GetConsulClient() (*api.Client, error) {
	// 获取缓存
	if ConsulClient != nil {
		return ConsulClient, nil
	}
	// 获取注册中心连接客户端
	defaultConfig := api.DefaultConfig()
	defaultConfig.Address = conf.ConsulAddr
	ConsulClient, err := api.NewClient(defaultConfig)
	return ConsulClient, err
}

// 当前http服务注册到consul
func ConsulHttpReg() error {
	// 获取注册中心连接客户端
	client, err := GetConsulClient()
	if err != nil {
		return err
	}
	// 注册实例配置
	agentServiceRegistration := new(api.AgentServiceRegistration)
	agentServiceRegistration.Address = conf.HttpHost
	agentServiceRegistration.Port = conf.HttpPort
	agentServiceRegistration.Name = conf.HttpName
	agentServiceRegistration.ID = conf.HttpId
	agentServiceRegistration.Tags = conf.HttpTags
	httpAddr := fmt.Sprintf("http://%s/health", conf.HttpAddr)
	check := api.AgentServiceCheck{
		HTTP:                           httpAddr,
		Timeout:                        "3s",
		Interval:                       "1s",
		DeregisterCriticalServiceAfter: "3s",
	}
	agentServiceRegistration.Check = &check
	// 注册
	return client.Agent().ServiceRegister(agentServiceRegistration)
}

// 工具函数-获取所有服务列表
func GetServiceList() (map[string]*api.AgentService, error) {
	// 获取注册中心连接客户端
	client, err := GetConsulClient()
	if err != nil {
		return nil, err
	}
	services, err := client.Agent().Services()
	return services, err
}

// 工具函数-过滤服务
func FilterService(service string) (map[string]*api.AgentService, error) {
	// 获取注册中心连接客户端
	client, err := GetConsulClient()
	if err != nil {
		return nil, err
	}
	// 过滤条件
	filterCondition := fmt.Sprintf("Service==%v", service)
	services, err := client.Agent().ServicesWithFilter(filterCondition)
	return services, err
}
  • 这里,缓存了ConsulClient客户端
  • 提供了把http服务注册到consul 的方法
  • 提供了获取所有服务列表的方法
  • 提供了过滤当前服务的方法

4 ) main.go

package main

import (
	"gitee.com/go-micro-services/consul-http/conf"
	ctl "gitee.com/go-micro-services/consul-http/controller"
	"gitee.com/go-micro-services/consul-http/utils"
	"github.com/gin-gonic/gin"
)

func init() {
	// 到consul注册中心进行注册
	err := utils.ConsulHttpReg()
	if err != nil {
		panic(err)
	}
}

func main() {
	r := gin.Default()
	r.GET("/health", ctl.HealthHandler)                 // 提供一个 /health 接口
	r.GET("/serviceList", ctl.ServiceListHandler)       // 提供一个 /serviceList 展示
	r.GET("/currentService", ctl.CurrentServiceHandler) // 提供一个 /currentService 展示
	r.Run(conf.HttpAddr)                                // 运行当前http服务
}
  • 在 init 函数中注册到consul
  • 提供了三个路由:健康检查,获取所有服务,获取当前服务

运行效果


1 )运行后,可以看到立即进行了健康检查

2 ) 查看consul面板,发现已经注册成功,并且配置的信息都有了

可见,配置的一些信息都对应上了

3 ) /health 路由

4 ) /serviceList 路由

5 )/currentService 路由

其他

  • 源码地址:https://gitee.com/go-micro-services/consul-http
  • consul官方文档:https://developer.hashicorp.com/consul/docs/services/configuration/services-configuration-reference

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

插入耳麦耳机的麦克风线,但录入声音失败的解决办法

现状:可以查看到有麦克风,但说话时,音量条没有上升 解决:控制面板-语音识别。对头戴式耳机进行操作。 效果:完成后,用搜狗语音打字验证通过。 注意:电脑上还连接了个有线音箱,但说…

Python | Leetcode Python题解之第112题路径总和

题目: 题解: class Solution:def hasPathSum(self, root: TreeNode, sum: int) -> bool:if not root:return Falseif not root.left and not root.right:return sum root.valreturn self.hasPathSum(root.left, sum - root.val) or self.hasPathSum…

从0开始学统计-蒙彼利埃尔悖论与条件概率

1.什么叫均衡可比? "均衡可比"指的是在进行比较时,确保所比较的对象或情况具有相似的特征和条件,以保持比较的公正性和准确性。这个概念通常应用于研究设计和数据分析中,以确保比较结果的可信度和有效性。 在研究中&a…

用 Pyinstaller 模块将 Python 程序打包成 exe 文件

一、安装Pyinstaller pip install Pyinstaller二、将 Python 程序打包成 exe 文件 Pyinstaller -F -w sum_income.py参考文献 用 Pyinstaller 模块将 Python 程序打包成 exe 文件(全网最全面最详细,万字详述)

ESP32-C3模组上跑通OTA升级(9)

接前一篇文章:ESP32-C3模组上跑通OTA升级(8) 本文内容参考: 《ESP32-C3 物联网工程开发实战》 乐鑫科技 特此致谢! 七、固件版本 将不同功能的固件标记为不同版本是方便后期维护的一个重要手段。ESP-IDF提供了一些标…

MacPro中Ubuntu安装GNOME桌面

第一步,先在MacPro中安装UTM虚拟机。 查看另一文章: https://blog.csdn.net/qq_38382925/article/details/139157877?spm1001.2014.3001.5502 第二步,在虚拟机中安装Ubuntu ARM64 server 查看另一文章: https://blog.csdn.net/qq…

联想端游联运SDK接入指南

1. 接入流程 本文档主要介绍了 联想PC游戏SDK接入流程、联想游戏提供的功能、接入注意事项等。 1.1. 接入方式 1. 联想游戏SDK2.1版本支持“账号防沉迷支付”接入方式; a. 联想提供账号注册、登录等能力 b. 联想提供防沉迷服务 c. 联想提供游戏内支付 1.2. 对…

[MRCTF2020]Xor

32位程序 主要逻辑 flagMSAWB~FXZ:J:tQJ"N bpdd}8g for i in range(len(flag)):print(chr(ord(flag[i])^i),end)

Nature Communications | 柔性半导体器件的大规模集成(柔性半导体器件/柔性电子)

韩国中央大学Sung Kyu Park、 韩国成均馆大学Jong-Woong Kim和Yong-Hoon Kim团队,在《Nature Communications》上发布了一篇题为“Full integration of highly stretchable inorganic transistors and circuits within molecular-tailored elastic substrates on a large scal…

【OpenGL实践12】关于缓存区Framebuffer的运用

文章目录 一、说明二、帧缓冲区三、创建新的帧缓冲区四、附属装饰4.1 纹理图像4.2 渲染缓冲区对象图像 五、使用帧缓冲区5.1 后期处理5.2 更改代码 六、后期处理效果6.1 色彩处理6.2 模糊6.3 Sobel算子 七、结论练习 一、说明 关于FrameBuffer的使用,是OpenGL的高级…

九、图形化脚本

多年来, shell脚本一直都被认为是枯燥乏味的。但如果你准备在图形化环境中运行脚本时,就未必如此了。有很多与脚本用户交互的方式并不依赖read和echo语句。 9.1 创建文本菜单 创建交互式shell脚本最常用的方法是使用菜单。提供各种选项可以帮助脚本用户…

从浮点数定义到FP8: AI模型中不同的数据类型

背景:AI模型中不同的数据类型对硬件算力和内存的需求是不同的,为了提高模型在硬件平台的吞吐量,减少数据通信带宽需求,往往倾向于将高位宽数据运算转向较低位宽的数据运算。本文通过重新回顾计算机中整数和浮点数的定义&#xff0…

从0开始带你成为Kafka消息中间件高手---第二讲

从0开始带你成为Kafka消息中间件高手—第二讲 那么在消费数据的时候,需要从磁盘文件里读取数据后通过网络发送出去,这个时候怎么提升性能呢? 首先就是利用了page cache技术,之前说过,kafka写入数据到磁盘文件的时候&…

Go微服务: Grpc服务注册在Consul的示例(非Go-Micro)

概述 现在,我们使用consul客户端的api来把GRPC服务实现注册到consul上,非Go-Micro的形式其实,consul官方提供了对应的接口调用来实现,golang中的consul/api包对其进行了封装我们使用consul/api来进行展示 目录结构 gitee.com/g…

微信小程序上线必备:SSL证书申请以及安装

一、认识ssl证书 1、ssl证书是什么? SSL证书,全称Secure Socket Layer Certificate,是一种数字证书,它遵循SSL(现在通常指TLS,Transport Layer Security)协议标准,用于在客户端&…

C++ vector类

目录 0.前言 1.vector介绍 2.vector使用 2.1 构造函数(Constructor) 2.1.1. 默认构造函数 (Default Constructor) 2.1.2 填充构造函数 (Fill Constructor) 2.1.3 范围构造函数 (Range Constructor) 2.1.4 拷贝构造函数 (Copy Constructor) 2.2 迭代器(Iterator) 2.2.…

封装了一个iOS水平方向瀑布流布局

首先查看效果图 是支持多分区的 思路就是和竖直方向上的瀑布流布局是一样的, 只不过这里记录的列是水平方向的,同时要记录下 当前最小的x 所在的列,其实原理和竖直方向上的是相同的 ,下面贴出代码 父类layout中的代码 // // …

08-Fortran基础--Fortran内置函数分类总结

08-Fortran基础--Fortran内置函数分类总结 0 引言1 Fortran内置函数1.1 常用到数学函数1.2 字符串函数:1.3 数组函数:1.4 数值查询函数1.5 文件操作函数: 2 结语 0 引言 Fortran是一种很古老的编程语言,但它仍然广泛使用于科学计算…

使用LoRA进行高效微调:基本原理

Using LoRA for efficient fine-tuning: Fundamental principles — ROCm Blogs (amd.com) [2106.09685] LoRA: Low-Rank Adaptation of Large Language Models (arxiv.org) Parametrizations Tutorial — PyTorch Tutorials 2.3.0cu121 documentation 大型语言模型&#xf…

基于地理坐标的高阶几何编辑工具算法(7)——矩形绘制

文章目录 工具步骤应用场景示意图算法原理工具步骤 点击矩形绘制工具,点击三个点完成矩形绘制。 应用场景 用于在地图上快速绘制任意方向的矩形。 示意图 算法原理 点第一个点确定矩形的一个角点P1,也作为平移后的坐标原点,生成平移矩阵。点第二个点P2,确定矩形的一条边…