.NetCore比較流行的微服務應該時是用Ocelot的方式構建微服務,純配置化,開發量也比較小。但是做過一些專案之後發現這個方式不是很適合,首先它比較笨重,其次不支援gRpc和webSocket通訊,最重要是它只適用於.NetCore,如果設計到其他語言如Java和Go就歇菜了。

終於曙光來了,隨著Dapr的誕生,微軟在開源的基礎上有邁出了重要的一步,有人要問了,什麼是Dapr,這個後續章節我會著重介紹,簡單來說就是可以跨語言協同開發微服務。今天我們介紹一下一個輕量級的閘道器服務:Envoy,它是專為大型現代 SOA(面向服務架構)架構設計的 L7 代理和通訊匯流排,體積小,效能高。Envoy 是一個獨立程序,設計為伴隨每個應用程式服務執行。所有的 Envoy 形成一個透明的通訊網格,每個應用程式傳送訊息到本地主機或從本地主機接收訊息,不需要知道網路拓撲,對服務的實現語言也完全無感知,這種模式也被稱為 Sidecar。記住它的以下特點:

    L3/L4/L7 架構

    頂級 HTTP/2 支援

    服務發現和動態配置 

    gRPC 支援 

    特殊協議支援

    可觀測性

    好了 廢話不多說,我們來看下如何構建一個Envoy閘道器。

如上圖所示:大概分了四大塊,我也有備註

admin:域,定義閘道器的本身的地址和埠,日誌資訊等

static_resources:靜態資源,定義監聽服務埠,路由,過濾規則等

clusters:叢集,服務發現,轉發,健康檢查,熔斷等

rate_limit_service:限流服務,這個是獨立的grpc服務,屬於外掛服務,目前有go的demo

完整配置如下:

  1. admin:
  2. access_log_path: /tmp/admin_access.log
  3. address:
  4. # 本地配置
  5. socket_address:
  6. protocol: TCP
  7. address: 0.0.0.0
  8. port_value: 4001
  9. static_resources:
  10. listeners:
  11. # 監聽埠
  12. - name: listener_0
  13. address:
  14. socket_address:
  15. protocol: TCP
  16. address: 0.0.0.0
  17. port_value: 4050
  18. filter_chains:
  19. #閘道器過濾規則
  20. - filters:
  21. - name: envoy.filters.network.http_connection_manager
  22. typed_config:
  23. "@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
  24. stat_prefix: ingress_http
  25. codec_type: AUTO
  26. route_config:
  27. name: local_route
  28. # 路由配置
  29. virtual_hosts:
  30. - name: local_service
  31. domains: ["*"]
  32. routes:
  33. - name: service_a
  34. match:
  35. # 訪問字尾
  36. prefix: "/ap0/"
  37. route:
  38. # 重寫字尾
  39. prefix_rewrite: "/speak/"
  40. # 服務對映
  41. cluster: city_service
  42. http_filters:
  43. - name: envoy.filters.http.router
  44. # 服務叢集
  45. clusters:
  46. - name: service_a
  47. connect_timeout: 0.25s
  48. type: static
  49. lb_policy: round_robin
  50. # 負載均衡服務叢集
  51. hosts:
  52. - socket_address:
  53. address: 127.0.0.1
  54. port_value: 5041
  55. - socket_address:
  56. address: 127.0.0.1
  57. port_value: 5042
  58. # 被動動健康檢查
  59. outlier_detection:
  60. consecutive_5xx: 2
  61. base_ejection_time: 40s
  62. max_ejection_percent: 40
  63. interval: 20s
  64. success_rate_minimum_hosts: 3
  65. success_rate_request_volume: 10
  66. # 主動健康檢查
  67. health_checks:
  68. - timeout: 1s
  69. interval: 10s
  70. interval_jitter: 1s
  71. unhealthy_threshold: 6
  72. healthy_threshold: 1
  73. http_health_check:
  74. path: "/health"
  75. rate_limit_service:
  76. grpc_service:
  77. envoy_grpc:
  78. cluster_name: rate_limit_cluster
  79. timeout: 0.25s

說明

可以看出來:   1.監聽的是4050埠,

2.設定了一個路由service_a,訪問Url:/ap0/ 重寫成 /speak/,

3.服務叢集配置了兩個服務:127.0.0.1:5041,127.0.0.1:5042,從而輕易的實現了負載均衡,預設輪詢模式。

4.設定被動健康檢查:outlier_detection,重現2次5xx訪問之後,主動掉線服務,並且主動檢查掉線服務,成功 success_rate_minimum_hosts: 3 次之後重新上線服務

5.health_checks,主動健康檢查,10秒一次主動檢查叢集服務,連續6次失敗之後,主動掉線服務,保證服務高可用。

部署:

Envoy採用的是Docker部署。下一節介紹如何啟動Envoy閘道器服務