在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
作者 | 李志鹏 近几年,随着 Go 语言社区逐渐发展和壮大,越来越多的公司开始尝试采用 Go 搭建微服务体系,也涌现了一批 Go 的微服务框架,如 go-micro、go-kit、Dubbo-go 等,跟微服务治理相关的组件也逐渐开始在 Go 生态发力,如 Sentinel、Hystrix 等都推出了 Go 语言版本,而作为微服务框架的核心引擎--注册中心,也是必不可缺少的组件,市面已经有多款注册中心支持 Go 语言,应该如何选择呢?我们可以对目前主流的支持 Go 语言的注册中心做个对比。
根据上表的对比我们可以从以下几个维度得出结论:
综合上面各维度的对比,可以了解到 Nacos 作为注册中心有一定的优势,那么它对 Go 微服务生态的集成做得如何?为此,我们策划了本系列文章,该系列将为大家介绍 Nacos 在 Go 微服务生态集成中做的一些工作和实践经验,系列内容将主要包含以下三个篇章:
接下来我们首先探索下 Nacos 是如何与 Dubbo-go 集成。 Dubbo-go 目前是 Dubbo 多语言生态中最火热的一个项目,从 2016 年发布至今,已经走过 5 个年头。最近,Dubbo-go 发布了 v1.5 版本,全面兼容 Dubbo 2.7.x 版本,支持了应用维度的服务注册与发现,和主流的注册模型保持一致,标志着 Dubbo-go 向云原生迈出了关键的一步。 作为驱动服务运转的核心引擎--注册中心,在切换到应用维度的注册模型后,也需要做相应的适配,本文将解析如何以 Nacos 为核心引擎实现应用维度的服务注册与发现,并且给出相应的实践案例。此外,本文代码基于 Dubbo-go v1.5.1,Nacos-SDK-go v1.0.0 和 Nacos v1.3.2。 服务注册与发现架构从架构中,我们可以看到,与接口级别的服务注册发现不同的是,Dubbo-go 的 provider 启动后会调用 Nacos-go-sdk 的 RegisterInstance 接口向 Nacos 注册服务实例,注册的服务名即为应用名称,而不是接口名称。Conusmer 启动后则会调用 Subscribe 接口订阅该应用的服务实例变化,并对的实例发起服务调用。
服务模型图 3 是我们 Dubbo-go 的应用维度服务发现模型,主要有服务和实例两个层级关系,服务实例的属性主要包含实例Id、主机地址、服务端口、激活状态和元数据。图 4 为 Nacos 的服务分级存储模型,包含服务、集群和实例三个层次。两者对比,多了一个集群维度的层级,而且实例属性信息能够完全匹配。 所以在 Dubbo-go 将应用服务实例注册到 Nacos 时,我们只需要将集群设置为默认集群,再填充服务和实例的相关属性,即可完成服务模型上的匹配。此外 Nacos 可以将服务注册到不同的 Namespace 下,实现多租户的隔离。
服务实例心跳维持Dubbo-go 的 Provider 在向 Nacos 注册应用服务实例信息后,需要主动上报心跳,让 Nacos 服务端感知实例的存活与否,以判断是否将该节点从实例列表中移除。维护心跳的工作是在 Nacos-SDK-go 完成的,从图 5 代码中可以看到,当 Dubbo-go 调用 RegisterInstance 注册一个服务实例时,SDK 除了调用 Nacos 的 Register API 之外,还会调用 AddBeatInfo,将服务实例信息添加到本地缓存,通过后台协程定期向 Nacos 发送服务实例信息,保持心跳。 当服务下线时,可以通过调用 DeRegisterInstance 执行反注册,并移除本地的心跳保持任务,Nacos 实例列表中也会将该实例移除。
订阅服务实例变化Dubbo-go 的 Consumer 在启动的时候会调用 Nacos-SDK-go 的 Subscribe 接口,该接口入参如图 6,订阅的时候只需要传递 ServiceName 即应用名和回调函数 SubscribeCallback,Nacos 在服务实例发生变化的时候即可通过回调函数通知 Dubbo-go。Nacos-SDK-go 是如何感知 Nacos 的服务实例变化的呢?主要有两种方式:
此外 Nacos-SDK-go 还支持推空保护,当 Nacos 推送的实例列表为空时,不更新本地缓存,也不通知 Dubbo-go 变更,避免 Consumer 无可用实例调用,造成故障。同时,SDK 还支持服务实例信息本地持久化存储,可以保证在 Nacos 服务故障过程中,Consumer 重启也能获取到可用实例,具备容灾效果。 范例实践1. 环境准备
2. Server 端搭建进入 registry/servicediscovery/nacos/go-server/profiles 文件,可以看到有 dev、release 和 test 三个文件夹,分别对应开发、测试和生产配置。我们使用 dev 配置来搭建开发环境,dev 文件下有 log.yml 和 server.yml 文件,下面对 server.yml 配置进行修改。 remote 配置,这里使用公共的 Nacos 服务,address 支持配置多个地址,用逗号分割。params 参数配置 nacos-sdk 的日志目录。
configCenter 配置:
配置 server 端环境变量:
进入 registry/servicediscovery/nacos/go-server/app,运行 server.go 的 main 方法,可以从 Nacos 的控制台看到,应用 user-info-server 已经注册成功。 Nacos 的控制台地址:http://console.nacos.io/nacos/#/serviceManagement?dataId=&group=&appName=&namespace=
3. Client 端搭建client 的配置文件在 registry/servicediscovery/nacos/go-server/profiles 目录下,需要修改的地方跟 server 端一样,这里不赘述。 配置 client 端环境变量:
进入 registry/servicediscovery/nacos/go-client/app,运行 client.go 的 main 方法,看到如下日志输出,表示调用 server 端成功。
相关链接
招聘信息如果你对我们在做的事情感兴趣,欢迎你加入我们团队。内推邮箱:[email protected] 作者简介李志鹏,Github 账号:Lzp0412,开源社区爱好者,Nacos Committer,Nacos-SDK-go 作者,现就职于阿里云云原生应用平台,主要参与服务发现、CoreDNS、ServiceMesh 相关工作,负责推动 Nacos Go 微服务生态建设。 Spring Cloud Alibaba 七天训练营服务注册与发现是微服务架构体系中最关键的组件之一,为了带领大家系统入门微服务架构,9 月 24 日,由 Spring Cloud Alibaba 创始团队主笔的 Spring Cloud Alibaba 实战训练营将正式开营。七天时间了解微服务各模块的实现原理,手把手教学如何独立开发一个微服务应用,助力小白开发者从 0 到 1 建立系统化的知识体系。点击链接即可参与:https://developer.aliyun.com/learning/trainingcamp/spring/1
|
请发表评论