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

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

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

相关文章

设计模式7——建造者模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。 建造者模式(Builde…

VMware ESXi 7.0 U3q 发布 - 领先的裸机 Hypervisor

VMware ESXi 7.0 U3q 发布 - 领先的裸机 Hypervisor VMware ESXi 7.0 Update 3 Standard & All Custom Image for ESXi 7.0U3 Install CD 请访问原文链接:https://sysin.org/blog/vmware-esxi-7-u3/,查看最新版。原创作品,转载请保留出…

3小时-入门短视频创作:短视频创作入门必修(15节视频课)

课程目录 1、先导课.mp4 2、建立视听思维.mp4 3、口语化.mp4 4、具象化.mp4 5、建立选题思维.mp4 6、2个小白好上手的选题技巧.mp4 7、建立开场思维.mp4 8、3个口播视频方能开场套路.mp4 9、建立脚本结构思维.mp4 10、爆款口指的3大结构.mp4 11、建立标题思维.mp4 …

https为何安全?

HTTPS(超文本传输安全协议)是一种用于安全通信的网络协议,它在HTTP协议的基础上通过SSL/TLS(安全套接层/传输层安全)协议来加密数据,以保护网络数据的传输安全。 TLS/SSL 基础概念 概念源自百度百科&…

内存的基本知识与连续分配管理

目录 一. 内存的基础知识1.1. 什么是内存1.2 指令的工作原理1.2.1 装入的三种方式 - 绝对装入1.2.2 可重定位装入1.2.3 动态重定位装入1.3 从写程序到程序运行 二. 基本内存管理的概念三. 覆盖与交换3.1 覆盖技术3.2 交换技术 四. 连续分配管理方式4.1 单一连续分配4.2 固定分区…

【全开源】知识答题系统源码小程序(FastAdmin+ThinkPHP+Unipp)

打造智慧问答的基石 一、引言:知识答题系统的时代意义 在信息爆炸的时代,知识答题系统源码作为一种高效、有趣的知识传播方式,受到了越来越多人的关注和喜爱。通过搭建知识答题系统,我们可以将海量的知识内容以答题的形式展现给…

网络协议——Modbus-TCP

目录 1、简介 2、Modbus-TCP与Modbus-RTU的区别 3、消息格式 4、功能码01H 5、功能码02H 6、功能码03H 7、功能码04H 8、功能码05H 9、功能码06H 10、功能码0FH 11、功能码10H 1、简介 Modbus-TCP(Modbus Transmission Control Protocol)是一…

【linux】g++/gcc编译器

目录 背景知识 gcc如何完成 预处理(进行宏替换) 编译(生成汇编) 汇编(生成机器可识别代码) 链接(生成可执行文件或库文件) 在这里涉及到一个重要的概念:函数库 函数库一般分为静态库和动态库两…

DOS学习-目录与文件应用操作经典案例-comp

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.使用 三.案例 案例 1: 基本比较 案例 2: 十进制显示差异 案例 3: 字符形式显…

【数据结构】二叉树和堆

文章目录 一、 什么是二叉树二、 二叉树的存储结构顺序存储视图 三、 堆堆的结构及概念大堆和小堆 四、 建堆五、 堆排序六、 topk问题 一、 什么是二叉树 二叉树,作为一种重要的数据结构,由节点组成,每个节点可以有两个子节点,通…

精品丨快速申请免费https证书

https域名证书对提高网站排名有一定的好处,所以当今很多企业为了给网站一个好的安全防护,就会去申请该证书。如今很多企业虽然重视网站的安全防护,但是也重视成本,所以为了节约成本会考虑申请免费的https证书。 第一个好处 企业不…

阻塞信号集和未决信号集_代码实现

1. 程序验证内容 将编号为0,1,2添加到阻塞信号集中&#xff0c;i<信号编号时&#xff0c;发出信号&#xff0c;观察未决信号集状态 当解除阻塞后&#xff0c;原先的信号是否执行&#xff0c;执行顺序是什么 2. 代码实现 #include <unistd.h> #include <stdlib.h…

Mac彩球一直转圈怎么解决 苹果电脑经常卡住 mac电脑运行慢怎么办

用Mac电脑办公的朋友在操作体积比较大的程序时&#xff0c;比如Final Cut Pro或者Photo Shop&#xff0c;一定遇到过鼠标变更彩球并不停转圈。这是怎么回事&#xff1f;今天本文就告诉大家Mac彩球一直转圈怎么解决&#xff0c;以及苹果电脑经常卡住是什么原因。 一、Mac彩球一直…

Wireshark 搜不到字符串?

一个原因是pcap里没有这个字符串&#xff0c; 另一个原因可能是ctrlF之后&#xff0c;选择搜索的地方不对&#xff0c;或者是编码方式选择的不对。 上面图片的第一个下拉框是要搜索的一个范围&#xff0c;是在哪一个panel搜索&#xff0c;范围说明在下面这个链接有详细说明&…

Java | Leetcode Java题解之第100题相同的树

题目&#xff1a; 题解&#xff1a; class Solution {public boolean isSameTree(TreeNode p, TreeNode q) {if (p null && q null) {return true;} else if (p null || q null) {return false;}Queue<TreeNode> queue1 new LinkedList<TreeNode>();…

【QGIS入门实战精品教程】10.6:QGIS制作酒店分布热力图

相关阅读: ArcGIS实验教程——实验四十二:ArcGIS密度分析(核密度、点密度、线密度) 【ArcGIS微课1000例】0086:基于七普人口数据的人口密度分析与制图 ArcGIS实验教程——实验二十四:人口密度制图 文章目录 一、加载酒店分布数据二、热力分析一、加载酒店分布数据 订阅专…

Python 新手最容易踩的坑

Python新手最容易踩的坑 缩进错误忘记引入模块使用未定义的变量不理解变量作用域字符串格式化错误乱用关键字多余的符号本期图书推荐&#xff1a;Python算法小讲堂---39个算法案例带你玩转Python内容简介获取方式 在学习 Python 的过程中&#xff0c;新手往往会遇到一些常见的陷…

全免费的数据恢复工具哪个好?分享2024年性价比超高的12款数据恢复软件!

当您丢失重要文件时&#xff0c;您应该可不想遇到措手不及的情况吧&#xff1f;相反&#xff0c;您需要在系统中使用一些可靠的数据恢复软件&#xff0c;但是全免费的数据恢复工具哪个好呢&#xff1f;别担心&#xff0c;本文将帮助您选择最适合您的解决方案。 如何挑选一款合适…

栈和队列OJ题详解

一.有效的括号&#xff1a; 20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 首先拿到这个题目&#xff0c;我的第一个思路是利用双指针来走&#xff0c;看看是不是匹配的 但是这种情况就把双指针的这个思路直接pass了&#xff0c;明明是匹配的括号&#xff0c;用双指…

Android Audio基础——AudioFlinger回放录制线程(七)

AndioFlinger 作为 Android 的音频系统引擎,重任之一是负责输入输出流设备的管理及音频流数据的处理传输,这是由回放线程 PlaybackThread 及其派生的子类和录制线程 RecordThread 进行的。 一、基础介绍 1、关系图 ThreadBase:PlaybackThread 和 RecordThread 的基类。 Re…