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

2024-05-26 09:44

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

2 ) controllers/ctl.go

package controllerimport ("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 utilsimport ("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.ConsulAddrConsulClient, 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.HttpHostagentServiceRegistration.Port = conf.HttpPortagentServiceRegistration.Name = conf.HttpNameagentServiceRegistration.ID = conf.HttpIdagentServiceRegistration.Tags = conf.HttpTagshttpAddr := 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 mainimport ("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

这篇关于Go微服务: Http服务注册在Consul的示例(非Go-Micro)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

MySQL CTE (Common Table Expressions)示例全解析

《MySQLCTE(CommonTableExpressions)示例全解析》MySQL8.0引入CTE,支持递归查询,可创建临时命名结果集,提升复杂查询的可读性与维护性,适用于层次结构数据处... 目录基本语法CTE 主要特点非递归 CTE简单 CTE 示例多 CTE 示例递归 CTE基本递归 CTE 结

Spring AI使用tool Calling和MCP的示例详解

《SpringAI使用toolCalling和MCP的示例详解》SpringAI1.0.0.M6引入ToolCalling与MCP协议,提升AI与工具交互的扩展性与标准化,支持信息检索、行动执行等... 目录深入探索 Spring AI聊天接口示例Function CallingMCPSTDIOSSE结束语

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到

PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例

《PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例》词嵌入解决NLP维度灾难,捕捉语义关系,PyTorch的nn.Embedding模块提供灵活实现,支持参数配置、预训练及变长... 目录一、词嵌入(Word Embedding)简介为什么需要词嵌入?二、PyTorch中的nn.Em

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont

Python Web框架Flask、Streamlit、FastAPI示例详解

《PythonWeb框架Flask、Streamlit、FastAPI示例详解》本文对比分析了Flask、Streamlit和FastAPI三大PythonWeb框架:Flask轻量灵活适合传统应用... 目录概述Flask详解Flask简介安装和基础配置核心概念路由和视图模板系统数据库集成实际示例Stre

Spring Bean初始化及@PostConstruc执行顺序示例详解

《SpringBean初始化及@PostConstruc执行顺序示例详解》本文给大家介绍SpringBean初始化及@PostConstruc执行顺序,本文通过实例代码给大家介绍的非常详细,对大家的... 目录1. Bean初始化执行顺序2. 成员变量初始化顺序2.1 普通Java类(非Spring环境)(

Java Spring的依赖注入理解及@Autowired用法示例详解

《JavaSpring的依赖注入理解及@Autowired用法示例详解》文章介绍了Spring依赖注入(DI)的概念、三种实现方式(构造器、Setter、字段注入),区分了@Autowired(注入... 目录一、什么是依赖注入(DI)?1. 定义2. 举个例子二、依赖注入的几种方式1. 构造器注入(Con

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

Spring Boot 3.x 中 WebClient 示例详解析

《SpringBoot3.x中WebClient示例详解析》SpringBoot3.x中WebClient是响应式HTTP客户端,替代RestTemplate,支持异步非阻塞请求,涵盖GET... 目录Spring Boot 3.x 中 WebClient 全面详解及示例1. WebClient 简介2.