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
- handler层接受到app发来的参数如:token、latest_time,根据文档规范封装为一个向后端发起的请求:FeedRequest.
- 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
- 在一个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()
)
- 服务注册
之前服务发现是NewEtcdResolver,现在注册是:r, err := etcd.NewEtcdRegistry([]string{etcdAddr}),将得到一个Registry类型的对象

- 调kitex自动生成的service的NewServer方法,注意使用上面拿到的Registry对象

- 上面的启动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寄存器,设置GPIOE F组控制器使能 0x50000A28[5:4]1ldr r0,0X50000A28ldr r1,[r0]orr r1,r1,#(0X3<<4)str r1,[r0] 2.1 通过GPIOE_MODER寄存器,…...
flutter 常见的状态管理器
flutter 常见的状态管理器 前言一、Provider二、Bloc三、Redux四、GetX总结 前言 当我们构建复杂的移动应用时,有效的状态管理是至关重要的,因为应用的不同部分可能需要共享数据、相应用户交互并保持一致的状态。Flutter 中有多种状态管理解决方案&#…...
Kotlin的Map
在 Kotlin 中,Map 是一种键值对的集合数据结构,用于存储一组关联的键和值。Kotlin 标准库提供了 Map 接口和多种实现类,使得操作和处理键值对数据更加方便。下面详细描述 Kotlin 的 Map 的用法: 创建 Map Kotlin 提供了几种方式…...
STM32 串口复习
按数据通信方式分类: 串行通信:数据逐位按顺序依次传输。传输速率较低,抗干扰能力较强,通信距离较长,I/O资源占用较少,成本较低。并行通信:数据各位通过多条线同时传输。 按数据传输方向分类&…...
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,复制其绝对路径,例如D:\Program Files\Git\bin\bash.exe把路径的右斜…...
网络基础(一)桥接网络
网络基础知识 桥接网络 桥接网络是一种网络设计技术,其目的是将两个或多个网络段连接在一起,使它们在逻辑上表现为单个网络。这通过使用网络桥来实现,网络桥工作在数据链路层(第2层),只关心MAC地址&#…...
C#程序变量统一管理例子 - 开源研究系列文章
今天讲讲关于C#应用程序中使用到的变量的统一管理的代码例子。 我们知道,在C#里使用变量,除了private私有变量外,程序中使用到的公共变量就需要进行统一的存放和管理。这里笔者使用到的公共变量管理库划分为:1)窗体;2)…...
信息熵,信息增益,增益率的理解
西瓜数据集D如下: 编号色泽根蒂敲声纹理脐部触感好瓜1青绿蜷缩浊响清晰凹陷硬滑是2乌黑蜷缩沉闷清晰凹陷硬滑是3乌黑蜷缩浊响清晰凹陷硬滑是4青绿蜷缩沉闷清晰凹陷硬滑是5浅白蜷缩浊响清晰凹陷硬滑是6青绿稍蜷浊响清晰稍凹软粘是7乌黑稍蜷浊响稍糊稍凹软粘是8乌黑稍蜷浊响清晰…...
二级MySQL(一)——基本概念与方法
数据库系统的核心是【数据库管理系统】 E-R图提供了表示信息世界中的方法,主要有实体、属性和【联系】 E-R图是数据库设计的工具之一,一般适用于建立数据库的【概念模型】 将E-R图转换到关系模式时,实体与联系都可以表示成【关系】 关系数…...
13 Web全栈 pnpm
什么是pnpm? 可以理解成performant npm缩写 速度快、节省磁盘空间的软件包管理器 特点 快速- pnpm比其他包管理器快2倍高效- node_modules中的文件链接自特定的内容寻址存储库支持monorepos- 内置支持单仓多包严格- pnpm默认创建了一个非平铺的node_modules 因此代…...
回归预测 | MATLAB实现CSO-BP布谷鸟优化算法优化BP神经网络多输入单输出回归预测(多指标,多图)
回归预测 | MATLAB实现CSO-BP布谷鸟优化算法优化BP神经网络多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现CSO-BP布谷鸟优化算法优化BP神经网络多输入单输出回归预测(多指标,多图)效果一览…...
JavaScript中的事件冒泡和事件捕获机制
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 事件冒泡和事件捕获机制⭐ 事件冒泡(Event Bubbling)⭐ 事件捕获(Event Capturing)⭐ 停止事件传播⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或…...
秋招面经——结合各方面试经验
Mysql mysql事务 共享锁与排他锁 共享锁:允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。(读都允许读,但我在读不允许你去改) 排他锁:允许一个事务去读一行,阻止其他事务获得相同…...
Python random模块用法整理
随机数在计算机科学领域扮演着重要的角色,用于模拟真实世界的随机性、数据生成、密码学等多个领域。Python 中的 random 模块提供了丰富的随机数生成功能,本文整理了 random 模块的使用。 文章目录 Python random 模块注意事项Python random 模块的内置…...
【Redis从头学-5】Redis中的List数据类型实战场景之天猫热销榜单
🧑💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 📖所属专栏:Re…...
基于Python的HTTP代理爬虫开发初探
前言 随着互联网的发展,爬虫技术已经成为了信息采集、数据分析的重要手段。然而在进行爬虫开发的过程中,由于个人或机构的目的不同,也会面临一些访问限制或者防护措施。这时候,使用HTTP代理爬虫可以有效地解决这些问题࿰…...
时序预测 | MATLAB实现WOA-CNN-LSTM鲸鱼算法优化卷积长短期记忆神经网络时间序列预测
时序预测 | MATLAB实现WOA-CNN-LSTM鲸鱼算法优化卷积长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现WOA-CNN-LSTM鲸鱼算法优化卷积长短期记忆神经网络时间序列预测预测效果基本介绍模型描述程序设计学习总结参考资料 预测效果 基本介绍 时序预测 | MATLAB实现WOA-…...
每日一题之二进制中1的个数
二进制中1的个数 问题描述: 输入一个整数 n ,输出该数 32 位二进制表示中 1 的个数。其中负数用补码表示。 科普一下有符号数的三种表示:原码、反码和补码,可能有时候遗忘了。 真值:带有符号位的机器数(一…...
8.17校招 内推 面经
绿泡泡: neituijunsir 交流裙,内推/实习/校招汇总表格 1、校招 | 腾讯2024校园招聘全面启动(内推) 校招 | 腾讯2024校园招聘全面启动(内推) 2、校招 | 大华股份2024届全球校园招聘正式启动(内推) 校招 | 大华股份2024届全球校园招聘正式启动(内推) …...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...
Python常用模块:time、os、shutil与flask初探
一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...
ThreadLocal 源码
ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物,因为每个访问一个线程局部变量的线程(通过其 get 或 set 方法)都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段,这些类希望将…...
HTTPS证书一年多少钱?
HTTPS证书作为保障网站数据传输安全的重要工具,成为众多网站运营者的必备选择。然而,面对市场上种类繁多的HTTPS证书,其一年费用究竟是多少,又受哪些因素影响呢? 首先,HTTPS证书通常在PinTrust这样的专业平…...
