天天看点

go-micro V2 从零开始(五)集成etcd注册中心前言具体步骤总结支持一下

本文相关代码:gitee

文章目录

  • 前言
  • 具体步骤
    • 一、etcd
      • 1.1 简介
      • 1.2 启动etcd
    • 二、配置注册中心
      • 2.1 代码中配置
        • 2.1.1 服务注册
        • 2.1.2 服务发现
      • 2.2 命令行参数
      • 2.3 环境变量
    • 三、服务管理
  • 总结
  • 支持一下

前言

接下来几章,重点介绍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=[email protected]/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=[email protected]/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=[email protected]/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=[email protected]/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

,即可很直观的看到当前已注册的服务情况了:

go-micro V2 从零开始(五)集成etcd注册中心前言具体步骤总结支持一下

总结

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

go-micro

设计的一点。

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

支持一下

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

go-micro V2 从零开始(五)集成etcd注册中心前言具体步骤总结支持一下