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彩球一直…

python03--元组-字典-集合

一、元组 tuple 数据形式 (数据1,数据2&#xff0c;数据3.....) 元组数据是不可修改&#xff0c;数据是有序的&#xff0c;支持下标获取数据 无法增加,修改&#xff0c;删除数据,只能进行数据查询 1-1 元组定义 # 元组定义 data_tuple1 (1,2,3,4) data_tuple2 (1.2,2.34,3.1…

Linux基础命令常见问题解决方案

Linux 基础命令常见问题解决方案 在Linux的日常使用中&#xff0c;用户经常会遇到各种各样的问题。本文旨在提供一个关于Linux基础命令的常见问题及其解决方案的全面指南。我们将覆盖30种不同的错误场景&#xff0c;并给出具体的解决步骤和示例&#xff0c;帮助初学者快速定位…

Wireshark 搜不到字符串?

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

面试2. c++面试(领为军融)

1本段代码是否存在问题&#xff1f;. #include <iostream> void main() {for (unsigned short idx 0;idx <65535; idx){std::cout << idx <<std::endl;}std::cout<<"Execution completed!"<<std::endl; }解析&#xff1a; (1)可靠…

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实验教程——实验二十四:人口密度制图 文章目录 一、加载酒店分布数据二、热力分析一、加载酒店分布数据 订阅专…

【数据结构与算法 | 基础篇】双向循环链表模拟双端队列

1. 前言 前文我们分别用链表&#xff0c;数组来实现了栈和队列. 而双端队列可以替代栈和队列并达到二者的效果.我们知道&#xff0c;栈的特点是只在栈顶操作元素&#xff0c;队列的特点是在队头pop元素&#xff0c;在队尾push元素. 而双端队列可以在队头和队尾分别进行pop与pu…