heartbeat.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package util
  2. import (
  3. "context"
  4. "encoding/json"
  5. "github.com/go-redis/redis/v8"
  6. "github.com/gogf/gf/v2/frame/g"
  7. "github.com/gogf/gf/v2/os/gctx"
  8. "log"
  9. "time"
  10. )
  11. var ctx = context.Background()
  12. var rdb *redis.Client
  13. // InitRedis 初始化redis客户端
  14. func InitRedis() {
  15. ctx := gctx.New()
  16. rdb = redis.NewClient(&redis.Options{
  17. Addr: g.Config().MustGet(ctx, "redis.address").String(),
  18. Password: g.Config().MustGet(ctx, "redis.password").String(),
  19. DB: 0,
  20. })
  21. }
  22. // NodeInfo 描述节点心跳信息
  23. type NodeInfo struct {
  24. NodeName string `json:"node_name"`
  25. Timestamp int64 `json:"timestamp"`
  26. }
  27. // SendHeartbeat 将节点心跳信息写入redis,过期时间为10秒
  28. func SendHeartbeat() {
  29. nodeName := g.Config().MustGet(ctx, "node.node_name").String()
  30. node := NodeInfo{
  31. NodeName: nodeName,
  32. Timestamp: time.Now().Unix(),
  33. }
  34. data, err := json.Marshal(node)
  35. if err != nil {
  36. log.Println("Heartbeat marshal error", err)
  37. return
  38. }
  39. // key 为 "node:<nodeName>"
  40. rdb.Set(ctx, "node:"+nodeName, data, 10*time.Second)
  41. }
  42. // CheckOnlineNodes 检查在线节点数
  43. func CheckOnlineNodes() ([]NodeInfo, error) {
  44. keys, err := rdb.Keys(ctx, "node:*").Result()
  45. if err != nil {
  46. return nil, err
  47. }
  48. var nodes []NodeInfo
  49. for _, key := range keys {
  50. data, err := rdb.Get(ctx, key).Result()
  51. if err != nil {
  52. continue
  53. }
  54. var node NodeInfo
  55. json.Unmarshal([]byte(data), &node)
  56. nodes = append(nodes, node)
  57. }
  58. return nodes, nil
  59. }
  60. // GetOnlineNodesJSON 返回在线节点信息的JSON格式(供HTTP接口调用)
  61. func GetOnlineNodesJSON() ([]byte, error) {
  62. nodes, err := CheckOnlineNodes()
  63. if err != nil {
  64. return nil, err
  65. }
  66. return json.Marshal(nodes)
  67. }