当前位置: 首页 > article >正文

go实战案例:如何在 Go-kit 和 Service Meh 中进行服务注册与发现?

今天分享的是如何在Go-kit和ServiceMesh中进行服务注册与发现的案例。在上文中我们基于搭建好的 Consul 集群通过 Consul 中提供的 HTTP API 实现了 register 的服务注册与发现功能。我们采用手动构造HTTP请求的方式在服务启动时发送服务实例数据到Consul中完成服务注册在服务关闭时向Consul请求服务注销并通过Consul提供的服务发现接口根据服务名获取可用的服务实例信息列表。在本文我们将使用Go-kit提供的服务注册与发现工具包完成服务注册与发现并介绍ServiceMesh中Istio是如何进行服务注册与发现的。使用Go-kit服务注册与发现工具包自主开发服务注册与发现客户端固然能够加深我们对微服务和服务注册与发现中心交互流程的理解但同样会增加开发人员的理解成本比如要了解服务注册与发现中心对外提供的接口、提交数据的具体细节以及在服务注册与发现中心版本升级迭代或者API发生更新时还需要持续维护客户端代码以避免不可用情况的发生等等。Go-kit作为一套微服务工具集意在帮助开发人员解决微服务开发中遇到的绝大多数问题让他们更专注于业务开发。Go-kit 提供了诸多服务注册与发现组件的客户端实现支持包括 Consul、Etcd、ZooKeeper和 Eureka在内的多种服务注册与发现中心。下面我们以Consul为例实践如何使用Go-kit的sd 包简化微服务服务注册与发现的实现sd包中提供如下注册和注销接口代码如下所示type Registrar interface { Register //服务注册 Deregister//服务注销 }在Go-kit中我们根据选定的服务注册和发现组件实例化 Registrar 接口对应的结构体实现即可使用同样的接口进行服务注册和服务注销。接下来我们实例化sd/consul包下的Registrar用于完成与Consul的交互实例化代码如下:func NewDiscoveryclient(host string, port int, registration *api.AgentServiceRegistration) (*Discoveryclient, error) { config : api.DefaultConfig() config.Address host : strconv.Itoa(port) // 生成 hashicorp client client, err : api.Newclient(config) if err ! nil{ return nil, err } // 使用 hashicorp client 生成 sd consul client sdclient : consul.Newclient(client) return Discoveryclient{ client: sdclient, config: config, registration: registration, register: consul.NewRegistrar(sdclient, registration, log.NewLogfmtLogger(os.Stderr)), }, nil }DiscoveryClient.register 即最终实例化的 Consul 注册器。从实例化的过程可以发现 Consul Registrar的实现依赖于 sd.consul.client 而 sd.consul.client 实现依赖于 hashicorp client即 Consul 的官方实现客户端。深入hashicorp client客户端中的服务注册与发现的实现会发现它也是通过请求ConsulAgent 提供的HTTP API 完成的实现的方式与我们在上一课时中的实践大同小异。api.AgentServiceRegistration 结构体即需要提交到 Consul 中的服务实例信息包含服务名、服务实例ID、服务地址和服务端口等基本信息。然后我们的服务注册和服务注销实现就可以委托给Register执行如下所示func (consulclient *Discoveryclient) Register(ctx context.Context) { consulclient.register.Register() } func (consulclient *Discoveryclient) Deregister(ctx context.Context) { consulclient.register.Deregister() }服务发现的实现也是直接调用sd.consul.client提供的相关方法。通过使用Go-kit提供的Consul 工具包可以在不了解微服务与Consul具体交互逻辑的基础上通过简单调用包中提供的方法即可完成服务注册与发现大大减轻业务人员的开发工作。Service Mesh 中 Istio 服务注册与发现ServiceMesh作为下一代的微服务架构它将服务间的通信从基础设施中抽离出来达到交付更可靠的应用请求、监控和控制流量的目的。Service Mesh一般与应用程序一同部署作为数据平面代理网络以及控制平面代替应用与其他代理交互。ServiceMesh的出现让业务开发人员从基础架构的底层细节中解放出来从而把更多的精力放在业务开发上提高需求迭代的效率。Istio作为ServiceMesh的落地产品之一依托Kubernetes快速发展已经成为最受欢迎的ServiceMesh之一。Istio在逻辑上分为数据平面和控制平面。数据平面由一组高性能的智能代理基于Envoy 改进的istio-proxy组成它们控制和协调了被代理服务的所有网络通信同时也负责收集和上报相关的监控数据。控制平面负责制定应用策略来控制网络流量的路由。Istio由多个组件组成核心组件及其作用为如下Ingressgateway控制外部流量访问Istio 内部的服务。Egressgateway控制Istio 内部访问外部服务的流量。Pilot负责管理服务网格内部的服务和流量策略。它将服务信息和流量控制的高级路由规则在运行时传播给Proxy并将特定平台的服务发现机制抽象为Proxy可使用的标准格式。Citadel提供身份认证和凭证管理。Galley负责验证、提取、处理和分发配置。Proxy作为服务代理调节所有ServiceMesh 单元的入口和出口流量。lstio ArchitectureIstio 架构图这其中 Proxy属于数据平面以 Sidecar 的方式与应用程序一同部署到 Pod 中而 Pilot、Citadel和Galley 属于控制平面。除此之外Istio 中还提供一些额外的插件如 grafana、istio-tracing、kiali和prometheus用于进行可视化的数据查看、流量监控和链路追踪等。Istio默认提供了以下几种安装profile形式它们开启的组件配置如下表所示表示开启空白表示未开启表示未知这其中istiod 组件封装了Pilot、Citadel和 Galley等控制平面组件将它们进行统一打包部署降低多组件维护和管理的困难性。从上表可以看出demo profile是功能最全的配置清单适合于学习和功能演示。previewprofile将可能使用一些开发阶段的测试组件开启的组件不定。官方推荐使用default profile进行安装因为它在核心组件和插件上做到了最优的选择比如组件只开启了Ingressgateway 和 istiod插件只开启了 prometheus。当然我们也可以根据实践的需求选择合适的profile进行安装启动比如下面的安装命令我们使用的是demo profile:istioctl manifest apply --set profiledemo上述命令以demo profile部署Istio该配置下的Istio能够通过可视化界面监控Istio 中应用的方方面面。Istio以 Sidecar 的方式在应用程序运行的Pod 中注入Proxy全面接管应用程序的网络流入流出。我们可以通过标记Kubernetes命名空间的方式让Sidecar 注入器自动将Proxy注入在该命名空间下启动的Pod中开启标记的命令如下kubectl label namespace default istio-injectionenabled上述命令中我们将 default 命名空间标记为istio-injection。如果不想开启命令空间的标记也可以通过 istioctl kube-inject 为 Pod 注入 Proxy Sidecar 容器。接下来我们就为 register 服务所在的 Pod 注入Proxy启动命令如下istioctl kube-inject -f register-service.yaml I kubectl apply -f -register 服务的yaml 配置如下:apiversion: apps/v1 kind: Deployment metadata: name: register labels: name: register spec: selector: matchLabels: name: register replicas: 1 template: metadata: name: register labels: name: register app: register #添加 app 标签 spec: containers : - name: register image: register ports: - containerPort: 12312 imagePullpolicy: IfNotPresent # ...省略环境配置 --- # 添加 Service 资源 apiversion: v1 kind: Service metadata: name: register-service labels: name: register-service spec: selector: name: register ports: - protocol: TCP port: 12312 targetPort: 12312 name: register-service-http这主要的改动有为register 服务添加 Deployment Controller添加了新的标签 app以及为register 添加相应的 Service 资源。如果在部署Istio 时启动了 kiali插件即可在 kiali 平台中查看到register服务的相关信息通过以下命令即可打开kiali控制面板默认账户和密码都为 admin:istioctl dashboard kialikiali 控制台从上图可以看出在kiali控制台中存在多个维度查看Istio 中部署的应用Overview网格概述展示Istio内具有服务的所有命名空间;Graph服务拓扑图Applications应用维度识别设置了app 标签的应用;Workloads负载维度检测 Kubernetes 中的资源包括 Deployment、Job、DaemonSet等无论这些资源有没有加入Istio 中都能检测到;Services服务维度检测 Kubernetes 的 Service;Istio Config配置维度查看Istio 相关配置类信息。register 服务启动后我们在 Applications、Workloads、Services 维度中均可查看到 register 的身影如下 Applications 维度图所示:kiali Applications 维度下的 registerIstio依托Kubernetes 的快速发展和推广对Kubernetes 有着极强的依赖性其服务注册与发现的实现也主要依赖于Kubernetes的 Service管理。我们可以通过以下这张图理解Istio的服务注册与发现lstio ArchitectureIstio服务注册与发现逻辑图通过该逻辑图我们可以看到Istio服务注册与发现主要有以下模块参与。ConfigController负责管理配置数据包括用户配置的流量管理和路由规则。ServiceController负责加载各类ServiceRegistry从ServiceRegistry 中同步需要在网格中管理的服务。主要包含①KubeServiceRegistry从 Kubernetes 同步 Service 和 Endpoint 到Istio②ConsulServiceRegistry从 Consul 中同步服务信息到Istio;③ExternalServiceRegistry监听 ConfigController 中的配置变化获取 ServiceEntry 和WorkloadEntry资源并封装成服务数据提供给ServiceController。DiscoveryServer负责将 ConfigController 中的路由配置信息和 ServiceController 中的服务信息封装成 Proxy 可以理解的标准格式并下发到 Proxy 中。Pilot 组件会从各个 Service Registry比如 Kubernetes 中的 Service 和 Consul 中注册的服务采集可用的服务数据到Istio 中并将这些服务转换为Proxy可理解的标准服务格式下发到Proxy同时下发的还有用户预先配置的路由规则和流量控制策略。在被代理的应用根据服务标识发起 HTTP 通信时Proxy将会从拦截的网络请求中根据服务标识获取对应的服务数据并根据下发的路由规则选择合适的实例转发请求。基于Kubernetes 迅速发展的Istio 在服务注册与发现组件上支持最完善的自然也为Kubernetes这依托于Kubernetes对 Pod、Service 等资源的监控为服务之间的调用提供弹性、负载均衡、重试、熔断和限流等诸多保障。而对第三方服务注册与发现组件的集成和支持比如Consul等Istio官方的实现仅仅是基本可用的级别在性能和易用性方面仍需要不断进行打磨和测试。因此在Istio的落地实践中建议是与Kubernetes强绑定使用以达到功能的最优化发挥。小结服务注册与发现是微服务架构落地实践的基石之一因为有中心化的服务注册与发现中心管理大量动态变化的服务实例使得应用服务可以在无太大压力的条件下进行微服务拆分和横向扩展大大提升了微服务架构的灵活性和伸缩性。在本文我们首先介绍了Go-kit中服务注册与发现工具包并使用其中的Consul工具包改善了register 服务的服务注册与发现的实现。接着我们介绍了 Service Mesh 中的依依者Istio以及其服务注册与发现的实现。Istio 本身并不提供服务发现的能力但是它可以依托Kubernetes 或者第三方的服务注册中心获取服务信息列表并根据设定的路由规则进行有效的动态调用。希望通过本文的学习不仅能加深你对Go微服务中服务注册与发现的认识也能了解到Istio是如何在代理层实现服务注册与发现。

相关文章:

go实战案例:如何在 Go-kit 和 Service Meh 中进行服务注册与发现?

今天分享的是如何在Go-kit和ServiceMesh中进行服务注册与发现的案例。在上文中,我们基于搭建好的 Consul 集群,通过 Consul 中提供的 HTTP API 实现了 register 的服务注册与发现功能。我们采用手动构造HTTP请求的方式,在服务启动时发送服务实…...

伏特台风(Volt Typhoon):针对关键基础设施的无文件攻击与潜伏技术深度剖析

前言 技术背景:在现代网络攻击与防御(Cybersecurity)的宏大叙事中,高级持续性威胁(APT)代表了最高级别的对抗。而“伏特台风”(Volt Typhoon)组织所采用的**无文件攻击(F…...

嵌入式系统开发核心技术解析与实践

嵌入式系统开发核心技术专题1. 嵌入式开发基础体系1.1 C语言核心要点在嵌入式开发中,C语言作为最接近硬件的编程语言,需要掌握以下关键技术点:指针深度应用:包括函数指针、回调函数实现、内存操作等核心概念内存管理机制&#xff…...

TAI-TECH台庆 WCM2012F2SF-900T04 SOP-4 共模滤波器

特性 1.高频下具有高共模阻抗,实现优异的噪声抑制性能。 2.WCM2012F2SF系列实现小型化和低外形。尺寸为2.0x1.2x1.2mm。3.无铅(Pb)且不含卤素,符合RoHS标准。4.工作温度-40~125C(包括自温升)...

ChatTTS一键集成实战:从语音合成到高效部署的完整指南

最近在做一个需要语音播报功能的小项目,一开始觉得语音合成嘛,不就是调个API的事。结果真上手才发现,从选型、集成到上线,坑是一个接一个。延迟高、资源占用大、并发一上来就崩……这些问题让我头疼了好久。直到尝试了ChatTTS的“…...

计算机毕业设计 java 游戏道具交易平台管理系统 SpringBoot 游戏道具安全交易管理平台 JavaWeb 游戏道具交易与订单管控系统

计算机毕业设计 java 游戏道具交易平台管理系统 287kc9,末尾的数字和英文也要加上 (配套有源码 程序 mysql 数据库 论文)本套源码可以先看具体功能演示视频领取,文末有联 xi 可分享随着游戏行业的蓬勃发展,游戏道具交易…...

模型轻量化前沿:OpenClaw集成百川2-13B-4bits量化版的技术解析

模型轻量化前沿:OpenClaw集成百川2-13B-4bits量化版的技术解析 1. 为什么我们需要量化模型? 当我第一次尝试在本地部署百川2-13B模型时,16GB显存的显卡直接被"撑爆"。这让我意识到,想要在消费级硬件上运行大模型&…...

当LabVIEW遇上Python:打造信号处理流水线

Labview信号采集与多功能分析系统(含报告) 系统可作为自己的基础框架,然后进行二次开发。 系统功能: (1)可采集传感器的真实信号。 若采集实际信号则需要NI的采集卡哦。 (2)可采集la…...

快速验证openclaw环境:用快马AI一键生成跨平台安装脚本与测试用例

最近在尝试用openclaw框架做数据采集时,发现环境配置这个环节特别容易卡住。不同操作系统下的依赖安装方式差异很大,经常要反复查文档和排错。后来发现用InsCode(快马)平台可以快速生成跨平台的安装方案,分享下具体实践过程。 环境适配的痛点…...

网页设计毕业设计选题指南:从零构建一个响应式个人作品集网站

作为一名即将毕业的计算机相关专业学生,你是否正为“网页设计”这门课的毕业设计选题而头疼?选题太简单,显得没技术含量;选题太复杂,又怕自己搞不定,最后做出一个只能在老师电脑上运行的“演示即崩溃”项目…...

毕业设计实战:基于SpringBoot+Vue+MySQL的校园一卡通管理系统设计与实现指南

毕业设计实战:基于SpringBootVueMySQL的校园一卡通管理系统设计与实现指南 在开发“基于SpringBootVueMySQL的校园一卡通管理系统”毕业设计时,曾因器材借用表未通过学生ID与器材ID双外键关联踩过关键坑——初期仅单独设计借用表的编号字段,…...

缺口大!平均月薪超2万元!这个岗位超级火!

当下最火的是什么?答案毫无悬念,一定是人工智能。如今,人工智能行业正以肉眼可见的速度迅速崛起,市场对相关专业人才的需求也随之越来越大。1.市场人才缺口大前几天,人民日报、央视财经等多个主流媒体发布文章&#xf…...

破解物联网平台三大核心痛点:ThingsPanel v1.1.7如何实现84%性能提升与开发效率革命

破解物联网平台三大核心痛点:ThingsPanel v1.1.7如何实现84%性能提升与开发效率革命 【免费下载链接】thingspanel-frontend-community 项目地址: https://gitcode.com/thingspanel/thingspanel-frontend-community 开篇:当智慧工厂遭遇数字化瓶…...

OpenClaw+GLM-4.7-Flash:智能会议纪要生成系统

OpenClawGLM-4.7-Flash:智能会议纪要生成系统 1. 为什么需要自动化会议纪要 每次开完会最痛苦的事情是什么?对我来说就是整理会议纪要。作为技术负责人,我每周要参加至少5场会议,从需求评审到技术方案讨论,再到项目复…...

文旅直播助农成新风口!巨有科技数智工具,复刻董宇辉“阅山河”助农模式

当下,文旅直播助农成为乡村振兴与文旅融合的新风口,董宇辉“阅山河”模式开创“边走边播、以文促农”的新范式,通过沉浸式文旅直播,实现“文旅引流农产品变现”的双向赋能,带动多地农产热销与文旅发展,但CS…...

禅修Debug大法:面对屎山先冥想三小时

——测试工程师的认知重构与系统破局指南第一章 祖传系统的测试困局:当屎山遇见测试用例1.1 屎山系统的四大典型特征熵增陷阱15年以上的迭代系统普遍呈现指数级增长的代码复杂度。行业数据显示,超过60%的祖传系统每月新增代码的耦合度递增12%&#xff0c…...

告别繁琐配置:用快马ai一键生成跨平台vscode python开发环境

最近在帮团队新成员配置Python开发环境时,发现虽然VSCode很强大,但初始配置过程对新手来说还是有点复杂。不同操作系统下的路径处理、工具链选择、调试配置这些细节,经常要反复调试才能跑通。后来尝试用InsCode(快马)平台的AI辅助功能&#x…...

AI赋能Java开发:在快马平台轻松构建集成智能对话与代码分析的Java应用

最近尝试用Java结合AI能力做了个小项目,发现这种组合特别适合快速开发智能应用。在InsCode(快马)平台上实践后发现,整个过程比想象中简单很多,分享下具体实现思路。 项目框架搭建 用Spring Initializr创建基础项目,选择Web和Lombo…...

C++ vs .NET 数组原地反转实测:小数组 C++ 碾压,大数组 .NET

C vs .NET 数组原地反转实测:小数组 C 碾压,大数组 .NET 反杀? 前几天看到一篇文章:《将一个序列反序,在C与C#下性能比较》(链接大家可以自行搜索)。作者对比了 C# 的“托管/非托管”实现和 C 的…...

专业的无代码多端协同办公哪家好

在当今数字化办公的浪潮下,无代码多端协同办公平台成为众多企业提升办公效率、降低数字化门槛的首选。然而,市场上的相关产品众多,企业该如何选择呢?今天,我们就来详细分析一下,为大家推荐一款优秀的无代码…...

Notepad--:跨平台文本编辑器的技术架构与国产化实践

Notepad--:跨平台文本编辑器的技术架构与国产化实践 【免费下载链接】notepad-- 一个支持windows/linux/mac的文本编辑器,目标是做中国人自己的编辑器,来自中国。 项目地址: https://gitcode.com/GitHub_Trending/no/notepad-- Notepa…...

ChatTTS长文本处理实战:AI辅助开发中的性能优化与避坑指南

最近在做一个AI辅助开发的项目,其中用到了ChatTTS来做文本转语音。功能本身挺酷的,但当我尝试处理一篇几千字的长文章时,问题就来了:程序直接卡死,或者内存占用飙升,生成的语音也断断续续的。这让我意识到&…...

三线OS突破20个月!科伦博泰TROP2 ADC在肺癌红海杀出重围

肺癌,历来是全球肿瘤研发领域产出最丰富、竞争也最残酷的“兵家必争之地”。 从开启靶向时代的EGFR-TKI,到重塑治疗格局的PD-(L)1免疫疗法,再到如今势头迅猛的双抗与ADC,各类技术路线持续涌入这一数百亿美元规模的治疗市场123。创…...

《Linux 是怎样工作的》第 3 章 进程管理

本章完整拆解了 Linux 进程从创建 → 执行 → 结束的全生命周期,深入剖析fork()、execve()、_exit()的底层实现、内存模型与工程实践,是理解 Linux 多任务、调度与内存管理的核心基础。一、3.2 fork() 函数:进程的复制创建1. 核心定义与设计思…...

《Linux 是怎样工作的》第 2 章:用户模式实现的功能

一、先建立核心认知:两个世界的边界 计算机系统被严格划分为两个隔离的运行环境,这是保障系统安全与稳定的基础: 内核态(Kernel Mode):相当于「小区物业」,唯一能直接操作 CPU、内存、硬盘、网…...

全国多地设备售后如何统筹?“售后管理系统”一键打通地域壁垒

摘要:对于布局全国市场的机电企业而言,售后网点是服务落地的核心载体,但当前多数企业的全国售后网点普遍存在“各自为政”的困境——区域壁垒突出、资源互不互通、工单分配失衡,导致部分网点忙闲不均、资源浪费严重,同时影响售后响应效率与服务标准化水平,制约企业售后质…...

可视掏耳勺哪个牌子好?西圣蜂鸟可视挖耳勺实测对比,家用精准入

​如今可视挖耳勺已经成为很多家庭常备的护理工具,尤其是家里有老人和孩子的用户,对产品的清晰度、安全性、舒适度都有更高要求。西圣Find X和蜂鸟3 Plus是目前百元价位里关注度较高的两款产品,它们在设计思路和功能侧重上有所不同。这次我们…...

OpenClaw技能市场巡礼:Top10 GLM-4.7-Flash增强模块推荐

OpenClaw技能市场巡礼:Top10 GLM-4.7-Flash增强模块推荐 1. 为什么需要关注技能市场? 第一次接触OpenClaw时,我以为它只是个简单的自动化工具。直到在ClawHub技能市场看到有人用GLM-4.7-Flash模型实现了简历自动打分系统,才意识…...

如何快速修复ROG游戏本色彩异常:G-Helper完整配置恢复终极指南

如何快速修复ROG游戏本色彩异常:G-Helper完整配置恢复终极指南 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models …...

GPT-4o 新手入门指南:从零开始构建你的第一个智能对话应用

GPT-4o 新手入门指南:从零开始构建你的第一个智能对话应用 作为一名刚接触大模型开发的程序员,面对 GPT-4o 这样的新工具,你是不是既兴奋又有点无从下手?看着官方文档里一堆 API 参数,想着怎么管理好几轮对话的上下文…...