使用go-zero微服务框架实现云监控后台(二.远程指令下发)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 使用go-zero微服务框架实现云监控后台(二.远程指令下发)

这是逐步实现该方案的第二篇文章。


后台操控指令远程下发的实现


这里记录下如何实现后台命令下发到终端设备上,触发终端上送日志文件,实现运维人员远程可以足不出户,采集设备日志的功能。


实现原理:


终端设备上运行的监控服务会定时10分钟上送一次设备状态。在终端设备请求上送状态时,把后台设置的操作命令响应给它。虽然这样后台的操作指令,只能10分钟后被下发,实时性不够高,然而对采集日志而言,这也不影响什么。


实现方法:


使用redis,封装提供微服务接口,传参数设备号和操控命令字和过期时间。终端设备每10分钟状态上报时,先查询redis缓存是否存在有该设备的控制命令,有则在响应报文中应答给终端。


type CmdSetReq struct {
  Sn     string `json:"sn"`     //设备唯一号
  Cmd    int    `json:"cmd"`    //控制命令字
  Expire int    `json:"expire"` //失效时间(分钟)
}
type CmdSetResp struct {
  Code int    `json:"code"`
  Msg  string `json:"msg"`
}


func (l *CmdSetLogic) CmdSet(in *status.CmdSetReq) (*status.CmdSetResp, error) {
  // todo: add your logic here and delete this line
  err := l.svcCtx.Cache.SetWithExpire(shared.CacheSnPrefix+in.Sn, in.Cmd, 60*time.Duration(in.Expire)*time.Second)
  if err != nil && err == shared.ErrNotFound {
    return &status.CmdSetResp{Code: 1, Msg: "cmd set Cache error"}, nil
  }
  return &status.CmdSetResp{Code: 0, Msg: "ok"}, nil
}


接上篇文章,在monitor项目代码根目录下,创建shared目录,里面放置公共的配置信息,如缓存KEY的前缀和错误码定义信息:


package shared
import "errors"
var ErrNotFound = errors.New("cache not found")
var CacheSnPrefix = "cache::cmd:sn:"


gozero中使用缓存Cache模块。使用方法:


monitor\rpc\status\internal\svc路径下的servicecontext.go中,增加Cache字段,并在NewServiceContext中完成初始化:


package svc
import "monitor/shared"
import "monitor/rpc/status/internal/config"
//手动代码
import "monitor/rpc/status/model"
import "github.com/tal-tech/go-zero/core/stores/sqlx"
import "github.com/tal-tech/go-zero/core/stores/cache"
import "github.com/tal-tech/go-zero/core/syncx"
type ServiceContext struct {
  Config config.Config
  Model  model.TbStatusModel // 手动代码
  Cache  cache.Cache //增加使用redis缓存
}
func NewServiceContext(c config.Config) *ServiceContext {
  //缓存
  ca := cache.New(c.Cache, syncx.NewSharedCalls(), cache.NewStat("cmdset"), shared.ErrNotFound)
  return &ServiceContext{
    Config: c,
    Model:  model.NewTbStatusModel(sqlx.NewMysql(c.DataSource), c.Cache), // 手动代码
    Cache:  ca,
  }
}


在monitor\rpc\status\internal\logic的cmdsetlogic.go中,增加对缓存的设置。


package logic
import (
  "context"
  "monitor/rpc/status/internal/svc"
  "monitor/rpc/status/status"
  "monitor/shared"
  "time"
  "github.com/tal-tech/go-zero/core/logx"
)
type CmdSetLogic struct {
  ctx    context.Context
  svcCtx *svc.ServiceContext
  logx.Logger
}
func NewCmdSetLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CmdSetLogic {
  return &CmdSetLogic{
    ctx:    ctx,
    svcCtx: svcCtx,
    Logger: logx.WithContext(ctx),
  }
}
func (l *CmdSetLogic) CmdSet(in *status.CmdSetReq) (*status.CmdSetResp, error) {
  // todo: add your logic here and delete this line
  err := l.svcCtx.Cache.SetWithExpire(shared.CacheSnPrefix+in.Sn, in.Cmd, 60*time.Duration(in.Expire)*time.Second)
  if err != nil && err == shared.ErrNotFound {
    return &status.CmdSetResp{Code: 1, Msg: "cmd set Cache error"}, nil
  }
  return &status.CmdSetResp{Code: 0, Msg: "ok"}, nil
}


然后在接收到终端上送上来的状态时,先读取一下缓存,看是否有该终端的控制命令。(读redis很快,耗时可忽略)


func (l *StatusUploadLogic) StatusUpload(in *status.StatusUploadReq) (*status.StatusUploadResp, error) {
  // todo: add your logic here and delete this line
  //检查 缓存中是否有值
  var cmd int32 = 0
  err := l.svcCtx.Cache.Get(shared.CacheSnPrefix+in.Sn, &cmd)
  if err != nil && err == shared.ErrNotFound {
    fmt.Println(err)
  } else {
    fmt.Println("GetCache ok:", cmd)
    l.svcCtx.Cache.Del(shared.CacheSnPrefix + in.Sn)
  }
  // 手动代码开始,插入记录到数据库
  t, _ := time.Parse("2006-01-02", in.Ndate)
  _, err = l.model.Insert(model.TbStatus{
    Sn:    sql.NullString{in.Sn, true},
    Posno: sql.NullString{in.Posno, true},
    City:  sql.NullString{in.City, true},
    Tyid:  sql.NullString{in.Tyid, true},
    Ndate: sql.NullTime{t, true},
    Ntime: sql.NullString{in.Ntime, true},
    Cmd:   sql.NullInt64{int64(cmd), true},
  })
  if err != nil {
    return nil, err
  }
  return &status.StatusUploadResp{Code: 0, Msg: "server resp,insert record ok", Cmd: cmd}, nil
}


Over,就这么简单,实现了指令的下发。


注意本机测试时,调整下rest和rpc服务的接口超时时间。默认的网关rest接口超时是3秒,默认rpc服务接口超时时间是2秒。有点儿短,在etc下的yaml文件中调整下即可。


增加timeout:6000的配置改为6秒超时。



相关实践学习
基于云监控实现的监控系统
通过阿里云云监控功能给非阿里云主机安装监控插件,从而实现对非阿里云主机的各项指标进行监控和管理,在配置报警规则和报警人的情况下,能对特定的场景做出报警反应通知到报警人的手机上。
目录
打赏
0
0
0
0
32
分享
相关文章
颠覆开发效率!国内首个微服务编排框架Juggle开源啦!
Juggle是国内首个开源的微服务编排框架,专注于解决企业微服务进程中接口重复开发、系统对接复杂等问题。它提供零代码、低代码和AI增强功能,通过可视化拖拽快速组装简单API为复杂接口,支持多协议、多语言脚本和流程多版本管理。相比国外框架如Conductor,Juggle更贴合国内需求,具备高效开发、企业级可靠性及信创适配等优势,助力企业实现敏捷创新与数字化转型。
颠覆开发效率!国内首个微服务编排框架Juggle开源啦!
探索Go语言在微服务架构中的优势
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出。本文将深入探讨Go语言在构建微服务时的性能优势,包括其在内存管理、网络编程、并发模型以及工具链支持方面的特点。通过对比其他流行语言,我们将揭示Go语言如何成为微服务架构中的一股清流。
206 53
【环境】Rocky8使用gvm配置Go多版本管理的微服务开发环境(go-zero)
通过本文的介绍,我们详细讲解了如何在Rocky8上使用gvm来管理多个Go版本,并配置go-zero框架的开发环境。通过gvm的灵活管理,开发者可以轻松切换不同的Go版本,以适应不同项目的需求。同时,go-zero框架的使用进一步提升了微服务开发的效率和质量。希望本文能帮助开发者构建高效的Go语言开发环境,提高项目开发的灵活性和稳定性。
152 63
eino — 基于go语言的大模型应用开发框架(二)
本文介绍了如何使用Eino框架实现一个基本的LLM(大语言模型)应用。Eino中的`ChatModel`接口提供了与不同大模型服务(如OpenAI、Ollama等)交互的统一方式,支持生成完整响应、流式响应和绑定工具等功能。`Generate`方法用于生成完整的模型响应,`Stream`方法以流式方式返回结果,`BindTools`方法为模型绑定工具。此外,还介绍了通过`Option`模式配置模型参数及模板功能,支持基于前端和用户自定义的角色及Prompt。目前主要聚焦于`ChatModel`的`Generate`方法,后续将继续深入学习。
585 7
eino — 基于go语言的大模型应用开发框架(一)
Eino 是一个受开源社区优秀LLM应用开发框架(如LangChain和LlamaIndex)启发的Go语言框架,强调简洁性、可扩展性和可靠性。它提供了易于复用的组件、强大的编排框架、简洁明了的API、最佳实践集合及实用的DevOps工具,支持快速构建和部署LLM应用。Eino不仅兼容多种模型库(如OpenAI、Ollama、Ark),还提供详细的官方文档和活跃的社区支持,便于开发者上手使用。
808 8
纯Go语言开发人脸检测、瞳孔/眼睛定位与面部特征检测插件-助力GoFly快速开发框架
开发纯go插件的原因是因为目前 Go 生态系统中几乎所有现有的人脸检测解决方案都是纯粹绑定到一些 C/C++ 库,如 OpenCV 或 dlib,但通过 cgo 调用 C 程序会引入巨大的延迟,并在性能方面产生显著的权衡。此外,在许多情况下,在各种平台上安装 OpenCV 是很麻烦的。使用纯Go开发的插件不仅在开发时方便,在项目部署和项目维护也能省很多时间精力。
139 5
Go 语言中常用的 ORM 框架,如 GORM、XORM 和 BeeORM,分析了它们的特点、优势及不足,并从功能特性、性能表现、易用性和社区活跃度等方面进行了比较,旨在帮助开发者根据项目需求选择合适的 ORM 框架。
本文介绍了 Go 语言中常用的 ORM 框架,如 GORM、XORM 和 BeeORM,分析了它们的特点、优势及不足,并从功能特性、性能表现、易用性和社区活跃度等方面进行了比较,旨在帮助开发者根据项目需求选择合适的 ORM 框架。
590 4
Go语言在微服务架构中的应用实践
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出,成为构建微服务的理想选择。本文将探讨Go语言在微服务架构中的应用实践,包括Go语言的特性如何适应微服务架构的需求,以及在实际开发中如何利用Go语言的特性来提高服务的性能和可维护性。我们将通过一个具体的案例分析,展示Go语言在微服务开发中的优势,并讨论在实际应用中可能遇到的挑战和解决方案。
Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架
本文概述了Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架。
597 1
Go语言在微服务架构中的应用与优势
本文摘要采用问答形式,以期提供更直接的信息获取方式。 Q1: 为什么选择Go语言进行微服务开发? A1: Go语言的并发模型、简洁的语法和高效的编译速度使其成为微服务架构的理想选择。 Q2: Go语言在微服务架构中有哪些优势? A2: 主要优势包括高性能、高并发处理能力、简洁的代码和强大的标准库。 Q3: 文章将如何展示Go语言在微服务中的应用? A3: 通过对比其他语言和展示Go语言在实际项目中的应用案例,来说明其在微服务架构中的优势。