.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
完整配置如下:
- admin:
- access_log_path: /tmp/admin_access.log
- address:
- # 本地配置
- socket_address:
- protocol: TCP
- address: 0.0.0.0
- port_value: 4001
- static_resources:
- listeners:
- # 監聽埠
- - name: listener_0
- address:
- socket_address:
- protocol: TCP
- address: 0.0.0.0
- port_value: 4050
- filter_chains:
- #閘道器過濾規則
- - filters:
- - name: envoy.filters.network.http_connection_manager
- typed_config:
- "@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
- stat_prefix: ingress_http
- codec_type: AUTO
- route_config:
- name: local_route
- # 路由配置
- virtual_hosts:
- - name: local_service
- domains: ["*"]
- routes:
- - name: service_a
- match:
- # 訪問字尾
- prefix: "/ap0/"
- route:
- # 重寫字尾
- prefix_rewrite: "/speak/"
- # 服務對映
- cluster: city_service
- http_filters:
- - name: envoy.filters.http.router
- # 服務叢集
- clusters:
- - name: service_a
- connect_timeout: 0.25s
- type: static
- lb_policy: round_robin
- # 負載均衡服務叢集
- hosts:
- - socket_address:
- address: 127.0.0.1
- port_value: 5041
- - socket_address:
- address: 127.0.0.1
- port_value: 5042
- # 被動動健康檢查
- outlier_detection:
- consecutive_5xx: 2
- base_ejection_time: 40s
- max_ejection_percent: 40
- interval: 20s
- success_rate_minimum_hosts: 3
- success_rate_request_volume: 10
- # 主動健康檢查
- health_checks:
- - timeout: 1s
- interval: 10s
- interval_jitter: 1s
- unhealthy_threshold: 6
- healthy_threshold: 1
- http_health_check:
- path: "/health"
- rate_limit_service:
- grpc_service:
- envoy_grpc:
- cluster_name: rate_limit_cluster
- 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閘道器服務