社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
本文相关代码:gitee
接下来几章,重点介绍go-micro几个常用功能的集成。
首先集成的是服务的注册与发现,go-micro框架为服务注册发现提供了标准的接口Registry
。只要实现这个接口就可以定制自己的服务注册和发现。不过官方已经为主流注册中心提供了官方的接口实现,大多数时候我们不需要从头写起。
在老版本的go-micro中默认使用consul
作为注册中心,网上你能搜到的教程大多也是如何注册到consul
,但在v2版中,官方已经不推荐使用consul
。
目前最新版的go-micro
默认使用mDNS
提供零配置的发现系统,他内置于大多数系统。所以之前我们的程序完全不用做任何配置,也不用搭建任何环境,就具备服务注册和发现能力。
而在生产环境,官方则推荐使用etcd
组成更具弹性的集群方案,这也是我们这一章的主要内容。
etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。etcd内部采用raft协议作为一致性算法,etcd基于Go语言实现。
etcd作为服务发现系统,有以下的特点:
etcd项目地址:https://github.com/coreos/etcd/
本教程重点在于演示go-micro中etcd注册中心的集成,对于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
网关),也可在命令行参数或环境变量中随时切换这些配置。
下面分别对这三种方式做展示:
同为go-micro微服务,在标准的接口下,生产者和消费者的配置方式没有什么本质区别.
不过为了清晰,下面我们分别展示服务方注册服务和消费者服务发现的代码实现。
以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
以测试代码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()
...
在启动命令中增加如下参数:
--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。
在环境变量中配置注册中心:
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
,即可很直观的看到当前已注册的服务情况了:
这一章我们用很少的代码和很简单的参数将之前的编写的服务,切换到了etcd注册中心。这种种基于统一接口的简洁和方便也是我非常青睐go-micro
设计的一点。
下一节我们将用同样简单的方式将消息中间件切换为第三方的nats。
原创不易,买杯咖啡,谢谢:p
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!