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

golang云原生项目之:etcd服务注册与发现

服务注册与发现:ETCD

1直接调包

kitex-contrib: 上面有实现的案例,直接cv。下面是具体的理解

2 相关概念

  • EtcdResolver: etcd resolver是一种DNS解析器,用于将域名转换为etcd集群中的具体地址,以便应用程序可以与etcd集群进行通信。etcd是一个分布式键值存储系统,常用于服务发现、配置共享和分布式锁等应用场景。通过使用etcd resolver,应用程序可以更方便地与etcd集群交互

  • endpoints 用于指定集群的地址列表.例如:etcd1.example.com:2379, etcd2.example.com:2379。应用程序将通过这些地址与etcd集群的各个节点进行通信,以读取和更新数据。

3 案例

直接看例子就能大致明白
client:

func main() {r, err := etcd.NewEtcdResolver([]string{"127.0.0.1:2379"})if err != nil {log.Fatal(err)}client := hello.MustNewClient("Hello", client.WithResolver(r))for {ctx, cancel := context.WithTimeout(context.Background(), time.Second*3)resp, err := client.Echo(ctx, &api.Request{Message: "Hello"})cancel()if err != nil {log.Fatal(err)}log.Println(resp)time.Sleep(time.Second)}
}

server:

type HelloImpl struct{}func (h *HelloImpl) Echo(ctx context.Context, req *api.Request) (resp *api.Response, err error) {resp = &api.Response{Message: req.Message,}return
}func main() {r, err := etcd.NewEtcdRegistry([]string{"127.0.0.1:2379"})if err != nil {log.Fatal(err)}server := hello.NewServer(new(HelloImpl), server.WithRegistry(r), server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: "Hello",}))err = server.Run()if err != nil {log.Fatal(err)}
}

4 实际项目实现

4.1 client

  1. handler层接受到app发来的参数如:token、latest_time,根据文档规范封装为一个向后端发起的请求:FeedRequest.
  2. rpc远程调用server的Feed接口,返回目标结果
    在这里插入图片描述
    • rpc调用的Feed实际上先调用了kitex自动生成的client,通过client与server通信,实现调用server的接口。
    • kitex自动生成的client需要在使用前初始化,比如进行服务与发现
      具体来说:client又需要注册中心的resolver,拿到resolver的办法就 etcd.NewEtcdResolver([]string{etcdAddr}),传入endpoint就可以直接拿到reslover
      下面是初始化client的例子
// InitVideo
// 在构建client和server通信之前,先关注连通性
func InitVideo(viperConfig *viper.ConfigViper) {etcdAddr := fmt.Sprintf("%s:%d", viperConfig.Viper.GetString("etcd.host"), viperConfig.Viper.GetString("etcd.port"))resolver, err2 := etcd.NewEtcdResolver([]string{etcdAddr})if err2 != nil {log.Fatal(err2)}serverName := viperConfig.Viper.GetString("server.name") //指定客户端所连接的服务的名称newClient, err := videoservice.NewClient(serverName,//client.WithMiddleware(middleware.CommonMiddleware),//client.WithInstanceMW(middleware.ClientMiddleware), //实例级别的中间件。这个中间件可能会对客户端的每个请求进行预处理或后处理client.WithMuxConnection(1),                        // muxclient.WithRPCTimeout(300*time.Second),             // rpc timeoutclient.WithConnectTimeout(300000*time.Millisecond), // conn timeoutclient.WithFailureRetry(retry.NewFailurePolicy()),  // retryclient.WithSuite(tracing.NewClientSuite()),         // tracer 添加了一个追踪器,用于跟踪客户端的请求和响应client.WithResolver(resolver),                      // resolver// Please keep the same as provider.WithServiceNameclient.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: serverName}),)if err != nil {// TODO 思考应该直接panic吗log.Fatal(err)}videoClient = newClient
}

4.2 server

  1. 在一个server运行的时候,main是入口,所以需要在main中将自己的服务注册到etcd中
    先通过viper的init方法搜索到对于的配置文件,加载到对象config中:
var (config      = viper.Init("video")serviceName = config.Viper.GetString("server.name")serviceAddr = fmt.Sprintf("%s:%d", config.Viper.GetString("server.host"), config.Viper.GetInt("server.port"))etcdAddr    = fmt.Sprintf("%s:%d", config.Viper.GetString("etcd.host"), config.Viper.GetInt("etcd.port"))signingKey  = config.Viper.GetString("JWT.signingKey")logger      = zap.InitLogger()
)
  1. 服务注册
    之前服务发现是NewEtcdResolver,现在注册是:r, err := etcd.NewEtcdRegistry([]string{etcdAddr}),将得到一个Registry类型的对象
    在这里插入图片描述
  2. 调kitex自动生成的service的NewServer方法,注意使用上面拿到的Registry对象在这里插入图片描述
  3. 上面的启动main方法已经将VideoServiceImpl注册好了,现在可以在脚手架中写具体的各个Impl的接口实现。
    在这里插入图片描述

相关文章:

golang云原生项目之:etcd服务注册与发现

服务注册与发现:ETCD 1直接调包 kitex-contrib: 上面有实现的案例,直接cv。下面是具体的理解 2 相关概念 EtcdResolver: etcd resolver是一种DNS解析器,用于将域名转换为etcd集群中的具体地址,以便应用程序可以与et…...

arm:day4

1. 实现三盏灯的点亮 .text .global _start_start: led1初始化函数LED_INIT: 1 通过RCC_AHB4_ENSETR寄存器&#xff0c;设置GPIOE F组控制器使能 0x50000A28[5:4]1ldr r0,0X50000A28ldr r1,[r0]orr r1,r1,#(0X3<<4)str r1,[r0] 2.1 通过GPIOE_MODER寄存器&#xff0c;…...

flutter 常见的状态管理器

flutter 常见的状态管理器 前言一、Provider二、Bloc三、Redux四、GetX总结 前言 当我们构建复杂的移动应用时&#xff0c;有效的状态管理是至关重要的&#xff0c;因为应用的不同部分可能需要共享数据、相应用户交互并保持一致的状态。Flutter 中有多种状态管理解决方案&#…...

Kotlin的Map

在 Kotlin 中&#xff0c;Map 是一种键值对的集合数据结构&#xff0c;用于存储一组关联的键和值。Kotlin 标准库提供了 Map 接口和多种实现类&#xff0c;使得操作和处理键值对数据更加方便。下面详细描述 Kotlin 的 Map 的用法&#xff1a; 创建 Map Kotlin 提供了几种方式…...

STM32 串口复习

按数据通信方式分类&#xff1a; 串行通信&#xff1a;数据逐位按顺序依次传输。传输速率较低&#xff0c;抗干扰能力较强&#xff0c;通信距离较长&#xff0c;I/O资源占用较少&#xff0c;成本较低。并行通信&#xff1a;数据各位通过多条线同时传输。 按数据传输方向分类&…...

VScode替换cmd powershell为git bash 终端,并设置为默认

效果图 步骤 1. 解决VScode缺少git bash的问题_failed to start bash - is git-bash.exe on the syst_Rudon滨海渔村的博客-CSDN博客效果解决步骤找到git安装目录下的/bin/bash.exe&#xff0c;复制其绝对路径&#xff0c;例如D:\Program Files\Git\bin\bash.exe把路径的右斜…...

网络基础(一)桥接网络

网络基础知识 桥接网络 桥接网络是一种网络设计技术&#xff0c;其目的是将两个或多个网络段连接在一起&#xff0c;使它们在逻辑上表现为单个网络。这通过使用网络桥来实现&#xff0c;网络桥工作在数据链路层&#xff08;第2层&#xff09;&#xff0c;只关心MAC地址&#…...

C#程序变量统一管理例子 - 开源研究系列文章

今天讲讲关于C#应用程序中使用到的变量的统一管理的代码例子。 我们知道&#xff0c;在C#里使用变量&#xff0c;除了private私有变量外&#xff0c;程序中使用到的公共变量就需要进行统一的存放和管理。这里笔者使用到的公共变量管理库划分为&#xff1a;1)窗体&#xff1b;2)…...

信息熵,信息增益,增益率的理解

西瓜数据集D如下: 编号色泽根蒂敲声纹理脐部触感好瓜1青绿蜷缩浊响清晰凹陷硬滑是2乌黑蜷缩沉闷清晰凹陷硬滑是3乌黑蜷缩浊响清晰凹陷硬滑是4青绿蜷缩沉闷清晰凹陷硬滑是5浅白蜷缩浊响清晰凹陷硬滑是6青绿稍蜷浊响清晰稍凹软粘是7乌黑稍蜷浊响稍糊稍凹软粘是8乌黑稍蜷浊响清晰…...

二级MySQL(一)——基本概念与方法

数据库系统的核心是【数据库管理系统】 E-R图提供了表示信息世界中的方法&#xff0c;主要有实体、属性和【联系】 E-R图是数据库设计的工具之一&#xff0c;一般适用于建立数据库的【概念模型】 将E-R图转换到关系模式时&#xff0c;实体与联系都可以表示成【关系】 关系数…...

13 Web全栈 pnpm

什么是pnpm&#xff1f; 可以理解成performant npm缩写 速度快、节省磁盘空间的软件包管理器 特点 快速- pnpm比其他包管理器快2倍高效- node_modules中的文件链接自特定的内容寻址存储库支持monorepos- 内置支持单仓多包严格- pnpm默认创建了一个非平铺的node_modules 因此代…...

回归预测 | MATLAB实现CSO-BP布谷鸟优化算法优化BP神经网络多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现CSO-BP布谷鸟优化算法优化BP神经网络多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现CSO-BP布谷鸟优化算法优化BP神经网络多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览…...

JavaScript中的事件冒泡和事件捕获机制

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 事件冒泡和事件捕获机制⭐ 事件冒泡&#xff08;Event Bubbling&#xff09;⭐ 事件捕获&#xff08;Event Capturing&#xff09;⭐ 停止事件传播⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或…...

秋招面经——结合各方面试经验

Mysql mysql事务 共享锁与排他锁 共享锁&#xff1a;允许一个事务去读一行&#xff0c;阻止其他事务获得相同数据集的排他锁。&#xff08;读都允许读&#xff0c;但我在读不允许你去改&#xff09; 排他锁&#xff1a;允许一个事务去读一行&#xff0c;阻止其他事务获得相同…...

Python random模块用法整理

随机数在计算机科学领域扮演着重要的角色&#xff0c;用于模拟真实世界的随机性、数据生成、密码学等多个领域。Python 中的 random 模块提供了丰富的随机数生成功能&#xff0c;本文整理了 random 模块的使用。 文章目录 Python random 模块注意事项Python random 模块的内置…...

【Redis从头学-5】Redis中的List数据类型实战场景之天猫热销榜单

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 &#x1f4d6;所属专栏&#xff1a;Re…...

基于Python的HTTP代理爬虫开发初探

前言 随着互联网的发展&#xff0c;爬虫技术已经成为了信息采集、数据分析的重要手段。然而在进行爬虫开发的过程中&#xff0c;由于个人或机构的目的不同&#xff0c;也会面临一些访问限制或者防护措施。这时候&#xff0c;使用HTTP代理爬虫可以有效地解决这些问题&#xff0…...

时序预测 | MATLAB实现WOA-CNN-LSTM鲸鱼算法优化卷积长短期记忆神经网络时间序列预测

时序预测 | MATLAB实现WOA-CNN-LSTM鲸鱼算法优化卷积长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现WOA-CNN-LSTM鲸鱼算法优化卷积长短期记忆神经网络时间序列预测预测效果基本介绍模型描述程序设计学习总结参考资料 预测效果 基本介绍 时序预测 | MATLAB实现WOA-…...

每日一题之二进制中1的个数

二进制中1的个数 问题描述&#xff1a; 输入一个整数 n &#xff0c;输出该数 32 位二进制表示中 1 的个数。其中负数用补码表示。 科普一下有符号数的三种表示&#xff1a;原码、反码和补码&#xff0c;可能有时候遗忘了。 真值&#xff1a;带有符号位的机器数&#xff08;一…...

8.17校招 内推 面经

绿泡泡&#xff1a; neituijunsir 交流裙&#xff0c;内推/实习/校招汇总表格 1、校招 | 腾讯2024校园招聘全面启动(内推) 校招 | 腾讯2024校园招聘全面启动(内推) 2、校招 | 大华股份2024届全球校园招聘正式启动(内推) 校招 | 大华股份2024届全球校园招聘正式启动(内推) …...

从PERCLOS到‘三庭五眼’:聊聊疲劳检测算法里那些有趣的工程实现细节

从PERCLOS到‘三庭五眼’&#xff1a;疲劳检测算法的工程实现艺术 当算法工程师第一次看到"三庭五眼"这个美术概念被写入代码注释时&#xff0c;大概都会会心一笑——这正是工程实践中那些有趣的跨界融合时刻。疲劳检测系统看似是标准的计算机视觉任务&#xff0c;但…...

多维时序预测应用 Transformer-BILSTM

【Transformer-BILSTM多维时序预测】Transformer-BILSTM多变量时间序列预测&#xff0c;基于Transformer-BILSTM多变量输入模型。 matlab代码&#xff0c;2023b及其以上。 评价指标包括:R2、MAE、MSE、RMSE和MAPE等&#xff0c;代码质量极高&#xff0c;方便学习和替换数据。 参…...

Vue+SpringBoot全栈项目搭建:手把手教你实现一个带分页和Swagger的CRUD应用

VueSpringBoot全栈开发实战&#xff1a;从零构建企业级CRUD应用 1. 全栈技术选型与项目初始化 在当今快速迭代的互联网开发领域&#xff0c;前后端分离架构已成为主流选择。Vue.js作为渐进式前端框架&#xff0c;以其轻量级和响应式数据绑定特性&#xff0c;成为构建用户界面…...

实测才敢推!盘点2026年用户挚爱的AI论文网站

一天写完毕业论文在2026年已不再是天方夜谭。最新实测数据显示&#xff0c;2026年AI论文网站正以惊人的效率重塑学术写作&#xff0c;覆盖选题构思、文献综述、内容生成、格式排版等全流程场景&#xff0c;真正实现高效搞定论文。 一、全流程王者&#xff1a;一站式搞定论文全链…...

HY-Motion 1.0效果对比:相比MotionDiffuse在动作连贯性上提升35%

HY-Motion 1.0效果对比&#xff1a;相比MotionDiffuse在动作连贯性上提升35% 1. 模型概述 HY-Motion 1.0是基于流匹配技术的3D动作生成大模型&#xff0c;代表了文本到3D动作生成领域的最新突破。这个模型系列采用了Diffusion Transformer&#xff08;DiT&#xff09;和流匹配…...

4个Dify工作流配置策略:从基础请求到复杂数据处理的高效实践

4个Dify工作流配置策略&#xff1a;从基础请求到复杂数据处理的高效实践 【免费下载链接】Awesome-Dify-Workflow 分享一些好用的 Dify DSL 工作流程&#xff0c;自用、学习两相宜。 Sharing some Dify workflows. 项目地址: https://gitcode.com/GitHub_Trending/aw/Awesome…...

阿里通义Qwen3-Coder 多场景集成指南

1. Qwen3-Coder 核心能力与适用场景 第一次接触阿里通义Qwen3-Coder时&#xff0c;最让我惊讶的是它对代码上下文的理解深度。记得有次我随手输入"写个带缓存的斐波那契函数"&#xff0c;它不仅生成了正确的Python实现&#xff0c;还主动添加了LRU缓存装饰器的使用说…...

从CVE-2023-3450看锐捷RG-BCR860路由器:一次网络诊断功能引发的命令注入实战剖析

1. 漏洞背景与设备介绍 锐捷RG-BCR860是面向中小型商业场景设计的云路由器&#xff0c;主打简单易用的中文Web管理界面。这款设备常见于连锁餐饮、快捷酒店等需要稳定网络环境的场所&#xff0c;最大支持150台终端同时接入。作为一款商用设备&#xff0c;它内置了安全审计模块和…...

开源协作机器人的架构革命:OpenArm如何重构机器人研发范式

开源协作机器人的架构革命&#xff1a;OpenArm如何重构机器人研发范式 【免费下载链接】openarm OpenArm v0.1 项目地址: https://gitcode.com/GitHub_Trending/op/openarm 当传统工业机械臂的封闭生态成为技术创新的桎梏&#xff0c;当高昂的硬件成本将学术研究拒之门外…...

GHelper:华硕笔记本性能调校神器,让你的ROG设备焕发新生

GHelper&#xff1a;华硕笔记本性能调校神器&#xff0c;让你的ROG设备焕发新生 【免费下载链接】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 mod…...