前言
Go Micro Dashboard是基于go-micro和ng-alain开发的, 它既是go-micro开发过程中的工具,也可以作为学习go-micro的实际案例。接下来我将会详细介绍一下这个项目的一些实现细节。
一、服务列表
服务的发现与注册,是分布式微服务中重要的基础模块,单个服务通过服务注册将节点信息公开出去,并通过服务发现获取其他服务的节点信息。
go-micro中Registry注册中心的定义
// The registry provides an interface for service discovery type Registry interface { Init(...Option) error Options() Options Register(*Service, ...RegisterOption) error Deregister(*Service, ...DeregisterOption) error GetService(string, ...GetOption) ([]*Service, error) ListServices(...ListOption) ([]*Service, error) Watch(...WatchOption) (Watcher, error) String() string }
Server启动后,都会将自己的Host、Port、Version、Handler、Subscriber、Metadata等信息封装到registry.Service里,然后注册到Registry。
Client在请求时通过GetService获取服务节点信息,并通过Selector中的负载均衡策略选择服务节点。
Go Micro Dashboard通过ListServices获取所有注册的服务,并将Service列表按名称和版本分组。
如下图所示,当前系统中运行的服务服务及对应版本一览无遗,可以点击服务名称或版本号快速查看服务详细信息。
二、服务详情
通过registry.GetService可以获取到服务的详细信息,包括Version、Endpoints、Nodes等。
go-micro中Service注册服务的定义
type Service struct { Name string `json:"name"` Version string `json:"version"` Metadata map[string]string `json:"metadata"` Endpoints []*Endpoint `json:"endpoints"` Nodes []*Node `json:"nodes"` }
服务启动后会将Handler和Subscriber都注册到Endpoints中,Handler代表对外提供的RPC服务,Subscriber代表订阅的异步消息。
其中Subscriber的Metadata中subscriber为true。
func isSubscriber(ep *registry.Endpoint) bool { if ep == nil || len(ep.Metadata) == 0 { return false } if s, ok := ep.Metadata["subscriber"]; ok && s == "true" { return true } return false }
将Service拆分为Nodes、Handlers、Subscribers,就得到下图中的服务详细信息。
三、节点列表
通过registry.ListService获取所有服务信息,并将其中所有Nodes按照服务名称分组,就得到了下图中的所有节点列表。
服务启动时,会自动注册健康检查的Handler,我们可以通过这个来对节点进行健康检查。
debugService := debug.NewDebugService(req.Service, c) reply, err := debugService.Health(ctx, &debug.HealthRequest{}, callOpts...)
如果节点运行正常,会返回Status: ok。
func (d *Debug) Health(ctx context.Context, req *proto.HealthRequest, rsp *proto.HealthResponse) error { rsp.Status = "ok" return nil }
总结
本文介绍了Go Micro Dashboard利用Registry查看微服务信息的内部实现,也介绍了go-micro中对应的一些概念。
项目地址:github.com/xpunch/go-micro-dashboard