【dubbo-go 源码解析】如何搭建 Dubbo-go 开发环境?|Go主题月

1,653 阅读7分钟

图片

无论学习哪个框架、哪种语言,搭建开发环境都是必不可少的一步,学习 Dubbo-go 也是一样。所以,在专栏的第一讲,我们先来介绍 Dubbo-go 的环境搭建。通过学习如何搭建 Dubbo-go 的开发环境、分析源码结构,以及实例如何使用,我们一起踏出学习 Dubbo-go 的第一步。

Dubbo-go 架构简介

在学习 Dubbo-go 之前,先从架构图(图 1 )入手了解 Dubbo-go 的功能。除开篇词中提到的三大核心功能以外,扩展出不少可以丰富整个组件的特色功能,如:集群管理、路由、过滤器、负载均衡、配置中心等。

图片

图 1:Dubbo-go 架构图

接下来,我们开始从如何搭建 Dubbo-go 开发环境开始。

如何搭建 Dubbo-go 开发环境

在写作本文时,Dubbo-go 1.5.5 是社区最新的版本。Dubbo-go 在 1.5.0 之后,加上了应用注册模型,将注册中心从服务级注册模型更换至应用级服务注册模型(具体后续章节会详细讲解)。达到支持 Spring Cloud 与 K8s 的目的,达到传统微服务往云原生微服务模式平滑切换,更具有代表性,所以本专栏中以 Dubbo-go 1.5.5 为讲解版本

首先需要创建源码目录,操作如下所示:

mkdir -p dubbo-go/src/github.com/apache && cd dubbo-go/src/github.com/apache/

其次肯定需要下载源码,可以通过 Dubbo-go 官方仓库 直接下载,也可以 fork 仓库到自己名下再进行下载,执行以下命令下载:

git clone https://github.com/apache/dubbo-go

请执行以下命令,将分支切换至 1.5.5 版本:

git checkout -b v1.5.5 v1.5.5
  

接着,执行以下命令获取依赖包:

这里建议使用国内镜像(主要是默认的镜像会下载速度较慢或者偶尔不能访问),如下所示:

\# MacOS
export GOPROXY="https://goproxy.io"
# Windows
set GOPROXY="https://goproxy.io"

获取依赖包,如下所示:

go mod vendor

最后将 Dubbo-go 目录导入 Goland 再配置 GOPath 。

选择 Preferences -> GOPath -> 设置 GOPath

图片

设置成功之后,即可进行简单的开发。

Dubbo-go 集成了单元测试用例。进行开发后,如需对修改的方法进行回归测试,则可以执行单元测试,验证修改后的功能是否对 Dubbo-go 原有功能有所影响。

执行单元测试

make test

执行所有验证(包括单元测试、检查许可证)

make verify

验证通过之后,接下来需要了解 Dubbo-go 的源码结构。对项目中每一个模块有一个基础的了解,能对后续的深入源码阅读起到至关重要的作用。

Dubbo-go 源码结构

将 Dubbo-go 项目导入 goland 之后,会看到如下的源码结构:

图片

接下来,简单介绍各个模块的功能。至于详细分析,在后面的课程中我们还会继续讲解。

  • C****luster 模块:集群管理相关功能,包括负载均衡、路由、集群基础数据管理、集群管理策略(包括:快速失败策略、区域集群管理策略)等。其中最主要的目的是选择出最符合条件调用的远端实例,并提供丰富的接口,能让用户实现自己的集群管理逻辑。

图片

  • C****ommon 模块:公共能力相关功能,包括静态代理、配置文件解析、日志组件、扩展(Dubbo-go 用于扩展其中能力的模块,后续章节会解释)。其目的在于将框架中公共能力聚合到一个模块中,方便其他模块使用,避免造成循环引用。

图片

  • C****onfig_center 模块:远程配置中心管理相关功能,该模块对链接远程配置中心与处理配置文件进行抽象,与读取配置文件的过程进行解藕。实现配置文件与服务治理规则在远程配置中心存放方式。目前支持业界主流的配置中心,如:apollo、nacos、ZooKeeper。配置中心主要承担了两个作用:启动配置的集中式存储与服务治理规则的存储与通知。

图片

  • F****ilter 模块:过滤器相关功能,该模块实现的是一个开源中间件很常见的功能,其主要作用是给用户方便的在请求之前或者响应之后方便的扩展需求。通常的应用场景在于服务鉴权、服务流控、链路跟踪、收集服务信息、熔断等。

图片

  • M****etadata 模块:元数据中心相关功能,该模块在 Dubbo-go 1.5.x 之后新增的一个为应用级服务发现提供元数据的基础模块。目前支持的元数据中心主要与远程配置中心支持的大体相同,与此同时,也支持本地元数据中心,包括内存及磁盘文件。元数据中心的数据可以被用于服务测试,服务 MOCK 等功能。

图片

  • M****etrics 模块:收集服务指标相关功能,该模块实现的是对服务可见性。Dubbo-go 使用了与 Dubbo (使用 alibaba/metric)不一样的实现方案,Dubbo-go 选择的是业界主流的 prometheus 。使其更容易适配企业原有的组件,降低运维难度及学习成本。

图片

  • P****rotocol 模块:协议相关功能,Dubbo-go 的核心模块之一。包括网络协议与数据序列化协议绑定、实现数据序列化是该模块最主要负责的功能。通过对协议暴露、协议引用、调用状态、调用方法与响应结构的抽象,让方法调用变得透明,不需要关心正在调用方法的底层实现逻辑。除此之外,更加方便快速的扩展新的网络及数据序列化协议。

图片

  • **Registy 模块:**注册中心相关功能,Dubbo-go 的核心模块之一。Dubbo-go 的注册中心模块相对复杂,在保留接口级服务发型模型的兼容基础上,新版本(1.5.x)支持应用级服务发现模型。通过对注册中心中服务注册与发现进行抽象,使注册中心可以自由扩展,如:consul 目录为 consul 注册中心的基本实现。

图片

  • Remoting 模块:远程通讯相关功能,Dubbo-go 的核心模块之一。通过对网络传输层的单向消息传输实现的抽象,即由 Client 端发出请求消息,Server 端负责接收消息。响应消息从 Server 端发出,Client 端负责接收响应消息。从而达到传输层快速扩展的目的。

图片

实例

介绍完 Dubbo-go 的源码结构之后,接下来我会通过一些具体的例子,带你体验 Dubbo-go 是如何使用的。

如何启动 Dubbo-go ?

通过官方仓库下载 Dubbo-go 的 samples github.com/apache/dubb… ,执行下载命令:

git clone https://github.com/apache/dubbo-go-samples

其中例子可以通过使用脚本启动或者基于 yml 配置启动。

脚本启动

在根目录下执行启动脚本,即可看到效果:

./integrate_test.sh helloworld/go-server

上述命令会执行启动 ZooKeeper(基于 Docker)、启动 Provider 、以 Client 角度执行 integration 命令。

基于 yml 配置启动

  1. 启动 ZooK****eeper

下载 ZooKeeper

启动 ZooKeeper

  1. 启动 Provider

(1)将 github.com/apache/dubbo-go-samples/helloworld/go-server/cmd 增加至启动配置中。并设置 CONF_PROVIDER_FILE_PATH (环境变量)为/xxx/xxx/helloworld/go-server/conf/server.yml(绝对路径)。

图片

(2)启动该配置。启动成功后即可看到如下信息:update begin, service event:xxxxxx。

图片

  1. 启动 Client

(1)将 github.com/apache/dubbo-go-samples/helloworld/go-client/cmd 增加至启动配置中。并设置 CONF_CLIENT_FILE_PATH (环境变量)为/xxx/xxx/helloworld/go-client/conf/server.yml(绝对路径)。

图片

(2)启动该配置。启动成功后即可看到如下信息:response result:xxxxxx。

图片

总结

综上所述,可以快速地进行 Dubbo-go 开发环境的搭建,以及通过脚本、IDE 形式对 Dubbo-go 现有功能进行快速验证。

在第一次使用 dubbo-go-samples 进行本地测试的过程中,有以下几点一定要注意:

  • 在启动程序时,必须是以目录为启动的基础,例如:在 helloworld/go-server/cmd 上执行 run 命令,而不是具体的 go 文件。

  • 在运行 consumer 之后,会看到报错信息,程序是否有问题?并不是,只是在关闭网络连接时,打出的日志。可以通过调整日志等级隐藏该部分信息。

  • 通过 IDE 启动程序,太多注意的地方,是否有其他启动方式?可以,通过 make 脚本方式进行启动,但需要结合 docker。

下一讲将介绍 Dubbo-go 的 URL ,它是 Dubbo-go 中基础数据传输的纽带,是传输上下文数据的重要工具。

欢迎关注我的技术公众号

gongzhonghao.png

加入社区

在公众号后台回复关键字【dubbogo】加入 dubbo-go 社区。