slack5-1770606136/pkg/svc/discovery.go
jordan 6a692ff795
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
ci/woodpecker/manual/woodpecker Pipeline was successful
Initialize project from skeleton template
2026-02-09 03:02:16 +00:00

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, "-", "_"))
}