SJA工艺
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

107 lines
2.1 KiB

3 years ago
3 years ago
3 years ago
  1. package etcd
  2. import (
  3. "time"
  4. "context"
  5. "fmt"
  6. clientv3 "go.etcd.io/etcd/client/v3"
  7. )
  8. //创建租约注册服务
  9. type ServiceReg struct {
  10. client *clientv3.Client
  11. lease clientv3.Lease
  12. leaseResp *clientv3.LeaseGrantResponse
  13. canclefunc func()
  14. keepAliveChan <-chan *clientv3.LeaseKeepAliveResponse
  15. key string
  16. }
  17. func NewServiceReg(addr []string, timeNum int64) (*ServiceReg, error) {
  18. conf := clientv3.Config{
  19. Endpoints: addr,
  20. DialTimeout: 5 * time.Second,
  21. }
  22. var (
  23. client *clientv3.Client
  24. )
  25. if clientTem, err := clientv3.New(conf); err == nil {
  26. client = clientTem
  27. } else {
  28. return nil, err
  29. }
  30. ser := &ServiceReg{
  31. client: client,
  32. }
  33. if err := ser.setLease(timeNum); err != nil {
  34. return nil, err
  35. }
  36. go ser.ListenLeaseRespChan()
  37. return ser, nil
  38. }
  39. //设置租约
  40. func (this *ServiceReg) setLease(timeNum int64) error {
  41. lease := clientv3.NewLease(this.client)
  42. //设置租约时间
  43. leaseResp, err := lease.Grant(context.TODO(), timeNum)
  44. if err != nil {
  45. return err
  46. }
  47. //设置续租
  48. ctx, cancelFunc := context.WithCancel(context.TODO())
  49. leaseRespChan, err := lease.KeepAlive(ctx, leaseResp.ID)
  50. if err != nil {
  51. return err
  52. }
  53. this.lease = lease
  54. this.leaseResp = leaseResp
  55. this.canclefunc = cancelFunc
  56. this.keepAliveChan = leaseRespChan
  57. return nil
  58. }
  59. //监听 续租情况
  60. func (this *ServiceReg) ListenLeaseRespChan() {
  61. for {
  62. select {
  63. case leaseKeepResp := <-this.keepAliveChan:
  64. if leaseKeepResp == nil {
  65. fmt.Printf("已经关闭续租功能\n")
  66. return
  67. } else {
  68. fmt.Printf("续租成功\n")
  69. }
  70. }
  71. }
  72. }
  73. //通过租约 注册服务
  74. func (this *ServiceReg) PutService(key, val string) error {
  75. kv := clientv3.NewKV(this.client)
  76. _, err := kv.Put(context.TODO(), key, val, clientv3.WithLease(this.leaseResp.ID))
  77. return err
  78. }
  79. //撤销租约
  80. func (this *ServiceReg) RevokeLease() error {
  81. this.canclefunc()
  82. time.Sleep(2 * time.Second)
  83. _, err := this.lease.Revoke(context.TODO(), this.leaseResp.ID)
  84. return err
  85. }
  86. func Etcdrun() {
  87. ser,_ := NewServiceReg([]string{"101.201.121.115:2379"},5)
  88. ser.PutService("/Server/001","LeitServer")
  89. //select{}
  90. }