同Eureka一样,SOFARegistry 是蚂蚁金服开源的一个生产级、高时效、高可用的服务注册中心。SOFARegistry 最早源自于淘宝的 ConfigServer,十年来,随着蚂蚁金服的业务发展,注册中心架构已经演进至第五代。目前 SOFARegistry 不仅全面服务于蚂蚁金服的自有业务,还随着蚂蚁金融科技服务众多合作伙伴,同时也兼容开源生态。SOFARegistry 采用 AP 架构,支持秒级时效性推送,同时采用分层架构支持无限水平扩展。
服务注册中心分为四个角色,客户端(Client)、会话服务器(SessionServer)、数据服务器(DataServer)、元数据服务器(MetaServer),每个角色司职不同能力组合后共同提供对外服务能力。
Client
客户端:提供应用接入服务注册中心的基本 API 能力,应用系统通过依赖客户端 JAR 包,通过编程方式调用服务注册中心的服务订阅和服务发布能力。
SessionServer:9603
会话服务器:提供客户端接入能力,接受客户端的服务发布及服务订阅请求,并作为一个中间层将发布数据转发 DataServer 存储。SessionServer 可无限扩展以支持海量客户端连接。
DataServer:9622
数据服务器:负责存储客户端发布数据,数据存储按照数据 ID 进行一致性 hash 分片存储,支持多副本备份,保证数据高可用。DataServer 可无限扩展以支持海量数据量。
MetaServer:9615
元数据服务器:负责维护集群 SessionSer
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 的注册,我忽略了许多其他细节,这些细节也很有意思,希望大家可以自己试着探索
这次文章其实向大家分析了如何配置服务,以及向注册中心进行注册的方法和时机。
虽然省略了许多细节,但是通过这篇文章可以学到什么呢?
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)