前言
Go Micro Dashboard是基于go-micro和ng-alain开发的, 它既是go-micro开发过程中的工具,也可以作为学习go-micro的实际案例。接下来我将会详细介绍一下这个项目的一些实现细节。
一、服务列表
服务的发现与注册,是分布式微服务中重要的基础模块,单个服务通过服务注册将节点信息公开出去,并通过服务发现获取其他服务的节点信息。
go-micro中Registry注册中心的定义
go;gutter:true;
// The registry provides an interface for service discovery
type Registry interface {
Init(...Option) error
Options() Options
Register(<em>Service, ...RegisterOption) error
Deregister(</em>Service, ...DeregisterOption) error
GetService(string, ...GetOption) ([]<em>Service, error)
ListServices(...ListOption) ([]</em>Service, error)
Watch(...WatchOption) (Watcher, error)
String() string
}</p>
<pre><code>
Server启动后,都会将自己的Host、Port、Version、Handler、Subscriber、Metadata等信息封装到registry.Service里,然后注册到Registry。
Client在请求时通过GetService获取服务节点信息,并通过Selector中的负载均衡策略选择服务节点。
Go Micro Dashboard通过ListServices获取所有注册的服务,并将Service列表按名称和版本分组。
如下图所示,当前系统中运行的服务服务及对应版本一览无遗,可以点击服务名称或版本号快速查看服务详细信息。
![Go Micro Dashboard - 实现细节(一)](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230524/2648506-20211218153444289-195686906.png)
二、服务详情
通过registry.GetService可以获取到服务的详细信息,包括Version、Endpoints、Nodes等。
go-micro中Service注册服务的定义
;gutter:true;
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。
go;gutter: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
}</p>
<pre><code>
将Service拆分为Nodes、Handlers、Subscribers,就得到下图中的服务详细信息。
![Go Micro Dashboard - 实现细节(一)](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230524/2648506-20211218155314610-1891958124.png)
三、节点列表
通过registry.ListService获取所有服务信息,并将其中所有Nodes按照服务名称分组,就得到了下图中的所有节点列表。
服务启动时,会自动注册健康检查的Handler,我们可以通过这个来对节点进行健康检查。
;gutter:true;
debugService := debug.NewDebugService(req.Service, c)
reply, err := debugService.Health(ctx, &debug.HealthRequest{}, callOpts…)
如果节点运行正常,会返回Status: ok。
go;gutter:true;
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
Original: https://www.cnblogs.com/xpunch/p/15705227.html
Author: xpunch
Title: Go Micro Dashboard – 实现细节(一)
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/516492/
转载文章受原作者版权保护。转载请注明原作者出处!