Kitex 源码解析 —— 将服务注册进入注册中心的细节

作者&投稿:字鸦 (若有异议请与网页底部的电邮联系)
~

Kitex为 字节跳动 内部的 Golang 微服务 RPC 框架,具有 高性能 强可扩展 的特点,在字节内部已广泛使用。如果对微服务性能有要求,又希望定制扩展融入自己的治理体系,Kitex 会是一个不错的选择。

这次我们可以从 官方示例 中的 easy_note 这个demo 开始分析,因为它基本展示了 Kitex 的基本使用方法。

下面图例为官方在 demo 中展示的架构图,通过简单的分析可得, note , user 通过 注册中心 (Etcd) 进行注册 , api 通过 注册中心 来发现 note , user 两个 rpc 服务, 并进行业务处理。

kitex-examples/hello 这个最简单示例分析,从 cloudwego/kitex 的快速上手可知,这里用了最简单的 直链 来链接 server 和 client。而这次的 easy_note 中使用了 注册中心 来作为 服务之间的 桥梁 (middleware), 为什么不使用之前的方式而是使用了注册中心?

我们搜索一下注册中心的作用,可知: 服务注册中心的主要作用就是「服务的注册」和「服务的发现」

我们将服务交给注册中心管理,虽然可以避免处理复杂的手动管理,我们也许需要还要考虑更多问题,例如:

这次目标之一就是来解析解析服务是如何在服务启动时进行 注册 ( Register ) 这个操作的, 这次我们从 easy_note/cmd/user 这个服务开始分析, 因为它是被 注册 进入 Etcd 的服务之一。

我们从其中的 main.go 开始下手,以下的内容是经过简化后的文件,是实现配置服务,启动服务的文件

由注释可知 WithRegister() 为配置 注册信息 的函数 ,那为什么直接就看这个函数呢?

一是因为主要配置注册的主要逻辑在其中,二是因为 With... 的函数结构都是大同小异,十分相似的。

再然后我们进入 kitex/server/option.go ,先看看 di.Push(fmt.Sprintf("WithRegistry(%T)", r)) 这一行,

这个 *util.Slice 是什么 ?进去看看?

进入 kitex/pkg/utils/slice.go , 我发现它很简短。但是它好眼熟,它好像是一个非常常见的数据结构 —— Stack (栈)

在这个文件之下有它的 slice__test.go 文件 ,看到这里的朋友可以去试验一下是否这个 Slice 和我的想法是否一致,大家看文章是要思考的嘛!最好可以动动手!

我们再进入 o.Registry = r 这一行,可以得知 Options 用于初始化 server, Option 用于配置 Options (我觉得这种命名方式很巧妙,我感觉基本达到了 见名知意 的作用),里面东西很多,我们今天只看 Register 部分

到了这里我们可以暂停思考一下,到达这一步是怎么个过程呢?是通过 main.go/user.NewServer() 的方法进来的。

NewServer() 的作用是什么?是用于配置初始化服务器的 可选参数

配置完了参数什么时候生效呢 ( Register 是什么时候发生的呢) ?其实配置的实现就在 main.go NewServer() 的下一句, Run() !

进入Run方法的实现,可以得知 register 是发生在 server 启动成功后 的,停止也是会向 Etcd 进行注销操作的 (大家可以在同文件的 Stop() 中查看)

至此 服务完成了向 Etcd 的注册,我忽略了许多其他细节,这些细节也很有意思,希望大家可以自己试着探索

这次文章其实向大家分析了如何配置服务,以及向注册中心进行注册的方法和时机。

虽然省略了许多细节,但是通过这篇文章可以学到什么呢?




中沙群岛的岛礁及其海域15857685100: git怎么将我的代码强制切换成服务器的代码 -
叶秦复方: 还没有想到办法解决.(先备份当前有修改过的文件) 最好,先返回指定版本 git reset old_commit_id 然后,新建分支 git branch -b rcommit_id 再,删除线上的master分支(将默认分支切换到其它分支) git push origin :master 然后,将之前备份的文件覆盖当前分支内的文件.最后,将分支名改为master,再提交即可,再设置为默认分支.git branch -m rcommit_id master git push origin master

中沙群岛的岛礁及其海域15857685100: python如何解析json代码分析 -
叶秦复方: 先import json导入json模块,然后加载json编码 如f是读取网页得到的json结构 加载:json_r=json.loads(f) 然后就像操作字典那样操作json_r 比如json_r为['basic':'123','phonetic':'234'],想要获取basic键的值123的话,t=json_r.get('basic'),则结果为t='123' 依此类推即可

中沙群岛的岛礁及其海域15857685100: 如何通过终端将代码push到github上 掘金 -
叶秦复方: 1、在github有个项目 2、查看该项目,右边中间部位有类似:git@github.com:zjmainstay/test.git的链接,使用git客户端执行命令:git clone git@github.com:zjmainstay/test.git可以得到一个git仓库注:git clone的使用需要将本地ssh的公钥(id_...

中沙群岛的岛礁及其海域15857685100: C++如何代码实现启用被禁用的服务并启动它 -
叶秦复方: 您好,1、创建一个头文件,其中列出所有代码分析警告和这些警告的初始状态,如下面的代码所示:// WarningState.h #pragma warning ( default : 6001 ) #pragma warning ( disable : 6011 )// more warnings here // end of file 将 WarningState.h ...

中沙群岛的岛礁及其海域15857685100: 易语言网页代码解析模块 -
叶秦复方: 第一:你可以简单的语言里喊的open()命令的源.打开指定的URL仔细看,你使用搜索功能 第二:你使用的模块汉族.模块可以指定打开某些网页 第三:易语言编写的程序(一些简单的语言不是单纯的被编译的软件版本) 上述三个问题保证.我希望你可以找到!

中沙群岛的岛礁及其海域15857685100: linux socket编程代码解析
叶秦复方: #include<stdio.h> #include<stdlib.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #include<netdb.h> char *host_name="127.0.0.1"; int port=7778; struct student { char name[20]; char num[20]; float ...

中沙群岛的岛礁及其海域15857685100: 如何将源码导入到eclipse -
叶秦复方: 如下: 下载3.2.X其中的一个版本; 安装Gradle软件,官网下载,解压即可,设置GRADLE_HOME,和PATH. 命令行中运行gradle -v,检查一下是否正确安装配置; 命令行中运行spring framework根目录下的import-into-eclipse.bat 连续两次回车,就可以开始自动构建; 中间出现停止不前的情况里,按ctrl+c终止,再运行就可以进行下去; 过程需要花些时间(几个小时都有可能),视下载各种依赖jar包和dom文件的速度而定; 在Eclipse菜单File->import选择General下面的Exsiting projects into workspace,这样就导入完成了.

中沙群岛的岛礁及其海域15857685100: 怎样解读源代码 -
叶秦复方: 打开网页,右键-查看源文件 不过这样你看不到后台的代码的,这个设计到安全问题.也有相关的软件

中沙群岛的岛礁及其海域15857685100: c#代码分析
叶秦复方: C.第一次ShowArr(arr);时, for(int i=0;i<arr.length;i++) { Console.Write(arr[i]); arr[i]=arr[i]*2; } 循环3次,第一次时,先输出arr[0]=2,在arr[i]=arr[i]*2,arr[0]变为4了,同理接下来的2次就分别变为,8和12了 在第二次ShowArr(arr);是,就把已经替换的数输出变为,4,8,12了,如果还有第3次的话就变为,8,16,24了,当然是没有逗号的咯.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网