| 
									
										
										
										
											2025-02-07 17:08:55 +08:00
										 |  |  | package infra | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"context" | 
					
						
							|  |  |  | 	"log" | 
					
						
							|  |  |  | 	"time" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"git.apinb.com/bsm-sdk/core/print" | 
					
						
							|  |  |  | 	"git.apinb.com/bsm-sdk/core/utils" | 
					
						
							|  |  |  | 	clientv3 "go.etcd.io/etcd/client/v3" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var ( | 
					
						
							|  |  |  | 	Service    service | 
					
						
							| 
									
										
										
										
											2025-02-07 20:33:27 +08:00
										 |  |  | 	RootPrefix string = "/bsm_services/" | 
					
						
							| 
									
										
										
										
											2025-02-07 17:08:55 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type service struct{} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (s *service) Register(cli *clientv3.Client, serviceName string, port int) error { | 
					
						
							|  |  |  | 	lease := clientv3.NewLease(cli) | 
					
						
							|  |  |  | 	grantResp, err := lease.Grant(context.TODO(), 5) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	serviceAddr := utils.GetLocationIP() + ":" + utils.Int2String(port) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	key := RootPrefix + serviceName + "/" + utils.Int642String(time.Now().UnixNano()) | 
					
						
							|  |  |  | 	_, err = cli.KV.Put(context.TODO(), key, serviceAddr, clientv3.WithLease(grantResp.ID)) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	keepAliveChan, err := lease.KeepAlive(context.TODO(), grantResp.ID) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-02-07 20:33:27 +08:00
										 |  |  | 	print.Info("[BSM Register] Service Key: %s", key) | 
					
						
							|  |  |  | 	print.Info("[BSM Register] Service Val: %s", serviceAddr) | 
					
						
							| 
									
										
										
										
											2025-02-07 17:08:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-02-07 20:33:27 +08:00
										 |  |  | 	print.Success("[BSM Register] Service Register Complete.") | 
					
						
							| 
									
										
										
										
											2025-02-07 17:08:55 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	go func() { | 
					
						
							|  |  |  | 		for keepAliveResp := range keepAliveChan { | 
					
						
							|  |  |  | 			if keepAliveResp == nil { | 
					
						
							|  |  |  | 				log.Println("LeaseKeepAlive", "Failed") | 
					
						
							|  |  |  | 				return | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}() | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } |