熔断:

一种流量管理模式,防止级联效应,使用熔断来解决此问题。通过暂时切断对服务者的请求来牺牲局部保全整体。Envoy在网络级别即熔断器工作的四层,强制进行断路限制,不需要对每个应用进行独立的配置和编码,每个sidecar后的应用都能使用envoy的网络断路功能。

熔断打开:在固定时间窗口内失败请求的指标达到指定阈值。

熔断半打开:熔断打开后5秒后会试图再把请求发给服务端,如果请求成功则关闭断路,如果失败则继续断论。

熔断关闭:一段时间后服务端可用了则关闭熔断。


Envoy断路器:Envoy的5种断路器,以下情况会打开断路器。

集群最大连接数:建立的最大连接数,仅适用于HTTP1.1,HTTP2可以链路复用。

集群最大请求数:正在请求的数量不能不能超出给定的最大值。仅适用于HTTP2,

集群最大可挂起的最大请求数:等待连接请求的队列数量不能超过给定的值。

集群最大活动重试次数:连接失败的请求发起的最大并发重试次数。

集群最大并发连接池:可以同时实例化出的最大连接池数量。

        没有跨级群的断路器,不同集群可以有不同的断路器设置。在istio中这些机制被成为连接池。


连接池:

最大连接数:表示在任何给定时间内, Envoy 与上游集群建立的最大连接数, 适用于 HTTP/1.1

每连接最大请求数:表示在任何给定时间内, 上游集群中所有主机可以处理的最大请求数; 若设为 1则会禁止 keep alive 特性;

最大请求重试次数:在指定时间内对目标主机最大重试次数

连接超时时间:TCP 连接超时时间, 最小值必须大于 1ms; 最大连接数和连接超时时间是对 TCP 和HTTP 都有效的通用连接设置;

最大等待请求数:待处理请求队列的长度, 若该断路器溢出, 集群的 upstream_rq_pending_overflow 计数器就会递增。

clusters:
  - name: ...
  ...
  connect_timeout: ... # TCP连接的超时时长, 即主机网络连接超时, 合理的设置可以能够改善因调用服务变慢而导致整个链接变慢的情形;
  max_requests_per_connection: ... # 每个连接可以承载的最大请求数, HTTP/1.1和HTTP/2的连接池均受限于此设置, 无设置则无限制, 1表示禁用keep-alive
  ...
  circuit_breakers: {...} # 熔断相关的配置, 可选;
  threasholds: [] 
    - priority: ...     # 适用于特定路由优先级的相关指标及阈值的列表;# 当前断路器适用的路由优先级;    
      max_connections: ... # 可发往上游集群的最大并发连接数, 仅适用于HTTP/1, 默认为1024; 超过指定数量的连接则将其短路;
      max_pending_requests: ... # 允许请求服务时的可挂起的最大请求数, 默认为1024; ; 超过指定数量的连接则将其短路;
      max_requests: ... # Envoy可调度给上游集群的最大并发请求数, 默认为1024; 仅适用于HTTP/2
      max_retries: ... # 允许发往上游集群的最大并发重试数量( 假设配置了retry_policy) , 默认为3;
      track_remaining: ... # 其值为true时表示将公布统计数据以显示断路器打开前所剩余的资源数量; 默认为false;
      max_connection_pools: ... # 每个集群可同时打开的最大连接池数量, 默认为无限制;

示例:

admin:
  access_log_path: "/dev/null"
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 9901

static_resources:
  listeners:
  - address:
      socket_address:
        address: 0.0.0.0
        port_value: 80
    name: listener_http
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
          codec_type: auto
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: backend
              domains:
              - "*"
              routes:
              - match:
                  prefix: "/service/colorless"
                route:
                  cluster: webcluster2
              - match:
                  prefix: "/"
                route:
                  cluster: webcluster1
          http_filters:
          - name: envoy.router

  clusters:
  - name: webcluster1
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: webcluster1
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: colored
                port_value: 80
    circuit_breakers:
      thresholds:         
        max_connections: 1
        max_pending_requests: 1
        max_retries: 3

  - name: webcluster2
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: webcluster2
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: myservice
                port_value: 80
    outlier_detection:
      interval: "1s"
      consecutive_5xx: "3"
      consecutive_gateway_failure: "3"
      base_ejection_time: "10s"
      enforcing_consecutive_gateway_failure: "100"
      max_ejection_percent: "30"
      success_rate_minimum_hosts: "2"