共计 4043 个字符,预计需要花费 11 分钟才能阅读完成。
简介: 作为微服务框架的外围引擎 – 注册核心,是必不可缺少的组件,市面曾经有多款注册核心反对 Go 语言,应该如何抉择呢?咱们能够对目前支流的反对 Go 语言的注册核心做个比照。
作者 | 李志鹏
近几年,随着 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 重启也能获取到可用实例,具备容灾成果。
范例实际
- 环境筹备
- 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。
- 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
- 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
原文链接
本文为阿里云原创内容,未经容许不得转载。