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

【Consul】构建高效的服务治理体系:基于Golang实现Consul服务的注册、注销、修改、监控注册的服务变化、实时同步服务信息机制 【Consul】基于Golang实现Consul服务的注册、注销、修改、监控注册的服务变化、实时同步服务信息机制 寸铁手把手带你实现Consul服务的注册、注销、修改、监控服务变化,实时同步长轮询信息机制! 阅读详情

概述

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

其他

【项目总结】c++与go语言基于HTTP 协议的服务注册中心【c++与golang】 服务注册中心是一种用于实现微服务架构的基础设施,用于管理和维护服务的注册、发现、负载均衡等功能。它可以让不同的服务通过一个中心化的方式进行管理,降低了服务之间的耦合性,提高了服务之间的可扩展性和可维护性。使用HTTP通信可以简化注册中心的实现,因为HTTP是一种开放的、标准的协议,很容易被不同的语言和框架支持。自定义Header字段可以传递更多信息,扩展性非常强,可以根据不同的需求设计不同的字段。 阅读详情

相关推荐

go微服务-go-micro框架介绍

go-micro框架介绍 文章目录go-micro框架介绍一、micro框架介绍1.1、背景1.2、概述1.3、micro组成1.4、工具包介绍1.4.1、API1.4.2、Web1.4.3、Sidecar1.4.4、Bot1.4.5、CLI1.4.6、Go-Micro1.5、Go-Micro特性1.6、环境安装1.6.1、安装consul1.6.2、安装protobuf和依赖1.6.3、micro工具包安装(可选择)1.6.4、1Go-micro安装二、创建微服务2.1、服务的定义2.2、初始化服务实例

qq_49723651的博客 4612

Consul实现http或者grpc服务的注册与发现,Golang、Python的使用记录

consul官网Consul包含多个组件,但是作为一个整体,为你的基础设施提供服务发现和服务配置的工具.他提供以下关键特性:服务发现 Consul的客户端可用提供一个服务,比如 api 或者mysql ,另外一些客户端可用使用Consul去发现一个指定服务的提供者.通过DNS或者HTTP应用程序可用很容易的找到他所依赖的服务.健康检查 Consul客户端可用提供任意数量的健康检查,指定一个服务(比如:webserver是否返回了200 OK 状态码)或者使用本地节点(比如:内存使用是否大于90%). 这个信

Neo 8316

微服务:go-microv4服务注册与发现+consul服务

因为项目需要,要使用go-micro框架,将已经实现的网站功能转到微服务里面实现,所以经过了许许多多踩坑之后终于实现了初步的demo。本文会记录实现过程和中间遇到的问题,希望能帮助到大家。

qq_34106714的博客 1134

【Consul】Consul实践指导-HTTP API

Consul提供RESTful HTTP API. API可对节点、服务、健康检查、配置等执行CRUD操作(CRUD是指在做计算处理时的增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete))。Endpoint使用版本号标记变化,并支持后向兼容性。...

渡江客涂鸦板 8210

consul-cli, HTTP API的命令行 接口.zip

consul-cli, HTTP API的命令行 接口 cli 命令行 接口到 Consul子命令命令摘要acl/acl 端点端点代理程序/agent 端点端点目录/catalog 端点端点检查/agent/check 端点端点坐标/co

【智能体评测】BrowserUse:一款超越 Anthropic Computer Use 的开源智能体

本文将全面介绍 BrowserUse 的核心功能、配置与使用方法,以及通过多场景测试评估其性能。

surfirst的博客 4099

GO微服务开发中consul注册中心使用详解

很多初学者在刚刚接触微服务时对服务注册中心了解较少,本文详细介绍什么是consul以及consul怎么用

weixin_63603830的博客 863

【拯救C盘】一文搞懂Windows修改Anaconda默认的虚拟环境存放路径及其原理

Anaconda创建的虚拟环境可能会默认保存在C盘,但C盘的存储空间很宝贵,由于每个虚拟环境的大小可能达到n个GB,稍不注意就会遇到C盘红色警告。因此有必要做点什么来拯救被虚拟环境占用的大部分空间!!!

Roach007的博客 3万+

[Go 微服务] go-micro + consul 的使用

go-micro + consul 的使用

959 2044

【开关】刀开关矩阵(Pole Switched Matrix)的结构讨论

矩阵主要有交叉点矩阵和树形矩阵两种矩阵结构。 交叉点矩阵是由SPST继电器排列成简单的网格形式的阵列组成;树形矩阵是由树形的多路复用模块组成,为需要高频RF带宽的应用提供解决方案。在搭建这些矩阵的同时,也限制了可提供的连接性。这也是为什么有的矩阵是简单的交叉点矩阵,而有的矩阵的交叉点中嵌入隔离继电器用来提供中间带宽的矩阵。 但是,Pickering Interfaces提供的另外一种矩阵类型其...

Tina的博客 4409

世界模型和大语言模型结合开发自动驾驶算法

摘要:自动驾驶系统开发中,融合世界模型和大语言模型可显著提升效率和安全性。世界模型负责环境感知与预测(如目标检测、轨迹预测),而大语言模型优化代码生成、决策解释等环节。实施路径包括需求分析(1-2周)、模型开发(2-4个月)、模拟测试(1-2个月)、实车测试(2-3个月)和合规优化(1-2个月),总周期6-12个月。关键技术工具包括PyTorch/TensorFlow、CARLA模拟器和ROS系统,核心设计理念强调模块化、安全优先和敏捷迭代。示例代码展示了YOLO目标检测与大语言模型决策建议的集成方案。该方

ponygame的博客 827

[golang 微服务] 7. go-micro框架介绍,go-micro脚手架,go-micro结合consul搭建微服务案例

go-micro框架介绍,go-micro脚手架,go-micro结合consul搭建微服务案例

资深系统架构,深耕高并发研发与 AI 大模型工程化落地。技术栈以 Python (AI/NLP/RAG/Agent) 与 Golang (高并发架构) 为双核心,兼具 PHP 大型应用经验。专注算法落地、复杂系统设计及团队技术赋能 6967

Arnold Denoise流程

参考:https://support.solidangle.com/display/ARP/Removing+Noise+Workflow Arnold生来不是一个以单帧渲染速度见长的渲染器,但这并不能作为一个简单场景渲染时间长达几个小时的借口。 个人认为高品质生产级渲染结果中,Unbiased renderer在渲染时最耗计算时间的其实就是降噪,以至于降噪专门成了一门灯光师必备的技术

机器猫的CG空间 5084

【启程Golang之旅】Go-Micro框架的高效开发技巧

欢迎来到Golang的世界!在当今快节奏的软件开发领域,选择一种高效、简洁的编程语言至关重要。而在这方面,Golang(又称Go)无疑是一个备受瞩目的选择。在本文中,带领您探索Golang的世界,一步步地了解这门语言的基础知识和实用技巧。

ztK63LrD的博客 1831

Agent 操作系统:未来的 Harness 平台

在大模型技术爆发的当下,自主智能体(Agent)已经成为AI原生应用的核心载体,但当前Agent开发面临着碎片化严重、运维难度高、规模化落地难三大核心痛点,就像1970年代没有通用操作系统的裸机编程时代,开发者需要重复造轮子解决底层基础设施问题。本文将深度解析Agent操作系统(Agent OS)作为AI原生时代的底层基础设施的核心定位,以及下一代Harness平台如何将Agent OS与成熟的DevOps、CI/CD、可观测性、成本管理能力深度融合,成为AI原生应用全生命周期管理的统一平台。

软件工程实践的博客 280

CoDeSys系列-3、Windows运行时软PLC主站和p-net从站IO设备组网测试

前面CODESY下载安装并熟悉了,p-net搭建从站也已经跑在虚拟机树莓派上了,我们只需要快速搭建一个profinet主站来和从站进行交互即可,这里我们直接用Windows下带的软PLC搭建profinet主站并和p-net的demo从站程序进行IO交互。评估是否进行Windows下的运行时PLC前先看一下注意事项,Windows下安装配置会需要修改boot及防火墙等,可能会影响Windows电脑的正常使用,所以创建项目时的设备可以选择非RTE的。

逍遥游的博客 7315

go-micro框架介绍

介绍go微服务框架go-micro

js010111的博客 7373

在 ABAP 中把变量一次写对:深入理解 FINAL 内联声明与不可变变量

摘要:ABAP中的FINAL声明操作符用于定义不可变变量,强调"当前上下文中的唯一写位置",能有效防止变量被意外修改,提升代码健壮性和可读性。官方建议优先在单次赋值的场景使用FINAL替代DATA。其核心规则包括:1)写位置唯一但可多次执行(如循环内);2)不创建块级作用域;3)对引用变量仅约束引用本身而非对象内容。典型适用场景包括:结果值只读、输入快照保存和中间结果保护。例外情况如游标变量不适用,因需多次写操作。正确使用FINAL可显著降低代码维护风险。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1046

consul golang使用_go-micro+gin+consul微服务实战之使用http api请求

本文是基于上一篇【go-micro+gin+consul微服务实战之服务注册与发现】的,没看过的同学,请移步:https://www.jianshu.com/p/757dc1bb3930我们在使用微服务构建系统时,必然会用到http api,下面介绍下,在如何使用go-micro自带的http库构建http api 请求我们还使用上一篇【go-micro+gin+consul微服务实战之服务注册与...

weixin_39562606的博客 380

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

go-micro + consul

https://www.jianshu.com/p/a94ca773342a(还没有完全理解透) 验证而tls下使用http2协议(抓包分析) ------------------------------------------------ 1.启动micro web服务(这个类似micro的dashboard,可以看到注册的服务,有一个简单的请求发起测试功能) micro --reg...

xiaoxiaoyu85的专栏 1063

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

基于go-micro微服务的实战-实现网关Gateway(三)

go-micro v3的实现网关Gateway

toegg的博客 1847

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

go微服务学习 go-micro框架(一)

本节简单介绍micro和consul,具体使用放在下一节 1 micro简介 在了解go-micro之前,我们先来了解一下什么是micro。 Micro解决了在云内外构建分布式系统的关键要求。它利用微服务体系结构模式,并提供一组作为平台构建基块的服务. Micro 处理分布式系统的复杂性,并提供更简单的可编程抽象. Micro是一个专注于简化分布式系统开发的微服务生态系统。由开源库和工具组成。主要包含以下几种库: go-micro用于编写微服务的可插入Go-RPC框架; 服务发现,客户端/服务器rpc,

weixin_44336181的博客 1719

Gin+Go-Micro简单小案例

1.go环境配置 [guest@localhost test]$ vi /etc/profile ... export GOROOT=/usr/local/go export GOBIN=/root/go/bin export GOPATH=/root/go export PATH=$PATH:$GOBIN export PATH=$PATH:$GOROOT/bin [guest@localhost test]$ source /etc/profile 2.micro框架安装 [guest@localho

jstang的博客 5377

Go-Micro 简介

Go-Micro 简介

闲余知道 966

go微服务框架go-micro架构学习(源码分析)

产品嘴里的一个小项目,从立项到开发上线,随着时间和需求的不断激增,会越来越复杂,变成一个大项目,如果前期项目架构没设计的不好,代码会越来越臃肿,难以维护,后期的每次产品迭代上线都会牵一发而动全身。项目微服务化,松耦合模块间的关系,是一个很好的选择,随然增加了维护成本,但是还是很值得的。 微服务化项目除了稳定性我个人还比较关心的几个问题: 一: 服务间数据传输的效率和安全性。 ...

weixin_42117918的博客 3200

QOR CMS + Go-Micro 微服务架构完整配置指南

本文介绍了如何将QORCMS单体应用与Go-Micro微服务框架集成,构建分布式内容管理系统。主要内容包括: 架构设计:通过API网关层(microapi)将HTTP请求转换为RPC调用,将QOR功能拆分为独立微服务(文章、栏目、用户等),使用Consul/Nacos实现服务发现。 技术实现: 使用Go-Micro CLI工具快速创建服务模板 定义Proto接口并生成代码 复用QOR现有业务逻辑实现微服务 配置API网关实现HTTP到RPC的自动路由 部署方案: Docker容器化各服务 使用Docker

分享AI、区块链技术及应用,未来已来 635
上一篇: Typescript高级: 深入理解交叉类型与联合类型
下一篇: Go微服务: Grpc服务注册在Consul的示例(非Go-Micro)
Wang's Blog
博客等级 码龄12年 7433粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值