heartbeat.go 1.6 KB

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