Go Micro Dashboard – 实现细节(一)

前言

Go Micro Dashboard是基于go-microng-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。

debug/handler/debug.go

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 - 实现细节(一)

总结

本文介绍了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/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • GO后端开发+VUE实列

    因为我是从java转到go,代码结构跟我之前用java的很像 在这里只浅显的实战运用,没有过多理论讲解 工作环境:IDE:Goland , Go 1.17.7 框架 Gin+Gor…

    Go语言 2023年5月25日
    061
  • golang 标准库template的代码生成

    最近,随着 antd Pro v5 的升级,将项目进行了升级,现在生成的都是 ts 代码。这个项目的自动生成代码都是基于 golang 的标准库 template 的,所以这篇博客…

    Go语言 2023年5月25日
    042
  • Go语言程序记录日志

    许多软件系统运行中需要日志文件。Go语言程序中,输出日志需要使用包”log”,编写程序十分简单。 像Java语言程序,输出日志时,往往需要使用开源的软件包来…

    Go语言 2023年5月29日
    038
  • HTTP 尝试获取 Client IP

    HTTP 中获取 Client IP 相关策略需求, 在当下网络环境中多数只能提供建议作用. 更多的是 通过其它唯一标识来挖掘更多潜在价值. 本文主要就一个内容, 如何最大可能尝试…

    Go语言 2023年5月25日
    058
  • 在开发中将git运用自如

    写这篇文章的初衷是记录自己在开发中使用git遇到的问题和如何利用git进行高效的开发。个人理解来看,很多人对git运用不自如主要是两方面的原因:1、死记硬背命令,这个其实可以通过h…

    Go语言 2023年5月25日
    047
  • go 错误处理设计思考

    前段时间准备对线上一个golang系统服务进行内部开源,对代码里面的错误处理进行了一波优化。 优化的几个原因: 错误处理信息随意,未分类未定义。看到错误日志不能第一时间定位 错误的…

    Go语言 2023年5月25日
    051
  • Go语言基础笔记

    Go语言基础语法:https://note.youdao.com/noteshare?id=12098a23b490260282f6b7c347ab182f Go语言内建容器:ht…

    Go语言 2023年5月29日
    079
  • 读 Go 源码,可以试试这个工具

    原文链接: 读 Go 源码,可以试试这个工具 编程发展至今,从面向过程到面向对象,再到现在的面向框架。写代码变成了一件越来越容易的事情。 学习基础语法,看看框架文档,几天时间搞出一…

    Go语言 2023年5月25日
    046
  • Golang:将日志以Json格式输出到Kafka

    工程实践中,我们往往还需要对日志进行采集,将日志归集到一起,然后用于各种处理分析,比如生产环境上的错误分析、异常告警等等。在日志消息系统领域,Kafka久负盛名,这篇文章就以将日志…

    Go语言 2023年5月25日
    077
  • Go语言之变量与基础数据类型

    Go 是静态(编译型)语言,是区别于解释型语言的弱类型语言(静态:类型固定,强类型:不同类型不允许直接运算) 例如 python 就是动态强类型语言 1、Go 的特性: 跨平台的编…

    Go语言 2023年5月25日
    054
  • go入门项目:(1) 基于命令行的图书的增删查改

    Go 语言入门练手项目系列 01 基于命令行的图书的增删查改 02 文件管理 持续更新中… 本文来自博客园,作者:Arway,转载请注明原文链接:https://www…

    Go语言 2023年5月25日
    065
  • 从Go编程看IO多路复用Select

    IO多路复用通过某种机制使进程监听某些文件描述符,当文件描述符中有读或写就绪时,进程能够收到系统内核发送的相应通知从而进行相应的IO操作;IO多路复用有:select、poll、e…

    Go语言 2023年5月25日
    055
  • go微服务框架Kratos笔记(二)引入zap日志库

    zap日志库是一款高性能的开源日志库,提供了结构化日志记录和printf风格的日志记录 go get -u go.uber.org/zap 参考官方文档中描述,为了方便业务自适配不…

    Go语言 2023年5月25日
    054
  • Sentinel-Go 源码系列(一)|开篇

    大家好呀,打算写一个 Go 语言组件源码分析系列,一是为了能学习下 Go 语言,看下别人是怎么写 Go 的,二是也掌握一个组件。 本次选择了 Sentinel-Go,一是对 Jav…

    Go语言 2023年5月25日
    064
  • EbitenCookBook中文教程 第一课:安装 Ebiten

    本文实时更新原址:https://ebitencookbook.vercel.app/docs/CookBook_Start/class1 第一课 安装 Ebiten 欢迎大家来到…

    Go语言 2023年5月25日
    059
  • Go切片全解析

    目录结构:数组切片 底层结构 创建 普通声明 make方式 截取 边界问题 追加 拓展表达式 扩容机制 切片传递的坑 切片的拷贝 浅拷贝 深拷贝 var n [4]int fmt….

    Go语言 2023年5月25日
    076
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球