register.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. package node
  2. import (
  3. "app.yhyue.com/moapp/jybase/iputil"
  4. "context"
  5. "fmt"
  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. serverAddr = fmt.Sprintf("http://%s", iputil.InternalIp())
  22. }
  23. //创建租约
  24. lease, err := n.Client.Grant(ctx, 5)
  25. if err != nil {
  26. return nil, err
  27. }
  28. //像etcd注册服务
  29. finalAddr := serverAddr
  30. if serverPort != "" {
  31. finalAddr = fmt.Sprintf("%s:%s", serverAddr, serverPort)
  32. }
  33. key := createServerRegisterKey(n.scheme, serverCode, finalAddr)
  34. _, err = n.Client.Put(ctx, key, time.Now().Format(""), client.WithLease(lease.ID))
  35. if err != nil {
  36. return nil, err
  37. }
  38. log.Printf("service registed gateway for %s success!\n", key)
  39. //续租约
  40. _, err = n.Client.KeepAlive(ctx, lease.ID)
  41. if err != nil {
  42. return nil, err
  43. }
  44. //go func() {
  45. // for {
  46. // <-keepAlive
  47. // }
  48. //}()
  49. return func() {
  50. _, _ = n.Client.Revoke(ctx, lease.ID)
  51. }, nil
  52. }