做者 | 李志鹏html
近几年,随着 Go 语言社区逐渐发展和壮大,愈来愈多的公司开始尝试采用 Go 搭建微服务体系,也涌现了一批 Go 的微服务框架,如 go-micro、go-kit、Dubbo-go 等,跟微服务治理相关的组件也逐渐开始在 Go 生态发力,如 Sentinel、Hystrix 等都推出了 Go 语言版本,而做为微服务框架的核心引擎--注册中心,也是必不可缺乏的组件,市面已经有多款注册中心支持 Go 语言,应该如何选择呢?咱们能够对目前主流的支持 Go 语言的注册中心作个对比。git
图 1github
根据上表的对比咱们能够从如下几个维度得出结论:golang
综合上面各维度的对比,能够了解到 Nacos 做为注册中心有必定的优点,那么它对 Go 微服务生态的集成作得如何?为此,咱们策划了本系列文章,该系列将为你们介绍 Nacos 在 Go 微服务生态集成中作的一些工做和实践经验,系列内容将主要包含如下三个篇章:spring
接下来咱们首先探索下 Nacos 是如何与 Dubbo-go 集成。apache
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 接口订阅该应用的服务实例变化,并对的实例发起服务调用。app
图 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 的服务实例变化的呢?主要有两种方式:
图 6
此外 Nacos-SDK-go 还支持推空保护,当 Nacos 推送的实例列表为空时,不更新本地缓存,也不通知 Dubbo-go 变动,避免 Consumer 无可用实例调用,形成故障。同时,SDK 还支持服务实例信息本地持久化存储,能够保证在 Nacos 服务故障过程当中,Consumer 重启也能获取到可用实例,具有容灾效果。
图 7
进入 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 的配置文件在 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
若是你对咱们在作的事情感兴趣,欢迎你加入咱们团队。内推邮箱:water.lyl@alibaba-inc.com
李志鹏,Github 帐号:Lzp0412,开源社区爱好者,Nacos Committer,Nacos-SDK-go 做者,现就任于阿里云云原生应用平台,主要参与服务发现、CoreDNS、ServiceMesh 相关工做,负责推进 Nacos Go 微服务生态建设。
服务注册与发现是微服务架构体系中最关键的组件之一,为了带领你们系统入门微服务架构,9 月 24 日,由 Spring Cloud Alibaba 创始团队主笔的 Spring Cloud Alibaba 实战训练营将正式开营。七天时间了解微服务各模块的实现原理,手把手教学如何独立开发一个微服务应用,助力小白开发者从 0 到 1 创建系统化的知识体系。点击连接便可参与:https://developer.aliyun.com/learning/trainingcamp/spring/1
“ 阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,作最懂云原生开发者的公众号。”