65 lines
2.0 KiB
Go
65 lines
2.0 KiB
Go
// Package svc provides service discovery for inter-service communication.
|
|
//
|
|
// Services discover sibling services via environment variables injected by the platform.
|
|
// When a component is deployed, it automatically receives env vars for all sibling services
|
|
// in the format: {COMPONENT_NAME}_URL (e.g., AUTH_SVC_URL, CHAT_SVC_URL).
|
|
//
|
|
// Usage:
|
|
//
|
|
// // Get the URL of a sibling service
|
|
// url := svc.ServiceURL("auth-svc")
|
|
// if url == "" {
|
|
// // Service not available
|
|
// }
|
|
//
|
|
// // Or use the typed client
|
|
// client, err := svc.NewClient("auth-svc")
|
|
// if err != nil {
|
|
// // Handle error
|
|
// }
|
|
// resp, err := client.Get(ctx, "/users/123")
|
|
package svc
|
|
|
|
import (
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
// ServiceURL returns the internal URL for a sibling service.
|
|
// The service name should be the component name as defined in the monorepo
|
|
// (e.g., "auth-svc", "chat-svc", "user-service").
|
|
//
|
|
// Returns empty string if the service is not configured (env var not set).
|
|
//
|
|
// Example:
|
|
//
|
|
// url := svc.ServiceURL("auth-svc") // Returns value of AUTH_SVC_URL
|
|
func ServiceURL(serviceName string) string {
|
|
envKey := toEnvKey(serviceName) + "_URL"
|
|
return os.Getenv(envKey)
|
|
}
|
|
|
|
// ServiceConfigured returns true if a service URL is configured.
|
|
// Use this to check for optional service dependencies.
|
|
func ServiceConfigured(serviceName string) bool {
|
|
return ServiceURL(serviceName) != ""
|
|
}
|
|
|
|
// MustServiceURL returns the internal URL for a sibling service.
|
|
// Panics if the service is not configured. Use this for required dependencies
|
|
// during application initialization.
|
|
func MustServiceURL(serviceName string) string {
|
|
url := ServiceURL(serviceName)
|
|
if url == "" {
|
|
panic("required service not configured: " + serviceName)
|
|
}
|
|
return url
|
|
}
|
|
|
|
// toEnvKey converts a service name to its environment variable name prefix.
|
|
// Example: "auth-svc" -> "AUTH_SVC"
|
|
func toEnvKey(serviceName string) string {
|
|
// Replace hyphens with underscores and convert to uppercase
|
|
return strings.ToUpper(strings.ReplaceAll(serviceName, "-", "_"))
|
|
}
|