🎉 Initial Commit
	
		
			
	
		
	
	
		
	
		
			Some checks failed
		
		
	
	
		
			
				
	
				release-nightly / build-docker (push) Has been cancelled
				
					
					
				
			
		
		
	
	
				
					
				
			
		
			Some checks failed
		
		
	
	release-nightly / build-docker (push) Has been cancelled
				This commit is contained in:
		
							
								
								
									
										29
									
								
								pkg/internal/directory/connect.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								pkg/internal/directory/connect.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| package directory | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"fmt" | ||||
| 	"google.golang.org/grpc" | ||||
| 	"google.golang.org/grpc/credentials/insecure" | ||||
| 	health "google.golang.org/grpc/health/grpc_health_v1" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| func ConnectService(in *ServiceInstance) (*grpc.ClientConn, error) { | ||||
| 	conn, err := grpc.NewClient( | ||||
| 		in.GrpcAddr, | ||||
| 		grpc.WithTransportCredentials(insecure.NewCredentials()), | ||||
| 	) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("failed to create grpc connection: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	client := health.NewHealthClient(conn) | ||||
| 	ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) | ||||
| 	defer cancel() | ||||
| 	if _, err = client.Check(ctx, &health.HealthCheckRequest{}); err != nil { | ||||
| 		return conn, fmt.Errorf("grpc service is down: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	return conn, nil | ||||
| } | ||||
							
								
								
									
										29
									
								
								pkg/internal/directory/models.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								pkg/internal/directory/models.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| package directory | ||||
|  | ||||
| import "google.golang.org/grpc" | ||||
|  | ||||
| type ServiceInstance struct { | ||||
| 	ID       string  `json:"id"` | ||||
| 	Type     string  `json:"type"` | ||||
| 	Label    string  `json:"label"` | ||||
| 	GrpcAddr string  `json:"grpc_addr"` | ||||
| 	HttpAddr *string `json:"http_addr"` | ||||
|  | ||||
| 	grpcConn   *grpc.ClientConn | ||||
| 	retryCount int | ||||
| } | ||||
|  | ||||
| func (v *ServiceInstance) GetGrpcConn() (*grpc.ClientConn, error) { | ||||
| 	if v.grpcConn != nil { | ||||
| 		return v.grpcConn, nil | ||||
| 	} | ||||
|  | ||||
| 	var err error | ||||
| 	v.grpcConn, err = ConnectService(v) | ||||
| 	if err != nil { | ||||
| 		RemoveServiceInstance(v.ID) | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	return v.grpcConn, nil | ||||
| } | ||||
							
								
								
									
										61
									
								
								pkg/internal/directory/services.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								pkg/internal/directory/services.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,61 @@ | ||||
| package directory | ||||
|  | ||||
| import ( | ||||
| 	"sync" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	ServiceTypeAuthProvider = "passport" | ||||
| 	ServiceTypeFileProvider = "paperclip" | ||||
| ) | ||||
|  | ||||
| var serviceDirectory sync.Map | ||||
|  | ||||
| func GetServiceInstance(id string) *ServiceInstance { | ||||
| 	val, ok := serviceDirectory.Load(id) | ||||
| 	if ok { | ||||
| 		return val.(*ServiceInstance) | ||||
| 	} else { | ||||
| 		return nil | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func GetServiceInstanceByType(t string) *ServiceInstance { | ||||
| 	var result *ServiceInstance | ||||
| 	serviceDirectory.Range(func(key, value any) bool { | ||||
| 		if value.(*ServiceInstance).Type == t { | ||||
| 			result = value.(*ServiceInstance) | ||||
| 			return false | ||||
| 		} | ||||
| 		return true | ||||
| 	}) | ||||
| 	return result | ||||
| } | ||||
|  | ||||
| func ListServiceInstance() []*ServiceInstance { | ||||
| 	var result []*ServiceInstance | ||||
| 	serviceDirectory.Range(func(key, value interface{}) bool { | ||||
| 		result = append(result, value.(*ServiceInstance)) | ||||
| 		return true | ||||
| 	}) | ||||
| 	return result | ||||
| } | ||||
|  | ||||
| func ListServiceInstanceByType(t string) []*ServiceInstance { | ||||
| 	var result []*ServiceInstance | ||||
| 	serviceDirectory.Range(func(key, value interface{}) bool { | ||||
| 		if value.(*ServiceInstance).Type == t { | ||||
| 			result = append(result, value.(*ServiceInstance)) | ||||
| 		} | ||||
| 		return true | ||||
| 	}) | ||||
| 	return result | ||||
| } | ||||
|  | ||||
| func AddServiceInstance(in *ServiceInstance) { | ||||
| 	serviceDirectory.Store(in.ID, in) | ||||
| } | ||||
|  | ||||
| func RemoveServiceInstance(id string) { | ||||
| 	serviceDirectory.Delete(id) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user