register.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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. stop, err := NewPublisher(serverCode, serverPort, n.Client.Endpoints()...).Register()
  13. if err != nil {
  14. return nil, err
  15. }
  16. return func() {
  17. stop <- struct{}{}
  18. }, nil
  19. //return n.RegisterWithContext(context.Background(), serverCode, serverPort, serverIp...)
  20. }
  21. // RegisterWithContext 注册服务
  22. func (n *Node) RegisterWithContext(ctx context.Context, serverCode string, serverPort string, domain ...string) (func(), error) {
  23. var err error
  24. var serverAddr string
  25. if len(domain) > 0 {
  26. serverAddr = domain[0]
  27. } else {
  28. serverAddr = fmt.Sprintf("http://%s", iputil.InternalIp())
  29. }
  30. //创建租约
  31. lease, err := n.Client.Grant(ctx, 5)
  32. if err != nil {
  33. return nil, err
  34. }
  35. //像etcd注册服务
  36. finalAddr := serverAddr
  37. if serverPort != "" {
  38. finalAddr = fmt.Sprintf("%s:%s", serverAddr, serverPort)
  39. }
  40. key := createServerRegisterKey(n.scheme, serverCode, finalAddr)
  41. _, err = n.Client.Put(ctx, key, time.Now().Format(""), client.WithLease(lease.ID))
  42. if err != nil {
  43. return nil, err
  44. }
  45. log.Printf("service registed gateway for %s success!\n", key)
  46. //续租约
  47. keepAlive, err := n.Client.KeepAlive(ctx, lease.ID)
  48. if err != nil {
  49. return nil, err
  50. }
  51. go func() {
  52. for {
  53. select {
  54. case <-n.Client.Ctx().Done():
  55. fmt.Println("server closed")
  56. return
  57. case _, ok := <-keepAlive:
  58. if !ok {
  59. fmt.Println("keep live channel closed")
  60. _, _ = n.Client.Revoke(ctx, lease.ID)
  61. return
  62. }
  63. }
  64. }
  65. }()
  66. return func() {
  67. _, _ = n.Client.Revoke(ctx, lease.ID)
  68. }, nil
  69. }