Go Micro Dashboard - 实现细节(一)

Go Micro Dashboard - 实现细节(一)

前言

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。

debug/handler/debug.go

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