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

本文涉及的产品
函数计算FC,每月15万CU 3个月
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 作为微服务框架的核心引擎--注册中心,是必不可缺少的组件,市面已经有多款注册中心支持 Go 语言,应该如何选择呢?我们可以对目前主流的支持 Go 语言的注册中心做个对比。

头图.png

作者 | 李志鹏

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

1.png
图 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.png
图 2

服务模型

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

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

3.png
图 3

4.png
图 4

服务实例心跳维持

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

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

5.png
图 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.png
图 6

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

范例实践

1. 环境准备

7.png
图 7

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.png
图 8

9.png
图 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.png
图 10

相关链接

招聘信息

如果你对我们在做的事情感兴趣,欢迎你加入我们团队。内推邮箱: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 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的公众号。”

相关文章
|
14天前
|
Cloud Native API
微服务引擎 MSE 及云原生 API 网关 2024 年 9 月产品动态
微服务引擎 MSE 及云原生 API 网关 2024 年 9 月产品动态。
|
5天前
|
监控 Cloud Native Java
云原生架构下微服务治理策略与实践####
【10月更文挑战第20天】 本文深入探讨了云原生环境下微服务架构的治理策略,通过分析当前技术趋势与挑战,提出了一系列高效、可扩展的微服务治理最佳实践方案。不同于传统摘要概述内容要点,本部分直接聚焦于治理核心——如何在动态多变的分布式系统中实现服务的自动发现、配置管理、流量控制及故障恢复,旨在为开发者提供一套系统性的方法论,助力企业在云端构建更加健壮、灵活的应用程序。 ####
46 10
|
5天前
|
运维 Cloud Native 持续交付
云原生架构下的微服务设计原则与实践####
【10月更文挑战第20天】 本文深入探讨了云原生环境中微服务设计的几大核心原则,包括服务的细粒度划分、无状态性、独立部署、自动化管理及容错机制。通过分析这些原则背后的技术逻辑与业务价值,结合具体案例,展示了如何在现代云平台上实现高效、灵活且可扩展的微服务架构,以应对快速变化的市场需求和技术挑战。 ####
25 7
|
6天前
|
Kubernetes Cloud Native 云计算
云原生之旅:从容器到微服务的探索之路
【10月更文挑战第20天】在数字化转型的浪潮中,云原生技术成为推动企业创新的重要力量。本文将深入探讨云原生的核心概念、技术架构及其在现代软件开发中的应用,揭示如何通过云原生技术提升业务的灵活性和可扩展性。
|
5天前
|
监控 Cloud Native 持续交付
云原生架构下微服务的最佳实践与挑战####
【10月更文挑战第20天】 本文深入探讨了云原生架构在现代软件开发中的应用,特别是针对微服务设计模式的最优实践与面临的主要挑战。通过分析容器化、持续集成/持续部署(CI/CD)、服务网格等关键技术,阐述了如何高效构建、部署及运维微服务系统。同时,文章也指出了在云原生转型过程中常见的难题,如服务间的复杂通信、安全性问题以及监控与可观测性的实现,为开发者和企业提供了宝贵的策略指导和解决方案建议。 ####
29 5
|
4天前
|
Kubernetes Cloud Native 持续交付
云原生架构下的微服务设计原则与最佳实践##
在数字化转型的浪潮中,云原生技术以其高效、灵活和可扩展的特性成为企业IT架构转型的首选。本文深入探讨了云原生架构的核心理念,聚焦于微服务设计的关键原则与实施策略,旨在为开发者提供一套系统性的方法论,以应对复杂多变的业务需求和技术挑战。通过分析真实案例,揭示了如何有效利用容器化、持续集成/持续部署(CI/CD)、服务网格等关键技术,构建高性能、易维护的云原生应用。文章还强调了文化与组织变革在云原生转型过程中的重要性,为企业顺利过渡到云原生时代提供了宝贵的见解。 ##
|
4天前
|
运维 Cloud Native API
云原生时代下的微服务架构实践
【10月更文挑战第22天】在数字化转型的浪潮中,云原生技术正以前所未有的速度重塑软件开发和运维的模式。微服务架构作为云原生的重要组成部分,其设计哲学、技术栈选择以及与传统单体应用的根本区别成为了现代软件工程讨论的焦点。本文将深入探讨微服务架构的核心概念,通过实际案例分析其在云平台下的应用,并分享在实施过程中的经验教训,旨在为读者提供一套清晰的微服务架构实践指南。
|
10天前
|
Cloud Native Go API
Go语言在微服务架构中的创新应用与实践
本文深入探讨了Go语言在构建高效、可扩展的微服务架构中的应用。Go语言以其轻量级协程(goroutine)和强大的并发处理能力,成为微服务开发的首选语言之一。通过实际案例分析,本文展示了如何利用Go语言的特性优化微服务的设计与实现,提高系统的响应速度和稳定性。文章还讨论了Go语言在微服务生态中的角色,以及面临的挑战和未来发展趋势。
|
11天前
|
负载均衡 监控 Cloud Native
云原生架构下的微服务治理策略与实践####
在数字化转型加速的今天,云原生技术以其高效、灵活、可扩展的特性成为企业IT架构转型的首选。本文深入探讨了云原生环境下微服务治理的策略与实践路径,旨在为读者提供一个系统性的微服务治理框架,涵盖从服务设计、部署、监控到运维的全生命周期管理,助力企业在云端构建更加稳定、高效的业务系统。 ####
|
11天前
|
运维 Go 开发者
Go语言在微服务架构中的应用与优势
本文深入探讨了Go语言在构建微服务架构中的独特优势和实际应用。通过分析Go语言的核心特性,如简洁的语法、高效的并发处理能力以及强大的标准库支持,我们揭示了为何Go成为开发高性能微服务的首选语言。文章还详细介绍了Go语言在微服务架构中的几个关键应用场景,包括服务间通信、容器化部署和自动化运维等,旨在为读者提供实用的技术指导和启发。