关于云原生-cloud-native:Nacos-Go-微服务生态系列一-Dubbogo-云原生核心引擎探索

43次阅读

共计 4682 个字符,预计需要花费 12 分钟才能阅读完成。

作者 | 李志鹏

近几年,随着 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 等技术畛域、聚焦云原生风行技术趋势、云原生大规模的落地实际,做最懂云原生开发者的公众号。”

正文完
 0