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

文章图片

文章图片

文章图片

文章图片

文章图片
【心跳|Nacos Go 微服务生态系列(一)| Dubbo-go 云原生核心引擎探索】
简介:作为微服务框架的核心引擎--注册中心 , 是必不可缺少的组件 , 市面已经有多款注册中心支持 Go 语言 , 应该如何选择呢?我们可以对目前主流的支持 Go 语言的注册中心做个对比 。
近几年 , 随着 Go 语言社区逐渐发展和壮大 , 越来越多的公司开始尝试采用 Go 搭建微服务体系 , 也涌现了一批 Go 的微服务框架 , 如 go-micro、go-kit、Dubbo-go 等 , 跟微服务治理相关的组件也逐渐开始在 Go 生态发力 , 如 Sentinel、Hystrix 等都推出了 Go 语言版本 , 而作为微服务框架的核心引擎--注册中心 , 也是必不可缺少的组件 , 市面已经有多款注册中心支持 Go 语言 , 应该如何选择呢?我们可以对目前主流的支持 Go 语言的注册中心做个对比 。
根据上表的对比我们可以从以下几个维度得出结论:
- 生态:各注册中心对 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 都支持雪崩保护 , 避免因为过多的实例不健康对健康的实例造成雪崩效应 。
- Dubbo-go 云原生核心引擎探索;
- Sentinel-go 外部动态数据源初探;
- go-micro 集成 Nacos 实践;
引言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 服务端主动推送 , Nacos-SDK-go 在启动的时候会监听一个 UDP 端口 , 该端口在调用 Nacos Register API 的时候作为参数传递 , Nacos 会记录 Ip 和端口 , 当服务实例发生变化时 , Nacos 会对所有监听该服务的 Ip 和端口发送 UDP 请求 , 推送变化后的服务实例信息;
- Nacos-SDK-go 定期查询 , SDK 会对订阅的服务实例定时调用查询接口 , 如果查询有变化则通过回调接口通知 Dubbo-go 。 作为兜底策略保证 Nacos 服务端推送失败后 , 仍能感知到变化 。
此外 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;
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 已经注册成功 。
图 8
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 端成功 。
作者:李志鹏
本文为阿里云原创内容 , 未经允许不得转载 。
推荐阅读
- 显微镜|假如人类可以把显微镜提升到40亿倍,是不是全新的宇宙观?
- 各地地方风味特色菜!
- 猜成语|看图猜成语:稍微转一转,生命更精彩!
- 布法罗大学|新工具可以通过眼睛里的微小反射来识别出深度伪造照片
- 心脏|心脏“总阀门”堵死心跳骤停6次
- 微创手术|女大学生双手“挥汗如雨” 微创手术20分钟搞定顽疾
- 大叔用xo酱炖的辣豆腐,嫩滑可口,咸鲜微辣,家人爱吃!
- 鲫鱼我只服这样做,稍微腌制风干,做好一次可以吃上半年
- 使用微波炉蒸蔬菜,要想好吃营养不流失,不同的蔬菜方法不同
- 微笑豆沙巧克力面包
