go-micro V2 从零开始(五)集成etcd注册中心 - Go语言中文社区

go-micro V2 从零开始(五)集成etcd注册中心


本文相关代码:gitee


前言

接下来几章,重点介绍go-micro几个常用功能的集成。

首先集成的是服务的注册与发现,go-micro框架为服务注册发现提供了标准的接口Registry。只要实现这个接口就可以定制自己的服务注册和发现。不过官方已经为主流注册中心提供了官方的接口实现,大多数时候我们不需要从头写起。

在老版本的go-micro中默认使用consul作为注册中心,网上你能搜到的教程大多也是如何注册到consul,但在v2版中,官方已经不推荐使用consul

目前最新版的go-micro默认使用mDNS 提供零配置的发现系统,他内置于大多数系统。所以之前我们的程序完全不用做任何配置,也不用搭建任何环境,就具备服务注册和发现能力。

而在生产环境,官方则推荐使用etcd组成更具弹性的集群方案,这也是我们这一章的主要内容。


具体步骤

一、etcd

1.1 简介

etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。etcd内部采用raft协议作为一致性算法,etcd基于Go语言实现。

etcd作为服务发现系统,有以下的特点:

  • 简单:安装配置简单,而且提供了HTTP API进行交互,使用也很简单
  • 安全:支持SSL证书验证
  • 快速:根据官方提供的benchmark数据,单实例支持每秒2k+读操作
  • 可靠:采用raft算法,实现分布式系统数据的可用性和一致性

etcd项目地址:https://github.com/coreos/etcd/

本教程重点在于演示go-micro中etcd注册中心的集成,对于etcd的详细配置和集群部署请根据官方文档指引另行学习。

1.2 启动etcd

因为是go语言编写,你完全可以从GitHub获取整个项目并编译出可执行文件:github

也可以直接从Github上下载他的最新版可执行文件:etcd v3.4.13

如果你打算在Linux或mac环境下使用docker管理他,也可以根据官方指引编写dockerfile

因为只是简单演示,考虑到github的下载速度,这里我们选择docker镜像启动,整个命令都来自于官方文档(官方默认的地址gcr.io/etcd-development/etcd不知道为什么我的docker hub镜像仓库里没有,这里使用了官方提供的备用地址quay.io/coreos/etcd):

rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && 
  docker run 
  -p 2379:2379 
  -p 2380:2380 
  --mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data 
  --name etcd-gcr-v3.4.13 
  -d 
  quay.io/coreos/etcd:v3.4.13 
  /usr/local/bin/etcd 
  --name s1 
  --data-dir /etcd-data 
  --listen-client-urls http://0.0.0.0:2379 
  --advertise-client-urls http://0.0.0.0:2379 
  --listen-peer-urls http://0.0.0.0:2380 
  --initial-advertise-peer-urls http://0.0.0.0:2380 
  --initial-cluster s1=http://0.0.0.0:2380 
  --initial-cluster-token tkn 
  --initial-cluster-state new 
  --log-level info 
  --logger zap 
  --log-outputs stderr

二、配置注册中心

go-micro中配置注册中心非常简单,我们修改极少的代码自定义注册方式和地址。
对于已经打包的程序(如我们上一章使用的micro网关),也可在命令行参数或环境变量中随时切换这些配置。
下面分别对这三种方式做展示:

2.1 代码中配置

同为go-micro微服务,在标准的接口下,生产者和消费者的配置方式没有什么本质区别.
不过为了清晰,下面我们分别展示服务方注册服务和消费者服务发现的代码实现。

2.1.1 服务注册

task-srv服务为例,编辑go-todolist/task-srv/main.go在初始化服务的地方加入注册中心配置:

...
service := micro.NewService(
		micro.Name("go.micro.service.task"),
		micro.Version("latest"),
		// 配置etcd为注册中心,配置etcd路径,默认端口是2379
		micro.Registry(etcd.NewRegistry(
			// 地址是我本地etcd服务器地址,不要照抄
			registry.Addrs("172.18.0.58:2379"),
		)),
	)
...

这里我们只是简单的配置了etcd服务的地址,你可以进入源码查看etcd.NewRegistry支持的配置项,他非常简单:

type Options struct {
	// 地址列表
	Addrs     []string
	// 超时时间
	Timeout   time.Duration
	// 与注册中心的安全通信
	Secure    bool
	// tls加密通信配置
	TLSConfig *tls.Config
	// Other options for implementations of the interface
	// can be stored in a context
	Context context.Context
}

然后正常启动程序,在日志中会发现已经注册到etcd:

> go run main.go

2020-09-25 09:16:53  file=v2@v2.9.1/service.go:200 level=info Starting [service] go.micro.service.task
2020-09-25 09:16:54  file=grpc/grpc.go:864 level=info Server [grpc] Listening on [::]:50480
2020-09-25 09:16:54  file=grpc/grpc.go:697 level=info Registry [etcd] Registering node: go.micro.service.task-7055f608-28f5-4a3c-945d-be1cbfb6bc9f

2.1.2 服务发现

以测试代码task-cli.go为例:

...
server := micro.NewService(
	micro.Name("go.micro.client.task"),
	// 配置etcd为注册中心,配置etcd路径,默认端口是2379
	micro.Registry(etcd.NewRegistry(
		// 地址是我本地etcd服务器地址,不要照抄
		registry.Addrs("172.18.0.58:2379"),
	)),
)
server.Init()
...

2.2 命令行参数

在启动命令中增加如下参数:

  • --registry=etcd
  • --registry_address=172.18.0.58:2379

micro网关为例,修改之前的启动命令:

注意: 注册中心配置是micro的参数而不是micro api命令的参数,必须写在api命令之前!

> micro --registry=etcd --registry_address=172.18.0.58:2379 api --handler=http

2020-09-25 09:30:09  file=api/api.go:259 level=info service=api Registering API HTTP Handler at /{service:[a-zA-Z0-9]+}
2020-09-25 09:30:09  file=http/http.go:90 level=info service=api HTTP API Listening on [::]:8080
2020-09-25 09:30:09  file=v2@v2.9.1/service.go:200 level=info service=api Starting [service] go.micro.api
2020-09-25 09:30:09  file=grpc/grpc.go:864 level=info service=api Server [grpc] Listening on [::]:50623
2020-09-25 09:30:09  file=grpc/grpc.go:697 level=info service=api Registry [etcd] Registering node: go.micro.api-f82c064c-a257-45d3-8ecd-5a995db0ac14

可以看到日志中已经成功注册到etcd。

2.3 环境变量

在环境变量中配置注册中心:

  • MICRO_REGISTRY - 注册方式
  • MICRO_REGISTRY_ADDRESS - 中心地址

仍然以micro api服务为例:

> set MICRO_REGISTRY_ADDRESS=172.18.0.58:2379
> set MICRO_REGISTRY=etcd
> micro api --handler=http

2020-09-25 09:37:26  file=http/http.go:90 level=info service=api HTTP API Listening on [::]:8080
2020-09-25 09:37:26  file=v2@v2.9.1/service.go:200 level=info service=api Starting [service] go.micro.api
2020-09-25 09:37:26  file=grpc/grpc.go:864 level=info service=api Server [grpc] Listening on [::]:50681
2020-09-25 09:37:26  file=grpc/grpc.go:697 level=info service=api Registry [etcd] Registering node: go.micro.api-9d2d816f-a8e6-456b-98db-8c547952fc6a

三、服务管理

启动的服务不可能都依靠日志判断是否注册成功,我们需要一个类似consul控制台的工具来直观管理服务状态。

etcd作为一个key-value数据库本身并不服务管理功能,这里我们又用到了micro工具包的一个功能:web

启动命令如下(注意,注册中心相关配置和api一样要放在web命令之前):

> micro --registry=etcd --registry_address=172.18.0.58:2379 web
 
2020-09-25 10:18:31  file=http/http.go:90 level=info service=web HTTP API Listening on [::]:8082
2020-09-25 10:18:31  file=v2@v2.9.1/service.go:200 level=info service=web Starting [service] go.micro.web
2020-09-25 10:18:31  file=grpc/grpc.go:864 level=info service=web Server [grpc] Listening on [::]:51187
2020-09-25 10:18:31  file=grpc/grpc.go:697 level=info service=web Registry [etcd] Registering node: go.micr
o.web-c632902c-431f-49b2-b8e4-194f09fdaa21

浏览器打开localhost:8082,点击右上角的service,即可很直观的看到当前已注册的服务情况了:
web服务界面


总结

这一章我们用很少的代码和很简单的参数将之前的编写的服务,切换到了etcd注册中心。这种种基于统一接口的简洁和方便也是我非常青睐go-micro设计的一点。

下一节我们将用同样简单的方式将消息中间件切换为第三方的nats。


支持一下

原创不易,买杯咖啡,谢谢:p

支持一下

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/hotcoffie/article/details/108750996
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢