go语言版本的Gossip协议包(memberlist)的使用

Python012

go语言版本的Gossip协议包(memberlist)的使用,第1张

由于工作的契机,最近学习了下Gossip,以及go语言的实现版本HashiCorp/memberlist。网上有个最基本的memberlist使用的example,在下边的链接中,感兴趣可以按照文档运行下感受感受。本文主要讲解memberlist v0.1.5 的使用细节。

Gossip是最终一致性协议,是目前性能最好,容错性最好的分布式协议。目前Prometheus的告警组件alertmanager、redis、s3、区块链等项目都有使用Gossip。本文不介绍Gossip原理,大家自行谷歌。

简单的几步即可搭建gossip集群

感谢已经有网友为我们实现了一个example( https://github.com/asim/memberlist

)。

哪里有问题,还请大家多多指正

https://www.consul.io/docs/internals/gossip.html

https://en.wikipedia.org/wiki/Gossip_protocol

https://github.com/asim/memberlist

https://github.com/hashicorp/memberlist

https://zhuanlan.zhihu.com/p/41228196

如发现云监控插件异常停止,请参见以下操作进行排查解决:

查看插件运行状态。

Windows

以Administrator用户登录云监控插件所在主机。

打开服务页面。

通过键盘快捷键Win+R打开运行对话框,输入命令services.msc,单击确定。

查看服务argusagent service的状态。

Linux

以root用户登录云监控插件所在主机。

执行以下命令,查看云监控插件状态。

ps aux | grep argusagent | grep -v grep

如果插件进程已停止运行,请参见以下方法,重启云监控插件。

C++语言版本:请参见如何重启云监控C++版本插件。

Java语言版本:请参见云监控Java语言版本插件安装

Go语言版本:请参见云监控Go语言版本插件安装。

重启云监控插件之后,还是无法恢复其运行状态,请根据实际需求,参见以下方案重新安装插件:

云监控C++语言版本插件安装

云监控Java语言版本插件安装

云监控Go语言版本插件安装

请检查插件运行状态是否恢复正常,如果还是存在异常,您可以通过查看云监控插件的运行日志,判断停止原因,然后根据问题原因进行处理。

C++语言版本的插件日志所在路径如下:

Linux:/usr/local/cloudmonitor/local_data/logs。

Windows:C:\Program Files\Alibaba\cloudmonitor\local_data\logs。

Java语言版本的插件日志所在路径如下:

Linux:/usr/local/cloudmonitor/logs。

Windows:C:/Program Files/Alibaba/cloudmonitor/logs。

Go语言版本的插件日志所在路径如下:

Linux:/usr/local/cloudmonitor/logs

Windows:C:\Program Files\Alibaba\cloudmonitor\logs

本教程介绍 Go 中多模块工作区的基础知识。使用多模块工作区,您可以告诉 Go 命令您正在同时在多个模块中编写代码,并轻松地在这些模块中构建和运行代码。

在本教程中,您将在共享的多模块工作区中创建两个模块,对这些模块进行更改,并在构建中查看这些更改的结果。

本教程需要 go1.18 或更高版本。使用go.dev/dl中的链接确保您已在 Go 1.18 或更高版本中安装了 Go 。

首先,为您要编写的代码创建一个模块。

1、打开命令提示符并切换到您的主目录。

在 Linux 或 Mac 上:

在 Windows 上:

2、在命令提示符下,为您的代码创建一个名为工作区的目录。

3、初始化模块

我们的示例将创建一个hello依赖于 golang.org/x/example 模块的新模块。

创建你好模块:

使用 . 添加对 golang.org/x/example 模块的依赖项go get。

在 hello 目录下创建 hello.go,内容如下:

现在,运行 hello 程序:

在这一步中,我们将创建一个go.work文件来指定模块的工作区。

在workspace目录中,运行:

该go work init命令告诉为包含目录中模块的工作空间go创建一个文件 。go.work./hello

该go命令生成一个go.work如下所示的文件:

该go.work文件的语法与go.mod相同。

该go指令告诉 Go 应该使用哪个版本的 Go 来解释文件。它类似于文件中的go指令go.mod 。

该use指令告诉 Go在进行构建时hello目录中的模块应该是主模块。

所以在模块的任何子目录中workspace都会被激活。

2、运行工作区目录下的程序

在workspace目录中,运行:

Go 命令包括工作区中的所有模块作为主模块。这允许我们在模块中引用一个包,即使在模块之外。在模块或工作区之外运行go run命令会导致错误,因为该go命令不知道要使用哪些模块。

接下来,我们将golang.org/x/example模块的本地副本添加到工作区。然后,我们将向stringutil包中添加一个新函数,我们可以使用它来代替Reverse.

在这一步中,我们将下载包含该模块的 Git 存储库的副本golang.org/x/example,将其添加到工作区,然后向其中添加一个我们将从 hello 程序中使用的新函数。

1、克隆存储库

在工作区目录中,运行git命令来克隆存储库:

2、将模块添加到工作区

该go work use命令将一个新模块添加到 go.work 文件中。它现在看起来像这样:

该模块现在包括example.com/hello模块和 `golang.org/x/example 模块。

这将允许我们使用我们将在模块副本中编写的新代码,而不是使用命令stringutil下载的模块缓存中的模块版本。

3、添加新功能。

我们将向golang.org/x/example/stringutil包中添加一个新函数以将字符串大写。

将新文件夹添加到workspace/example/stringutil包含以下内容的目录:

4、修改hello程序以使用该功能。

修改workspace/hello/hello.go的内容以包含以下内容:

从工作区目录,运行

Go 命令在go.work文件指定的hello目录中查找命令行中指定的example.com/hello模块 ,同样使用go.work文件解析导入golang.org/x/example。

go.work可以用来代替添加replace 指令以跨多个模块工作。

由于这两个模块在同一个工作区中,因此很容易在一个模块中进行更改并在另一个模块中使用它。

现在,要正确发布这些模块,我们需要发布golang.org/x/example 模块,例如在v0.1.0. 这通常通过在模块的版本控制存储库上标记提交来完成。发布完成后,我们可以增加对 golang.org/x/example模块的要求hello/go.mod:

这样,该go命令可以正确解析工作区之外的模块。