bibi底层原理(goim文章系列)
bibi底层原理(goim文章系列)
2024-06-29 08:33:30  作者:滒寂寞  网址:https://m.xinb2b.cn/know/miu333492.html
0. 背景与动机

在学习 goim 过程中, bilibili/discovery 是一个服务注册/发现的依赖网元, golang 实现了 netflix/eureka 并作了一些扩展改进

这里顺带记录了对 bilibili/discovery(https://github.com/bilibili/discovery) 学习过程中的一些理解

1. discovery 在goim 中的角色与作用

bibi底层原理(goim文章系列)(1)

上图标示了 bilibili/discovery 在 goim 中的位置, 与作用(以 Comet / job 为例):

bibi底层原理(goim文章系列)(2)

部署一到多分 discovery 作为服务注册/发现网元 ( discovery 相互间会同步注册数据,细节见后)comet 一到多个部署, 这里是一个 comet gRPC server 服务端 comet 启动果, 每一个部署向 discovery 进行--> 服务注册 注册成功后与 discovery 之间保持一个健康状态同步( renew ), 见标示 1 comet 如果下线, discovery 会标示下线状态job 一到多个部署, 这里是一个 comet gRPC client 客户端 job 启动后, 向 discovery 进行 polls 获取 goim-comet 所有服务实例列表--> 服务发现 job 持续监听 discovery 中的 goim-conet 服务节点列表, 同步到本地 job 向 goim-comet 实例( 整个列表) 分发 goim 消息 ---> job 的主体业务功能

如果 discovery 网元不存在, 那很简单, job 在配置文件中写死 comet 地址( 一到多个), job 的 comet-gRPC-client 直接向 comet 的 comet-gRPC-server 进行互通完成业务. 这样就失去了分布式的动态扩展能力

discovery 之间, 会同步注册的服务实例信息

注意 在 bilibili/discovery 中, discovery 本身被标记为

_appid = "infra.discovery"

相互之间一样进行相互注册/更新, 同在相互之间同步 名为"infra.discovery" 与其他 app 的实例信息

在 discovery 的配置文件中, discovery 实例被称为 node , 由 nodes 参数进行配置, 配置定义如下

// Config discovery configures.type Config struct {Nodes []string # ******************** 这是配置一到多个 discovery 实例的定义Region stringZone stringEnv stringHost string}

2. discovery / eureka 的基本概念2.1 基本概念

bibi底层原理(goim文章系列)(3)

discovery / eureka 中的基本概念, 如上图所示, 就是一个分区进行注册/调度的简单划分

Region 地区, 例如, 中国区, 南美区, 北美区...Zone 可用区域, 例如中国区下的 gd 广东地区, sh 上海地区, 一般是指骨干 IDC 机房, 或者跨地区的逻辑区域, 这是同区内调度的主要划分点. 一般是同区内调度, 不会跨区调度Env 再划分小一点的运行环境划分, 比如 Env = dev 开发环境, Env = trial 试商用...appID 这是注册应用的名称, 服务注册与发现, 依赖的是 name ----> address 名称到地址的注册(写入/更新) 与发现( 获取名称对应的服务地址或服务地址列表)

: bilibili/discovery 是以 http 方式提供注册/更新/发现/同步...等服务注册与发现等业务功能

所以, 可以看到 discorevy 获取一个服务器节点, 是如下方式

curl 'http://127.0.0.1:7171/discovery/fetch?zone=gd&env=dev&appid=goim.comet&status=1'

上面 URL 中, zone 对应就是获取 gd 广东区域内, 环境定义为 dev , appID 为 goim.comet 的服务器实例, 当然, status 是附加约束, 这里 status=1 表示过滤名称为 goim.comet 的服务器实例状态要求为 status = 1 ( 即接收服务请求的 goim.comet 实例列表)

上面的 curl 会返回以下结果

{ "code": 0, "data": { "instances": { "gd": [ {"zone": "gd", # *** ** 可用区域"env": "dev", # ****** 运行环境"appid": "goim.comet", # ****** appID 名称"hostname": "hostname000000","version": "111","metadata": { "provider": "", "weight": "10"},"addrs": [ "http://172.1.1.1:8080", "gorpc://172.1.1.1:8089" # ****** 有效的 gRPC 地址],"status": 1,"reg_timestamp": 1525948301833084700,"up_timestamp": 1525948301833084700,"renew_timestamp": 1525949202959821300,"dirty_timestamp": 1525948301848680000,"latest_timestamp": 1525948301833084700 } ] }, "latest_timestamp": 1525948301833084700 }}

discovery/ eureka 换成 DNS 域名 可以在逻辑上表示为 schema://appID.Env.Zone.Region , 类似于 grpc://goim.comet.dev.gd.china.xxxxx.com

换成 etcd 可以表示为 /Region/Zone/Env/appID, 例如 "/china/gd/dev/goim.comet"

2.2 小结与配置建议

由上小节可知, bilibili/discovery 或 netflix/eureka 的配置中, 以下4个关键参数, 需要一一对应

regionzoneenv 或 deployEnvappID

在 goim 中, appID 已经在代码中标记为常量, 如下

# github.com/Terry-Mao/goim/cmd/comet/main.goconst (ver = "2.0.0"appid = "goim.comet")# github.com/Terry-Mao/goim/cmd/logic/main.goconst (ver = "2.0.0"appid = "goim.logic")

3. goim 中使用 bilibili/discovery

还是以 logic / comet 之间的 gRPC 为例

所有使用 bilibili/discovery 的配置是类似的, 在配置中, 包含以下定义

原始定义在 https://github.com/bilibili/discovery/blob/master/naming/client.go 第 46行开始

// Config discovery configures.type Config struct {Nodes []string # ******************** 这是配置一到多个 discovery 实例的定义Region stringZone stringEnv stringHost string}

在 comet 配置中定义为

在 comet 配置源文件中 https://github.com/Terry-Mao/goim/blob/master/internal/comet/conf/conf.go 第 112 行

// Config is comet config.type Config struct {Debug boolEnv *Env # ******************** 这里这里这里Discovery *naming.Config # ******************** 这里这里这里TCP *TCPWebsocket *WebsocketProtocol *ProtocolBucket *BucketRPCClient *RPCClientRPCServer *RPCServerWhitelist *Whitelist}

在 job 配置源文件中 https://github.com/Terry-Mao/goim/blob/master/internal/job/conf/conf.go 第 59 行

// Config is job config.type Config struct {Env *Env # ******************** 这里这里这里Kafka *KafkaDiscovery *naming.Config # ******************** 这里这里这里Comet *CometRoom *Room}

就像第二节所说的, regoin / zone / env , 所以, 重点关注 Env / Discovery 两个配置定义, 重点在 Discovery 配置naming.Config 即可

3.1 在 comet 中的服务注册, 与服务更新3.1.1 注册如下

源代码见 https://github.com/Terry-Mao/goim/blob/master/cmd/comet/main.go 第42/43 行

if err = dis.Set(ins); err != nil {log.Errorf("dis.Set(% v) error(%v)", ins, err)time.Sleep(time.Second)continue}time.Sleep(time.Second * 10)复制代码

3.1.2 更新如下

该 comet 的注册信息更新代码放在一个 goroutine 中, 每10秒更新一次

源代码见 https://github.com/Terry-Mao/goim/blob/master/cmd/comet/main.go 第42/43 行

if err = dis.Set(ins); err != nil { log.Errorf("dis.Set(% v) error(%v)", ins, err) time.Sleep(time.Second) continue}time.Sleep(time.Second * 10)

3.2 在 job 中的服务发现3.2.1 job 中的注册代码, 实际是无用代码

在 job 代码中, 含有服务注册代码, 实际上是无用代码, 原因是, 只有服务端才需要进行服务注册, 而 job 实际上只有两个业务关联逻辑

对 kafka 进行消息订阅向 tomet 中的 comet gRPC server 进行消息 push 推送

代码在 https://github.com/Terry-Mao/goim/blob/master/cmd/job/main.go 第 28行

// grpc register namingdis := naming.New(conf.Conf.Discovery)resolver.Register(dis)

3.2.2 job 中的服务发现代码

代码在 https://github.com/Terry-Mao/goim/blob/master/internal/job/job.go 第 85行

func (j *Job) watchComet(c *naming.Config) {dis := naming.New(c) # **************************** 构造符合 gRPC 要求的服务发现实例resolver := dis.Build("goim.comet")event := resolver.Watch() # **************************** 监听 服务发现, 这里返回一个 channelselect { # **************************** 从 channel 中循环获取返回case _, ok := <-event:if !ok {panic("watchComet init failed")}if ins, ok := resolver.Fetch(); ok { # **************************** ins 即是返回的实例if err := j.newAddress(ins.Instances); err != nil {panic(err)}log.Infof("watchComet init newAddress:% v", ins)}case <-time.After(10 * time.Second):log.Error("watchComet init instances timeout")}go func() {for {if _, ok := <-event; !ok {log.Info("watchComet exit")return}ins, ok := resolver.Fetch() # **************************** ins 即是返回的实例if ok {if err := j.newAddress(ins.Instances); err != nil {log.Errorf("watchComet newAddress(% v) error(% v)", ins, err)continue}log.Infof("watchComet change newAddress:% v", ins)}}}()}

4. bilibili/discovery 架构与实现简要解读

.............稍后一一道来, 哈, 先去挣点钱先.............

.

5. 一些必读的好文章详解 Eureka 缓存机制(https://www.infoq.cn/article/y_1BCrbLONU61s1gbGsU) -- 文章作者: 冯永彪

.

欢迎交流与批评..... .

.

关于我

网名 tsingson (三明智, 江湖人称3爷)

原 ustarcom IPTV/OTT 事业部播控产品线技术架构湿/解决方案工程湿角色(8年), 自由职业者,

喜欢音乐(口琴,是第三/四/五届广东国际口琴嘉年华的主策划人之一), 摄影与越野,

喜欢 golang 语言 (商用项目中主要用 postgres golang )

tsingson 写于中国深圳 小罗号口琴音乐中心, 2019/04/25

作者:tsingson链接:https://juejin.im/post/5cc10b086fb9a0323c526bb0来源:掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 保存番茄酱的方法(长时间存放番茄酱的步骤)
  • 2024-06-30长时间存放番茄酱的步骤在番茄酱罐头开口处放层保鲜膜密封好,放入冰箱冷藏层也可储藏许久食用时刮去上面一层食用即可食盐+香油在每次食用后都向罐内撒些食盐、滴些香油,这样便能有效的抑制番茄酱中细菌的繁殖而延长存放时间。
  • 文章离婚后什么样子 文章夫妇终将离婚
  • 2024-06-30文章离婚后什么样子 文章夫妇终将离婚7月28日,演员文章微博发文宣布离婚:“吾爱伊琍,同行半路,一别两宽,余生漫漫,依然亲情守候”随后,演员马伊琍也发文:“你我深爱过,努力过,彼此成就过此情有憾,然无对错往后,各生欢喜”2019年7月,。
  • 曾陷整容风波(她公开承认整容)
  • 2024-06-30她公开承认整容12月20日,张檬被求婚了评论区却是骂声一片“不搭配,早晚分手很讨厌、不喜欢,很烦”“都不是什么好人,女的是三,男的是五.....”“不仅三还翻白眼内涵正主,互联网果然没有记忆”“可千万别离,免得祸害。
  • 滴滴顺风车限制出行次数(滴滴顺风车公布整改进展)
  • 2024-06-30滴滴顺风车公布整改进展资料图:滴滴站牌中新社发王冈摄中新网客户端北京4月15日电(记者吴涛)15日,滴滴顺风车负责人张瑞发布“滴滴顺风车致大家的一封信”,公布了“严查人车不符”等滴滴顺风车最近五大整改措施方向滴滴还表示,顺。
  • 凉拌菜大全家常菜黄瓜的做法(11款黄瓜凉拌菜香脆可口)
  • 2024-06-3011款黄瓜凉拌菜香脆可口黄瓜两吃1.准备2个黄瓜,清洗干净,改刀切段,或者切成粗条,进行摆盘2.盘里再配上2个料碟,一个甜面酱,一个白砂糖甜面酱需要提前蒸制一下,或者加入少许清水稀释一下,即可上桌2种口味任意蘸食此菜也可以将。
  • 网红脸好看但看着假不自然生动(没了滤镜后的镜头之下)
  • 2024-06-30没了滤镜后的镜头之下网红脸和明星脸真的有壁,在镜头之下,才知颜值和照片是两回事——引言【本文主笔:夷安】明星和网红的界限一直以来都不是很清晰,不少人都觉得网红有了名气,拍拍电视剧、电影,就算转型明星成功了,可真的是这样吗。
  • 彩金怎么清洗比较亮(如何清洗呢)
  • 2024-06-30如何清洗呢准备好一个容器、清水、以及瓶珠宝清洁剂,将彩金和清洁剂放入水中,浸泡8分钟左右,然后将彩金取出,用干净的绒布擦干用平时刷牙用的牙膏,把彩金饰品涂满,等5分钟后,用清水洗干净,然后擦干即可如果金饰表面已。
  • 河南最有禅心的寺庙 豫北地区大有名气
  • 2024-06-30河南最有禅心的寺庙 豫北地区大有名气香泉寺,位于河南卫辉市西北二十公里处太公镇的霖落山上始建于北齐天保七年(公元556年),为著名高僧僧稠禅师在魏离宫旧址上所建提起香泉寺,它虽没有嵩山少林寺那样远近闻名,但是它在豫北地区却大有名气,素有。
  • 民航非法干扰行为定义(擅自设电台干扰航空专用频率)
  • 2024-06-30擅自设电台干扰航空专用频率工信部网站今日消息,为充分发挥典型案例在执法实践中的示范指导作用,工业和信息化部无线电管理局(国家无线电办公室)公布“无线电行政执法十大典型案例”信息显示,河南省三门峡市某单位擅自设置、使用无线电台干。
  • 大冬天长筒靴该怎么穿才是最时尚(教你学会长筒靴穿搭)
  • 2024-06-30教你学会长筒靴穿搭秋冬季节的穿搭,最重要的就是可以突出高级感,但是保暖与时尚兼具的穿搭,就要更在意细节除了会搭配衣服,还要学会怎么选鞋子,虽然小白鞋是最百搭的,但是我们不能只知道小白鞋的穿搭,长筒靴的穿搭才是高级感的王。
  • 光芒吴丽姿逃跑(光芒吴丽姿配不上程亦治)
  • 2024-06-30光芒吴丽姿配不上程亦治#光芒张新成#文/罗小可由张新成、蔡文静、王一楠、王自健等主演的电视剧《光芒》目前快要接近尾声了,该剧讲述了有志青年程亦治跟千金大小姐吴丽姿共同奋斗成长的励志爱情故事张新成阳光帅气,新角色程亦治励志善。