企业信息化管理系统

EIMS - 助力企业数字化转型

企业信息化系统服务网格与微服务治理实践

引言

随着企业信息化系统规模的扩大,微服务架构带来了服务治理的复杂性。服务网格(Service Mesh)作为微服务架构的演进,提供了一种基础设施层面的解决方案,将服务治理能力从应用代码中分离出来。

服务网格概述

服务网格是一个专门的基础设施层,用于处理服务间通信,提供以下核心能力:

Istio 架构设计

Istio 是目前最流行的服务网格解决方案,其架构包含数据平面和控制平面:

组件 职责 技术选型
数据平面 Sidecar 代理拦截所有流量 Envoy Proxy
控制平面 配置管理、策略执行 Istiod (Pilot, Citadel, Galley)
入口网关 外部流量入口 Istio Ingress Gateway
Egress 网关 外部服务出口控制 Istio Egress Gateway

流量管理实践

使用 Istio VirtualService 和 DestinationRule 实现精细化的流量管理:

# Kubernetes 部署配置
apiVersion: apps/v1
kind: Deployment
metadata:
  name: order-service
  namespace: eims-prod
spec:
  replicas: 3
  selector:
    matchLabels:
      app: order-service
  template:
    metadata:
      labels:
        app: order-service
        version: v1
      annotations:
        # 启用 Sidecar 自动注入
        sidecar.istio.io/inject: "true"
    spec:
      containers:
      - name: order-service
        image: eims/order-service:v1.0.0
        ports:
        - containerPort: 8080

---
# VirtualService 流量路由
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: order-service
  namespace: eims-prod
spec:
  hosts:
  - order-service
  http:
  # 金丝雀发布:5% 流量到 v2 版本
  - match:
    - headers:
        canary:
          exact: "true"
    route:
    - destination:
        host: order-service
        subset: v2
      weight: 100
  # 默认流量到 v1 版本
  - route:
    - destination:
        host: order-service
        subset: v1
      weight: 95
    - destination:
        host: order-service
        subset: v2
      weight: 5

---
# DestinationRule 目标规则
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: order-service
  namespace: eims-prod
spec:
  host: order-service
  trafficPolicy:
    # 连接池配置
    connectionPool:
      tcp:
        maxConnections: 100
      http:
        h2UpgradePolicy: UPGRADE
        http1MaxPendingRequests: 100
        http2MaxRequests: 1000
    # 负载均衡策略
    loadBalancer:
      consistentHash:
        httpCookie:
          name: user_session
          ttl: 0s
    # 熔断配置
    circuitBreaker:
      consecutive5xxErrors: 5
      interval: 30s
      baseEjectionTime: 30s
      maxEjectionPercent: 50
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2

熔断与限流实现

保护后端服务免受流量冲击:

# 熔断策略示例
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: payment-service
spec:
  host: payment-service
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 50
      http:
        http1MaxPendingRequests: 20
        http2MaxRequests: 100
    circuitBreaker:
      # 连续5次5xx错误触发熔断
      consecutive5xxErrors: 5
      # 熔断检测时间窗口
      interval: 30s
      # 最小 ejection 时间
      baseEjectionTime: 30s
      # 最大驱逐比例
      maxEjectionPercent: 50
      # 最少请求次数
      minRequestPercent: 10

---
# 限流策略(需配合RateLimit服务)
apiVersion: networking.istio.io/v1beta1
kind: EnvoyFilter
metadata:
  name: rate-limit-filter
  namespace: eims-prod
spec:
  workloadSelector:
    labels:
      app: order-service
  configPatches:
  - applyTo: HTTP_FILTER
    match:
      context: SIDECAR_INBOUND
      listener:
        filterChain:
          filter:
            name: envoy.filters.network.http_connection_manager
    patch:
      operation: INSERT_BEFORE
      value:
        name: envoy.filters.http.local_ratelimit
        typed_config:
          "@type": type.googleapis.com/udpa.type.v1.TypedStruct
          type_url: type.googleapis.com/envoy.extensions.filters.http.local_ratelimit.v3.LocalRateLimit
          value:
            stat_prefix: http_local_rate_limiter
            token_bucket:
              max_tokens: 1000
              tokens_per_fill: 1000
              fill_interval: 1s
            filter_enabled:
              runtime_key: local_rate_limit_enabled
              default_value:
                numerator: 100
                denominator: HUNDRED

服务安全配置

配置 mTLS 双向认证和服务间授权:

# 启用 mTLS 严格模式
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: default
  namespace: eims-prod
spec:
  mtls:
    mode: STRICT

---
# 服务间授权策略
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: order-service-auth
  namespace: eims-prod
spec:
  selector:
    matchLabels:
      app: order-service
  rules:
  # 允许支付服务调用
  - from:
    - source:
        principals: ["cluster.local/ns/eims-prod/sa/payment-service"]
  # 允许带特定 header 的请求
  - from:
    - source:
        namespaces: ["eims-prod"]
    when:
    - key: request.headers[x-api-key]
      values: ["valid-key-123"]

---
# 请求认证配置
apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
  name: jwt-auth
  namespace: eims-prod
spec:
  selector:
    matchLabels:
      app: order-service
  jwtRules:
  - issuer: "https://auth.eims.com"
    audiences:
    - "order-service"
    forwardOriginalToken: true
    # 支持从 header 或 cookie 获取 token
    fromHeaders:
    - name: Authorization
      prefix: "Bearer "

可观测性配置

集成 Prometheus、Grafana 和 Jaeger 实现全方位的可观测性:

# Telemetry 配置 - 自动收集指标和追踪
apiVersion: telemetry.istio.io/v1alpha1
kind: Telemetry
metadata:
  name: default-telemetry
  namespace: eims-prod
spec:
  metrics:
  - providers:
    - name: prometheus
  tracing:
  - providers:
    - name: jaeger
    randomSamplingPercentage: 10.0

---
# 通过 Prometheus 查看服务指标
# 请求成功率
istio_requests_total{
  destination_workload="order-service",
  reporter="destination",
  response_code="200"
}

# 请求延迟(p50, p90, p99)
histogram_quantile(0.99,
  rate(istio_request_duration_milliseconds_bucket{
    destination_workload="order-service"
  }[5m]))

# 服务熔断次数
istio_circuit_breakers_total{
  destination_workload="payment-service",
  circuit_breaker="upstream_rq_pending_active"
}

最佳实践建议

总结

服务网格为企业信息化系统提供了强大的微服务治理能力:

通过 Istio 服务网格,可以将服务治理逻辑从应用中解耦,实现更加统一和可控的微服务治理。

← 下一篇:企业信息化系统数据脱敏与隐私保护实践