最新のアプリケーションでは、スケーラビリティ、信頼性、保守性が求められます。このガイドでは、優れた運用を維持しながら現実世界の課題に対処できるマイクロサービス アーキテクチャを設計および実装する方法を説明します。
アーキテクチャの指針となる中心原則から始めましょう:
graph TD A[Service Design Principles] --> B[Single Responsibility] A --> C[Domain-Driven Design] A --> D[API First] A --> E[Event-Driven] A --> F[Infrastructure as Code]
Go を使用した、適切に構造化されたマイクロサービスの例を次に示します。
package main import ( "context" "log" "net/http" "os" "os/signal" "syscall" "time" "github.com/prometheus/client_golang/prometheus" "go.opentelemetry.io/otel" ) // Service configuration type Config struct { Port string ShutdownTimeout time.Duration DatabaseURL string } // Service represents our microservice type Service struct { server *http.Server logger *log.Logger config Config metrics *Metrics } // Metrics for monitoring type Metrics struct { requestDuration *prometheus.HistogramVec requestCount *prometheus.CounterVec errorCount *prometheus.CounterVec } func NewService(cfg Config) *Service { metrics := initializeMetrics() logger := initializeLogger() return &Service{ config: cfg, logger: logger, metrics: metrics, } } func (s *Service) Start() error { // Initialize OpenTelemetry shutdown := initializeTracing() defer shutdown() // Setup HTTP server router := s.setupRoutes() s.server = &http.Server{ Addr: ":" + s.config.Port, Handler: router, } // Graceful shutdown go s.handleShutdown() s.logger.Printf("Starting server on port %s", s.config.Port) return s.server.ListenAndServe() }
カスケード障害からサービスを保護します:
type CircuitBreaker struct { failureThreshold uint32 resetTimeout time.Duration state uint32 failures uint32 lastFailure time.Time } func NewCircuitBreaker(threshold uint32, timeout time.Duration) *CircuitBreaker { return &CircuitBreaker{ failureThreshold: threshold, resetTimeout: timeout, } } func (cb *CircuitBreaker) Execute(fn func() error) error { if !cb.canExecute() { return errors.New("circuit breaker is open") } err := fn() if err != nil { cb.recordFailure() return err } cb.reset() return nil }
信頼性の高いイベント ストリーミングに Apache Kafka を使用する:
type EventProcessor struct { consumer *kafka.Consumer producer *kafka.Producer logger *log.Logger } func (ep *EventProcessor) ProcessEvents(ctx context.Context) error { for { select { case <-ctx.Done(): return ctx.Err() default: msg, err := ep.consumer.ReadMessage(ctx) if err != nil { ep.logger.Printf("Error reading message: %v", err) continue } if err := ep.handleEvent(ctx, msg); err != nil { ep.logger.Printf("Error processing message: %v", err) // Handle dead letter queue ep.moveToDeadLetter(msg) } } } }
インフラストラクチャ管理に Terraform を使用する:
# Define the microservice infrastructure module "microservice" { source = "./modules/microservice" name = "user-service" container_port = 8080 replicas = 3 environment = { KAFKA_BROKERS = var.kafka_brokers DATABASE_URL = var.database_url LOG_LEVEL = "info" } # Configure auto-scaling autoscaling = { min_replicas = 2 max_replicas = 10 metrics = [ { type = "Resource" resource = { name = "cpu" target_average_utilization = 70 } } ] } } # Set up monitoring module "monitoring" { source = "./modules/monitoring" service_name = module.microservice.name alert_email = var.alert_email dashboard = { refresh_interval = "30s" time_range = "6h" } }
サービス API コントラクトを定義します:
openapi: 3.0.3 info: title: User Service API version: 1.0.0 description: User management microservice API paths: /users: post: summary: Create a new user operationId: createUser requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateUserRequest' responses: '201': description: User created successfully content: application/json: schema: $ref: '#/components/schemas/User' '400': $ref: '#/components/responses/BadRequest' '500': $ref: '#/components/responses/InternalError' components: schemas: User: type: object properties: id: type: string format: uuid email: type: string format: email created_at: type: string format: date-time required: - id - email - created_at
包括的な監視を設定します:
# Prometheus configuration scrape_configs: - job_name: 'microservices' kubernetes_sd_configs: - role: pod relabel_configs: - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape] action: keep regex: true # Grafana dashboard { "dashboard": { "panels": [ { "title": "Request Rate", "type": "graph", "datasource": "Prometheus", "targets": [ { "expr": "rate(http_requests_total{service=\"user-service\"}[5m])", "legendFormat": "{{method}} {{path}}" } ] }, { "title": "Error Rate", "type": "graph", "datasource": "Prometheus", "targets": [ { "expr": "rate(http_errors_total{service=\"user-service\"}[5m])", "legendFormat": "{{status_code}}" } ] } ] } }
ゼロダウンタイム展開の実装:
apiVersion: apps/v1 kind: Deployment metadata: name: user-service spec: replicas: 3 strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 0 template: spec: containers: - name: user-service image: user-service:1.0.0 ports: - containerPort: 8080 readinessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 5 periodSeconds: 10 livenessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 15 periodSeconds: 20
回復力のあるマイクロサービスを構築するには、多くの要素を慎重に検討する必要があります。重要なのは次のとおりです:
マイクロサービスを構築する際にどのような課題に直面しましたか?以下のコメント欄であなたの経験を共有してください!
以上が回復力のあるマイクロサービスの設計: クラウド アーキテクチャの実践ガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。