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

news2024/11/5 2:12:11

概述

  • 现在,我们使用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

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

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

相关文章

Day39贪心算法part06

LC738单调递增的数字(未掌握) 思路分析:一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]–,然后strNum[i]给为9字符串是不可变的,不可以使用s.char…

图像处理案例01

案例01 例011.1 目标1.2 步骤1.3 代码 例01 1.1 目标 找出图形中的圆弧。 1.2 步骤 读入图像。彩色图转灰度图。图像处理。读灰度图阈值分割,得到img_thre,除掉图中的蓝色和绿色,只留下白色。对img_thre做水平梯度得到gx,这样…

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

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

飞机大战游戏实现揭秘

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、游戏概览与核心玩法 二、游戏模块详解 1. 游戏主循环模块 2. 创建初始化模块 三、关…

LeetCode:74.搜索二维矩阵

class Solution(object):def searchMatrix(self, matrix, target):M, N len(matrix), len(matrix[0])for i in range(M):for j in range(N):if matrix[i][j] target:return Truereturn False代码解释 这段代码定义了一个名为 Solution 的类,其中包含一个方法 sea…

华为OD机试【找出通过车辆最多颜色】(java)(100分)

1、题目描述 在一个狭小的路口,每秒只能通过一辆车,假设车辆的颜色只有 3 种,找出 N 秒内经过的最多颜色的车辆数量。 三种颜色编号为0 ,1 ,2。 2、输入描述 第一行输入的是通过的车辆颜色信息[0,1,1,2] &#xff0…

【gradle】MAC下用gradle构建部署springboot项目

MAC下用gradle构建部署springboot项目 前言下载安装配置gradle下载安装下载可能出现的问题 (zsh: command not found: brew) 配置环境变量配置国内下载源全局配置单个项目配置 通过idea构建项目构建后的项目结构 小结延伸 前言 好久以前就听说gradle了&…

CentOS 7安装alertmanager

说明:本文介绍如何在CentOS 7安装alertmanager; Step1:下载安装包 访问Github仓库,下载对应版本的alertmanager安装包 https://github.com/prometheus/alertmanager/releases 如何查看自己系统的信息,可参考下图中的…

求斐波那契数列第n项的值

本期介绍🍖 主要介绍:什么是斐波那契数列,递归实现求斐波那契数列第n项值,递归法为什么不适合求斐波那契数,用迭代法实现求斐波那契数列的值👀。 文章目录 1. 斐波那契数列是什么?2. 题目2. 递归…

HTML+CSS 玻璃按钮

效果演示 Code <!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>玻璃按钮</title><li…

游戏子弹类python设计与实现详解

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、子弹类设计思路 1. 属性定义 2. 方法设计 三、子弹类实现详解 1. 定义子弹…

ubuntu openvoice部署过程记录,解决python3 -m unidic download 时 unidic无法下载的问题

github给的安装顺序&#xff1a; conda create -n openvoice python3.9 conda activate openvoice git clone gitgithub.com:myshell-ai/OpenVoice.git cd OpenVoice pip install -e .安装MeloTTS: pip install githttps://github.com/myshell-ai/MeloTTS.git python -m unid…

从0开始学统计-方差分析

1.什么是方差分析&#xff1f; 方差分析&#xff08;ANOVA&#xff0c;Analysis of Variance&#xff09;是一种统计方法&#xff0c;用于比较三个或三个以上组之间的平均值是否存在显著差异。它适用于以下情况&#xff1a; &#xff08;1&#xff09; 当我们有三个或三个以上…

asrpro softspi SD卡读写

采样 50M 1M&#xff1b;采样时间足够长&#xff0c;采样频率1M 避免信息遗漏 引脚 cs pa2 mosi pa3 sck pa5 miso pa6 vcc ->5v gnd ->gnd ARDUINO SD库与移植&#xff08;原本是打算移值tw ch32v103的sd库的&#xff0c;但没有对比&#xff0c;只能选择arduino ; …

11.jenkins调整上线的脚本实现tag方式上线

jenkins调整上线的脚本实现tag方式上线 多次打标签重新提交到gitlab远程仓库-基于multi-line string parameter 修改脚本html_deploy_tar.sh #!/usr/bin/bashDate$(date %F-%H-%M) web_server"192.168.111.22 192.168.111.23" Name${Date}-${git_version} code_t…

etcd集群部署

1.etcd介绍 1.1 什么是etcd etcd的官方定义如下: A distributed, reliable key-value store for the most critical data of distributed systemetcd是一个Go语言编写的分布式、高可用的一致性键值存储系统,用于提供可靠的分布式键值(key value)存储、配置共享和服务发现等…

学习Uni-app开发小程序Day18

昨天学习了使用轮播显示图片和文字&#xff0c;轮播方式纵向和横向。今天使用扩展组件和scroll-view显示图片&#xff0c;使用scroll-view的grid方式、插槽slot、自定义组件、磨砂背景定位布局做专题组件 这就是需要做成的效果&#xff0c;下面将一步一步的完成。 首先&#x…

005、API_数据结构

键的数据结构类型&#xff0c;它们分别是&#xff1a; string&#xff08;字符串&#xff09;、hash&#xff08;哈希&#xff09;、list&#xff08;列表&#xff09;、set&#xff08;集合&#xff09;、zset&#xff08;有序集 合&#xff09;&#xff0c;这些只是Redis对外…

word 全文中 英文字体 和 样式的字体 莫名奇妙地 被改成 “等线”

word全文中英文字体和样式的字体莫名奇妙地被改成“等线” sm word又抽风了&#xff0c;改完论文保存后打开突然发现全文字体都不对劲&#xff0c;吓得冷汗直冒&#xff1a;虽然我用git管理了论文版本&#xff0c;但是只有比较大的修改我才上传了&#xff0c;刚刚修了几个小时…

Pycharm2024搭建QT6开发环境

创建pyqt6虚拟环境 首先&#xff0c;创建一个qt6的虚拟环境&#xff1a; conda create --name pyqt6 python3.11.7激活环境&#xff1a; conda activate pyqt6安装pyqt6 安装pyqt6&#xff1a; pip install pyqt6创建代码目录 创建目录&#xff1a; 使用pycharm打开这个…