作者 | 李志鹏

近几年,随着 Go 语言社区逐渐发展和壮大,越来越多的公司开始尝试采用 Go 搭建微服务体系,也涌现了一批 Go 的微服务框架,如 go-micro、go-kit、Dubbo-go 等,跟微服务治理相关的组件也逐渐开始在 Go 生态发力,如 Sentinel、Hystrix 等都推出了 Go 语言版本,而作为微服务框架的核心引擎–注册中心,也是必不可缺少的组件,市面已经有多款注册中心支持 Go 语言,应该如何选择呢?我们可以对目前主流的支持 Go 语言的注册中心做个对比。


图 1

根据上表的对比我们可以从以下几个维度得出结论:

  • 生态:各注册中心对 Go 语言都有支持,但是 Nacos、 Consul、Etcd 社区活跃,zookeeper 和 Eureka 社区活跃度较低;

  • 易用性:Nacos、Eureka、Consul 都有现成的管控平台,Etcd、zookeeper 本身作为 kv 存储,没有相应的管控平台,Nacos 支持中文界面,比较符合国人使用习惯;

  • 场景支持:CP 模型主要针对强一致场景,如金融类,AP 模型适用于高可用场景,Nacos 可以同时满足两种场景,Eureka 主要满足高可用场景,Consul、Zookeepr、Etcd 主要满足强一致场景,此外 Nacos 支持从其它注册中心同步数据,方便用户注册中心迁移;

  • 功能完整性:所有注册中心都支持健康检查,Nacos、Consul 支持的检查方式较多,满足不同应用场景,Zookeeper 通过 keep alive 方式,能实时感知实例变化;Nacos、Consul 和 Eureka 都支持负载均衡策略,Nacos 通过 Metadata selector 支持更灵活的策略;此外,Nacos、Eureka 都支持雪崩保护,避免因为过多的实例不健康对健康的实例造成雪崩效应。

综合上面各维度的对比,可以了解到 Nacos 作为注册中心有一定的优势,那么它对 Go 微服务生态的集成做得如何?为此,我们策划了本系列文章,该系列将为大家介绍 Nacos 在 Go 微服务生态集成中做的一些工作和实践经验,系列内容将主要包含以下三个篇章:

  • Dubbo-go 云原生核心引擎探索;
  • Sentinel-go 外部动态数据源初探;
  • go-micro 集成 Nacos 实践;

接下来我们首先探索下 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 接口订阅该应用的服务实例变化,并对的实例发起服务调用。


图 2

服务模型

图 3 是我们 Dubbo-go 的应用维度服务发现模型,主要有服务和实例两个层级关系,服务实例的属性主要包含实例Id、主机地址、服务端口、激活状态和元数据。图 4 为 Nacos 的服务分级存储模型,包含服务、集群和实例三个层次。两者对比,多了一个集群维度的层级,而且实例属性信息能够完全匹配。

所以在 Dubbo-go 将应用服务实例注册到 Nacos 时,我们只需要将集群设置为默认集群,再填充服务和实例的相关属性,即可完成服务模型上的匹配。此外 Nacos 可以将服务注册到不同的 Namespace 下,实现多租户的隔离。


图 3


图 4

服务实例心跳维持

Dubbo-go 的 Provider 在向 Nacos 注册应用服务实例信息后,需要主动上报心跳,让 Nacos 服务端感知实例的存活与否,以判断是否将该节点从实例列表中移除。维护心跳的工作是在 Nacos-SDK-go 完成的,从图 5 代码中可以看到,当 Dubbo-go 调用 RegisterInstance 注册一个服务实例时,SDK 除了调用 Nacos 的 Register API 之外,还会调用 AddBeatInfo,将服务实例信息添加到本地缓存,通过后台协程定期向 Nacos 发送服务实例信息,保持心跳。

当服务下线时,可以通过调用 DeRegisterInstance 执行反注册,并移除本地的心跳保持任务,Nacos 实例列表中也会将该实例移除。


图 5

订阅服务实例变化

Dubbo-go 的 Consumer 在启动的时候会调用 Nacos-SDK-go 的 Subscribe 接口,该接口入参如图 6,订阅的时候只需要传递 ServiceName 即应用名和回调函数 SubscribeCallback,Nacos 在服务实例发生变化的时候即可通过回调函数通知 Dubbo-go。Nacos-SDK-go 是如何感知 Nacos 的服务实例变化的呢?主要有两种方式:

  • Nacos 服务端主动推送,Nacos-SDK-go 在启动的时候会监听一个 UDP 端口,该端口在调用 Nacos Register API 的时候作为参数传递,Nacos 会记录 Ip 和端口,当服务实例发生变化时,Nacos 会对所有监听该服务的 Ip 和端口发送 UDP 请求,推送变化后的服务实例信息;

  • Nacos-SDK-go 定期查询,SDK 会对订阅的服务实例定时调用查询接口,如果查询有变化则通过回调接口通知 Dubbo-go。作为兜底策略保证 Nacos 服务端推送失败后,仍能感知到变化。


图 6

此外 Nacos-SDK-go 还支持推空保护,当 Nacos 推送的实例列表为空时,不更新本地缓存,也不通知 Dubbo-go 变更,避免 Consumer 无可用实例调用,造成故障。同时,SDK 还支持服务实例信息本地持久化存储,可以保证在 Nacos 服务故障过程中,Consumer 重启也能获取到可用实例,具备容灾效果。

范例实践

1. 环境准备

  • dubbo-go samples 代码下载:https://github.com/apache/dubbo-samples/tree/master/golang,基于 Nacos 注册中心的应用级服务发现的 hello world 代码目录在 registry/servicediscovery/nacos;


图 7

  • Nacos 服务端搭建,参考官方文档:https://nacos.io/zh-cn/docs/quick-start.html,或者使用官方提供的公共 Nacos 服务:http://console.nacos.io/nacos(账号密码:nacos,仅供测试),或者购买阿里云服务:https://help.aliyun.com/document_detail/139460.html。

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 的日志目录。

remote:nacos:address: "console.nacos.io:80"timeout: "5s"params:logDir: "/data/nacos-sdk/log"

configCenter 配置:

config_center:protocol: "nacos"address: "console.nacos.io:80"

配置 server 端环境变量:

export CONF_PROVIDER_FILE_PATH=server端的server.yml文件路径
export APP_LOG_CONF_FILE=server端的log.yml文件路径

进入 registry/servicediscovery/nacos/go-server/app,运行 server.go 的 main 方法,可以从 Nacos 的控制台看到,应用 user-info-server 已经注册成功。

Nacos 的控制台地址:http://console.nacos.io/nacos/#/serviceManagement?dataId=&group=&appName=&namespace=


图 8


图 9

3. Client 端搭建

client 的配置文件在 registry/servicediscovery/nacos/go-server/profiles 目录下,需要修改的地方跟 server 端一样,这里不赘述。

配置 client 端环境变量:

export CONF_CONSUMER_FILE_PATH=client端的server.yml文件路径
export APP_LOG_CONF_FILE=client端的log.yml文件路径

进入 registry/servicediscovery/nacos/go-client/app,运行 client.go 的 main 方法,看到如下日志输出,表示调用 server 端成功。


图 10

相关链接

  • Dubbo-go 项目地址:https://github.com/apache/dubbo-go

  • Dubbo-go 社区交流钉钉群:23331795

  • Nacos 项目地址:https://nacos.io/

  • Nacos 社区交流钉钉群:30438813

  • Nacos golang 生态交流钉钉群:23191211

  • Nacos-SDK-go 项目地址:https://github.com/nacos-group/nacos-sdk-go

招聘信息

如果你对我们在做的事情感兴趣,欢迎你加入我们团队。内推邮箱:water.lyl@alibaba-inc.com

作者简介

李志鹏,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

“阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的公众号。”

Nacos Go 微服务生态系列(一)| Dubbo-go 云原生核心引擎探索相关推荐

  1. Nacos Go微服务生态系列(一) | Dubbo-go 云原生核心引擎探索

    作者:李志鹏, Github账号:Lzp0412,开源社区爱好者,Nacos Committer,Nacos-SDK-go作者,现就职于阿里云云原生应用平台,主要参与服务发现.CoreDNS.Serv ...

  2. Spring Cloud 与微服务学习总结(14)—— 云原生时代,如何从 Java 开发者转型微服务?

    前言 根据维基百科定义,微服务不是整体应用程序中的一个层.相反,微服务是一个独立的业务功能,具有清晰的接口,并且可以通过内部组件实现分层架构.从战略角度来看,微服务架构基本上遵循"做一件事, ...

  3. 微软开源微服务运行时Dapr,赋能云原生应用开发

            Dapr 是一个可移植的.由事件驱动的 Serverless 运行时,用于跨云和边缘构建分布式应用程序.10月9日,正式以 MIT 协议开源. Dapr 使开发人员能够轻松地构建弹性. ...

  4. Spring Cloud与微服务学习总结(13)——云原生趋势下,微服务的拆分粒度如何把握?

    前言 微服务在最近几年大行其道,很多公司的研发人员都在考虑微服务架构,同时,随着 Docker 容器技术和自动化运维等相关技术发展,微服务变得更容易管理,这给了微服务架构良好的发展机会.在做微服务的路 ...

  5. Dubbo 迈出云原生重要一步 - 应用级服务发现解析

    作者 | 刘军(陆龟)  Apache Dubbo PMC 概述 社区版本 Dubbo 从 2.7.5 版本开始,新引入了一种基于实例(应用)粒度的服务发现机制,这是我们为 Dubbo 适配云原生基础 ...

  6. 《Dubbo迈出云原生重要一步-应用级服务发现解析》

    作者 | 刘军(陆龟) Apache Dubbo PMC 概述 社区版本 Dubbo 从 2.7.5 版本开始,新引入了一种基于实例(应用)粒度的服务发现机制,这是我们为 Dubbo 适配云原生基础设 ...

  7. 打造数字化服务能力,中国联通如何借助云原生技术实现增长突围?

    8 月 13 日,中国联通发布<2020 年半年度报告>,公司营业收入同比增长 3.8% 至 1503.97 亿元,其中,主营业务收入 1383.35 亿元,同比增长 4%,高于行业平均的 ...

  8. Nacos发布 v0.2 版本,无缝支持 Spring Cloud 微服务生态及高可用集群模式

    2019独角兽企业重金招聘Python工程师标准>>> 近日,阿里巴巴新开源项目Nacos 发布了 v0.2 版本,该版本开始支持完整的Spring生态技术栈,这包括 Spring ...

  9. 2017微服务 mysql集群_微服务架构系列之Nacos集群搭建

    上回我们说到了<微服务架构系列之Nacos 配置核心概念>,这次我们讲讲Nacos 集群环境搭建. 集群模式跟我们平时进行扩容是一样的,可以通过 Nginx 转发到多个节点,如下图: 如果 ...

最新文章

  1. 破2.5万亿美元,全球市值第一「巨无霸」尾随Meta杀入元宇宙!
  2. SparkSQL ThriftServer 安全相关功能的现状分析
  3. 从业20年的程序员,“盘”出来的5种编程经验
  4. css如何各种中文字体如雅黑、黑体、宋体、楷体等等
  5. Luogu3350 ZJOI2016 旅行者 最短路、分治
  6. 结合“性能监视器” 排查、处理性能瓶颈导致应用吞吐率等指标上不去的问题...
  7. JqGrid3.6最终版本今天发布了
  8. ThinkCMF变量输出+使用函数
  9. sql学习练习题_学习SQL:练习SQL查询
  10. 算法导论 练习12.2
  11. 从Discuz迁移帐号密码到NodeBB
  12. 各自然带代表植被_景观学习 | 消落带的景观设计
  13. 验证手机号码的JS方法
  14. 如何用EasyRecovery恢复中毒U盘中丢失的文件
  15. 结对-结对编项目作业名称-最终程序
  16. SpringBoot学习---Web开发(静态资源处理,首页和图标)
  17. 网易云音乐产品体验报告
  18. 购物网站的设计与实现论文
  19. 应广单片机开发流程需要注意哪些?
  20. OSI七层网络协议归纳

热门文章

  1. ListView 设置高度为刚好能包裹子元素
  2. 1.3 Integer类详解
  3. 求1!+2!+3!+...+10!的值
  4. CSS之Background-size:cover
  5. 【PAT乙级】1082 射击比赛 (20 分)
  6. 【PAT乙级】1031 查验身份证 (15 分)
  7. SolrJ管理SolrCloud
  8. 红帽linux6.0安装教程,第 14 章 引导安装程序
  9. 【Java】6.9 枚举类
  10. 用Java实现天天酷跑(附源码),只能用牛逼来形容了!