golang学习笔记19——golang做服务发现与注册的深度剖析
- 推荐学习文档
- golang应用级os框架,欢迎star
- golang应用级os框架使用案例,欢迎star
- 案例:基于golang开发的一款超有个性的旅游计划app经历
- golang实战大纲
- golang优秀开发常用开源库汇总
- 想学习更多golang知识,这里有免费的golang学习笔记专栏
文章目录
- 引言
- 服务发现与注册的基本概念
- 1.服务发现
- 2.服务注册
- 常见问题及解决方案
- 1.注册中心的高可用性
- 2.服务实例的健康检查
- 3.服务发现的实时性
- 4.服务发现的负载均衡
- 总结
引言
在微服务架构中,服务发现与注册是核心组件之一。它确保各个微服务能够相互找到并进行通信。在 Go 语言开发中,虽然有多种工具和库可用于服务发现与注册,但仍会遇到一些问题。本文将详细探讨这些问题并给出相应的解决方案,同时配合代码示例进行说明。
服务发现与注册的基本概念
1.服务发现
服务发现是指在一个分布式系统中,服务消费者能够自动地找到服务提供者的网络位置(如 IP 地址和端口号)的过程。
2.服务注册
服务注册是指服务提供者在启动时,将自身的服务信息(如服务名称、IP 地址、端口号等)注册到一个中心化的服务注册中心或者分布式的注册网络中。
常见问题及解决方案
1.注册中心的高可用性
注册中心本身可能成为单点故障。如果注册中心出现故障,新的服务实例无法注册,已有的服务实例也无法被发现,这将导致整个微服务架构陷入混乱。
- 解决方案
- 使用高可用的注册中心集群。例如,Consul 支持多数据中心的部署,可以在不同的数据中心部署多个 Consul 节点,通过数据同步来保证服务注册信息的一致性和高可用性。
- 代码示例(以 Consul 为例):
package mainimport ("log"consulapi "github.com/hashicorp/consul/api"
)func main() {// 创建 Consul 客户端config := consulapi.DefaultConfig()client, err := consulapi.NewClient(config)if err!= nil {log.Fatal("创建 Consul 客户端失败: ", err)}// 注册服务registration := new(consulapi.AgentServiceRegistration)registration.ID = "my-service-1"registration.Name = "my-service"registration.Address = "127.0.0.1"registration.Port = 8080err = client.Agent().ServiceRegister(registration)if err!= nil {log.Fatal("服务注册失败: ", err)}log.Println("服务注册成功")
}
2.服务实例的健康检查
注册中心可能仍然保留着已经故障或者不健康的服务实例的注册信息,这会导致服务消费者调用到不可用的服务实例。
- 解决方案
- 配置服务注册中心的健康检查机制。服务提供者在注册服务时,同时注册健康检查的接口或者脚本。注册中心定期调用这些健康检查接口来判断服务实例是否健康。
- 继续以 Consul 为例的代码示例:
registration.Check = &consulapi.AgentServiceCheck{HTTP: "http://127.0.0.1:8080/health",Interval: "10s",
}
3.服务发现的实时性
服务注册信息的更新可能存在延迟,导致服务消费者不能及时发现新的服务实例或者已下线的服务实例的变化。
- 解决方案
- 优化注册中心的内部数据同步机制,尽量减少数据同步的延迟。
服务消费者可以采用主动拉取和被动通知相结合的方式。例如,定期主动从注册中心拉取服务实例列表,同时注册中心在服务实例状态发生变化时,主动通知服务消费者。
- 优化注册中心的内部数据同步机制,尽量减少数据同步的延迟。
- 以下是一个简单的服务消费者示例,使用 Go 语言的 channel 来模拟被动通知:
package mainimport ("fmt""time"
)func serviceConsumer(serviceList chan []string) {for {services := <-serviceListfmt.Println("当前可用服务列表: ", services)// 进行服务调用等操作time.Sleep(5 * time.Second)}
}func main() {serviceList := make(chan []string)go serviceConsumer(serviceList)// 模拟注册中心通知服务实例变化for i := 0; i < 5; i++ {serviceList <- []string{"service1", "service2"}time.Sleep(10 * time.Second)}
}
4.服务发现的负载均衡
即使服务发现机制能够正确地找到所有可用的服务实例,但如果没有合理的负载均衡策略,可能会导致某些服务实例负载过重,而其他服务实例负载过轻。
- 解决方案
- 实现多种负载均衡算法,如轮询、随机、加权轮询、一致性哈希等。根据服务的特性和实际需求选择合适的负载均衡算法。
- 以下是一个简单的加权轮询负载均衡示例:
package mainimport ("fmt""math/rand""time"
)type ServiceInstance struct {name stringweight intcurrent int
}func weightedRoundRobin(instances []ServiceInstance) string {totalWeight := 0for _, instance := range instances {totalWeight += instance.weight}rand.Seed(time.Now().UnixNano())randomValue := rand.Intn(totalWeight)for _, instance := range instances {if randomValue < instance.current+instance.weight {instance.current += totalWeightreturn instance.name}instance.current += instance.weight}return ""
}func main() {instances := []ServiceInstance{{name: "service1", weight: 3},{name: "service2", weight: 2},{name: "service3", weight: 1},}for i := 0; i < 10; i++ {selected := weightedRoundRobin(instances)fmt.Println("选择的服务实例: ", selected)}
}
总结
在 Go 语言的微服务开发中,服务发现与注册是至关重要的环节。通过解决注册中心的高可用性、服务实例的健康检查、服务发现的实时性以及负载均衡等问题,可以构建更加稳定、高效的微服务架构。
关注我看更多有意思的文章哦!👉👉
相关文章:
golang学习笔记19——golang做服务发现与注册的深度剖析
推荐学习文档 golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔…...

ROS和ROS2借助智能大模型的学习和研究方法
机器人相关知识的本身和价值-CSDN博客 知识本身在智能时代毫无价值,需要基于知识应用和创新才有价值。 学历报废并非来自扩招,而是智能模型的快速发展。-CSDN blink-领先的开发者技术社区 2024年中秋,智能模型实力已经如此,但还…...
弹性负载均衡ELB 详解和设置方法
一、弹性负载均衡ELB 详解 1. 定义与概念 弹性负载均衡(Elastic Load Balancing,简称ELB)是一种将访问流量自动分发到多台云服务器的流量分发控制服务。它通过在多个后端服务器之间均衡分配请求,提高应用程序的可用性、可扩展性…...

Python3网络爬虫开发实战(15)Scrapy 框架的使用(第一版)
文章目录 一、Scrapy 框架介绍1.1 数据流1.2 项目结构1.3 Scrapy 入门 二、Selector 解析器2.1 XPath 和 CSS 选择器2.2 信息提取2.3 正则提取 三、Spider 的使用3.1 Spider 运行流程3.2 Spider 类分析3.3 Request3.4 Response 四、Download Middleware 的使用4.1 process_requ…...
大众点评代发排名骗局
大众点评代发排名骗局 不诋毁同行,不贬低对手,请各位老板擦亮眼睛,认真看完这篇文章,以防上当受骗#网络宣传#企业推广#企业推广 大众点评代发排名:一场精心编织的骗局 在这个美食如云的时代&…...

硬件基础知识
驱动开发分为:裸机驱动、linux驱动 嵌入式:以计算机技术为基础,软硬结合的、可移植、可剪裁的专用计算机 单片机最小单元:vcc gnd reset 晶振 cpu --- soc :system on chip 片上外设 所有的程序都是在soc(cpu&…...

使用gitee如何回滚上一个版本,简单操作方式-gitee自带功能无需使用代码
使用gitee如何回滚上一个版本,简单操作方式-gitee自带功能无需使用代码,很多朋友使用代码的话容易出错,gitee自带了本功能: 找到gitee代码仓库,找到对应的想要回滚的版本点击进去 点击revert,选择自己对应的…...

独立站技能树之建站33项自检清单 1.0丨出海笔记
很多时候大家建好站之后很嗨,但过一会就开始担忧各种纠结我是不是还有什么点没做好,或者我的站漏了什么东西,那么接下来以下这个独立站自检清单能很好的帮到你。其实对于新手我还是建议大家直接用一些模板,因为模板上面基本该有的…...
js进阶-作用域是什么
经过前面80多篇文章对js相关内容的讲解,相信大家对js这门语言已经有了一定的知识储备,也掌握了这门语言的相关特性,领会到这门语言的魅力所在,所以从今天开始,会定期更新js进阶相关知识,大家可以持续关注&a…...
ant-design表格自动合并相同内容的单元格
表格自动合并相同内容的单元格 合并hooks import { TableColumnProps } from antdexport const useAutoMergeTableCell <T extends object>(dataSource: Array<T>,columns: Array<TableColumnProps> | Array<keyof T> ): Map<keyof T, Array<…...

通过多模态关系图学习实现可解释的医学图像视觉问答|文献速递--Transformer架构在医学影像分析中的应用
Title 题目 Interpretable medical image Visual Question Answering via multi-modal relationship graph learning 通过多模态关系图学习实现可解释的医学图像视觉问答。 01 文献速递介绍 医学视觉问答(VQA)是医学多模态大语言模型(LL…...

从入门到精通,带你探索适合新手的视频剪辑工具
用视频来分享生活已经变成越来越多人的一种习惯,很多时候视频并不能一镜到底,所以还需要一些的修改、剪辑操作,那么这次我将介绍几款视频剪辑工具,希望能够让你分享的道路更加通畅。 1.FOXIT视频剪辑 连接直达>>https://w…...
线性规划------ + 案例 + Python源码求解(见文中)
目录 一、代数模型(Algebraic Models)详解1.1什么是代数模型?1.2代数模型的基本形式1.3 安装所需要的Python包--运行下述案例1.4代数模型的应用案例案例 1:市场供需平衡模型Python求解代码Python求解结果如下图:案例 2:运输问题中的线性规划模型进行数学建模分析1. 目标函…...
用Java实现人工智能
用Java实现人工智能 #Java #人工智能 #AI #机器学习 #深度学习 #数据科学 #技术博客 #编程技巧 文章目录 前言环境准备1. 安装Java2. IDE选择3. 依赖管理 数据准备模型训练模型评估分类模型评估回归模型评估模型的交叉验证 模型部署部署模型的基本步骤模型保存与加载Docker容器…...
MobaXterm使用技巧
引言 在现代IT环境中,远程管理和SSH连接已经成为管理员和开发者日常工作的重要组成部分。MobaXterm是一款功能强大的终端模拟器,它集成了多种网络工具,非常适合用于远程管理、编程和网络调试。本文将汇总一些MobaXterm的使用技巧,…...

openstack中的rabbitmq
基本概念 基础介绍 exchange:用于分发信息,有direct、fanout、topic、headers; binding:exchange、queue之间的虚拟连接,由一个或者多个routing key组成; queues:用来暂存消息,供…...
etcd三节点,其中一个坏掉了的恢复办法
一、配置etcdctl环境变量 --------------------------------------------------------------------------------------------- #其中证书实际路径和endpoints,以环境情况为准,查询方式 # ps -ef | grep etcd-cafile # ps -ef | grep etcd-servers export ETCDCTL_API3 export…...

计算机毕业设计 基于SpringBoot框架的网上蛋糕销售系统的设计与实现 Java实战项目 附源码+文档+视频讲解
博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…...
C编程控制PC蜂鸣器方法2
在《C编程控制PC蜂鸣器》一文中,我们了解并使用了通过IO端口控制的方式操作硬件,而有些时候这对于一些朋友来说太模糊了,很容易让人迷糊,这次采用最基本的write系统调用来写入input_event数据实现相同功能。这里涉及到的input_event可参考《C编程实现键盘LED闪烁方法2》一文…...
C# SQL 辅助工具
{/// <summary>/// sql 辅助工具/// </summary>public class SqlStructureHelps{#region 增删改查/// <summary>/// 截断/// </summary>/// <typeparam name"T"></typeparam>/// <returns></returns>public static …...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...

AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...

免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...

【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...