register.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package node
  2. import (
  3. "context"
  4. "fmt"
  5. "gateway/common"
  6. client "go.etcd.io/etcd/client/v3"
  7. "log"
  8. "time"
  9. )
  10. // Register 注册服务
  11. func (n *Node) Register(serverCode string, serverPort string, serverIp ...string) (func(), error) {
  12. return n.RegisterWithContext(context.Background(), serverCode, serverPort, serverIp...)
  13. }
  14. // RegisterWithContext 注册服务
  15. func (n *Node) RegisterWithContext(ctx context.Context, serverCode string, serverPort string, domain ...string) (func(), error) {
  16. var err error
  17. var serverAddr string
  18. if len(domain) > 0 {
  19. serverAddr = domain[0]
  20. } else {
  21. ip, err := common.GetLocalIP()
  22. if err != nil {
  23. return nil, err
  24. }
  25. serverAddr = fmt.Sprintf("http://%s", ip)
  26. }
  27. //创建租约
  28. lease, err := n.Client.Grant(ctx, 5)
  29. if err != nil {
  30. return nil, err
  31. }
  32. //像etcd注册服务
  33. finalAddr := serverAddr
  34. if serverPort != "" {
  35. finalAddr = fmt.Sprintf("%s:%s", serverAddr, serverPort)
  36. }
  37. key := createServerRegisterKey(n.scheme, serverCode, finalAddr)
  38. _, err = n.Client.Put(ctx, key, time.Now().Format(""), client.WithLease(lease.ID))
  39. if err != nil {
  40. return nil, err
  41. }
  42. log.Println(ctx, "service registed gateway for %s success!\n", key)
  43. //续租约
  44. keepAlive, err := n.Client.KeepAlive(ctx, lease.ID)
  45. if err != nil {
  46. return nil, err
  47. }
  48. go func() {
  49. for {
  50. <-keepAlive
  51. }
  52. }()
  53. return func() {
  54. _, _ = n.Client.Revoke(ctx, lease.ID)
  55. }, nil
  56. }