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

本文涉及的产品
云原生网关 MSE Higress,422元/月
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
函数计算FC,每月15万CU 3个月
简介: 作为微服务框架的核心引擎--注册中心,是必不可缺少的组件,市面已经有多款注册中心支持 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 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的公众号。”

相关文章
|
2月前
|
运维 监控 负载均衡
动态服务管理平台:驱动微服务架构的高效引擎
动态服务管理平台:驱动微服务架构的高效引擎
52 17
|
1月前
|
安全 Java API
Nacos 3.0 Alpha 发布,在安全、泛用、云原生更进一步
近期,我们欣喜地宣布 Nacos 3.0 的第一个版本 Nacos 3.0-ALPHA 已经发布。Nacos 3.0 的目标是在 2.0 的基础上,进一步优化安全性、易用性和标准化。同时,我们将引入更多功能,帮助用户在分布式协调、AI 大模型、云原生等多种场景中更好地使用 Nacos,以提升其广泛适应性。
126 15
|
5月前
|
Cloud Native Java Nacos
微服务时代的新宠儿!Spring Cloud Nacos实战指南,带你玩转服务发现与配置管理,拥抱云原生潮流!
【8月更文挑战第29天】Spring Cloud Nacos作为微服务架构中的新兴之星,凭借其轻量、高效的特点,迅速成为服务发现、配置管理和治理的首选方案。Nacos(命名和配置服务)由阿里巴巴开源,为云原生应用提供了动态服务发现及配置管理等功能,简化了服务间的调用与依赖管理。本文将指导你通过五个步骤在Spring Boot项目中集成Nacos,实现服务注册、发现及配置动态管理,从而轻松搭建出高效的微服务环境。
329 0
|
2月前
|
Dubbo Cloud Native 应用服务中间件
阿里云的 Dubbo 和 Nacos 深度整合,提供了高效的服务注册与发现、配置管理等关键功能,简化了微服务治理,提升了系统的灵活性和可靠性。
在云原生时代,微服务架构成为主流。阿里云的 Dubbo 和 Nacos 深度整合,提供了高效的服务注册与发现、配置管理等关键功能,简化了微服务治理,提升了系统的灵活性和可靠性。示例代码展示了如何在项目中实现两者的整合,通过 Nacos 动态调整服务状态和配置,适应多变的业务需求。
77 2
|
4月前
|
安全 Cloud Native 测试技术
Star 3w+,向更安全、更泛化、更云原生的 Nacos3.0 演进
祝贺 Nacos 社区 Star 数突破 30000!值此时机,回顾过去的两年时间,Nacos 从 2.0.4 版本演进到了 2.4.2 版本,基本完成了当初构想的高性能、易拓展的目标,并且对产品的易用性和安全性进行了提升,同时优化了新的官网,并进行了多语言和更多生态支持。未来,Nacos 会向更安全、更泛化、更云原生的 Nacos3.0 演进。
178 21
|
2月前
|
Dubbo Java 应用服务中间件
深入探讨了“dubbo+nacos+springboot3的native打包成功后运行出现异常”的原因及解决方案
本文深入探讨了“dubbo+nacos+springboot3的native打包成功后运行出现异常”的原因及解决方案。通过检查GraalVM版本兼容性、配置反射列表、使用代理类、检查配置文件、禁用不支持的功能、查看日志文件、使用GraalVM诊断工具和调整GraalVM配置等步骤,帮助开发者快速定位并解决问题,确保服务的正常运行。
72 1
|
4月前
|
缓存 安全 Java
如何利用Go语言提升微服务架构的性能
在当今的软件开发中,微服务架构逐渐成为主流选择,它通过将应用程序拆分为多个小服务来提升灵活性和可维护性。然而,如何确保这些微服务高效且稳定地运行是一个关键问题。Go语言,以其高效的并发处理能力和简洁的语法,成为解决这一问题的理想工具。本文将探讨如何通过Go语言优化微服务架构的性能,包括高效的并发编程、内存管理技巧以及如何利用Go生态系统中的工具来提升服务的响应速度和资源利用率。
|
4月前
|
Kubernetes Go Docker
掌握微服务架构:从Go到容器化的旅程
摘要,通常简短概述文章内容,要求精炼。在本文中,我们将打破常规,采用一种故事化叙述的摘要,旨在激发读者的好奇心和探究欲: “从宁静的海滨小城出发,我们踏上了一场技术探险之旅,探索微服务架构的奥秘。我们将学习如何用Go编写微服务,以及如何通过Docker和Kubernetes将它们打包进小巧的容器中。在这场旅程中,我们将遇到挑战、收获知识,最终实现应用的快速部署与可扩展性。”
|
5月前
|
XML JSON Go
微服务架构下的配置管理:Go 语言与 yaml 的完美结合
微服务架构下的配置管理:Go 语言与 yaml 的完美结合
|
5月前
|
消息中间件 监控 Java
解锁Spring Cloud微服务架构的奥秘:深度剖析拆分原则,打造高内聚低耦合的业务创新引擎!
【8月更文挑战第3天】踏入微服务领域,Spring Cloud以丰富组件助力高效系统构建。微服务拆分需遵循原则确保系统高内聚低耦合且能适应变化。首要原则为单一职责,每个服务专注一个业务功能,降低复杂度并提高可维护性。其次,追求高内聚低耦合以减少服务间影响。围绕业务域拆分有助于保持逻辑清晰及团队协作。处理数据一致性问题时,考虑采用最终一致性模型。Spring Cloud提供Eureka、Zuul/Gateway、Sleuth和Config等工具支持服务发现、路由、跟踪及配置管理,共同构建灵活健壮的微服务架构。
101 2