Enovy Proxy(一)

Chung-chun Lo
Skyler Record
Published in
4 min readMar 22, 2022

換到新公司已經過了好長一段時間了,今天就來介紹一下在新公司的第一個專案所接觸到有趣的東西。

在新公司的第一個專案就是負責公司內部服務新的 API Gateway !!! 不得不說這項專案真的是讓我既興奮又害怕的,怕一個搞不好公司的服務都死在我手上...廢話不多說我們直接開始今天的主題。

Envoy是什麼?

Envoy 是使用 C++ 編寫的 L7 代理,單個 Envoy 部署可以在 Java、C++、Go、PHP、Python 等之間形成一個網格。

會使用 Envoy 主要是因為支援了以下幾種功能

  • gRPC
  • Load balancing
  • Circuit breakers
  • Health checks
  • TLS termination
  • Dynamic discovery & dynamic configuration

Envoy 建置

Envoy 官網已經提供了相對應的 Docker image 只要使用該 image 即可,而且官方也提供了非常多的教學。

由於 Envoy 的所有功能都是透過讀取配置文件,所以我們要來撰寫 Envoy Config,這次我們使用 fileSystem 的方式來達成 Dynamic Configuration。

Config 的部分主要是說明了 CDS (Cluster discovery service)和 LDS (Listener discovery service) 這兩個 Config 的位置,以及說明了 Envoy 的 Admin 頁面位於 19000 Port。

這裡我們撰寫的一個 Docker-Compose 建立了一個 Envoy Proxy 和 service1 和 service2 兩個 Service。

再來是 CDS Config 的部分可以看到我們宣告了名為 example_proxy_cluster 的 Cluster 是指到 service1。

LDS 的部分則是宣告了端口為 10000 並且描述了 routing 的部分。

啟動 Docker-Compose 之後我們來看看效果,首先可以透過 Admin 來確認目前的 Config 。透過 Admin 頁面可以看到 Envoy 上的許多資訊,我們進到 config_dump 觀看目前的 config 設定。

然後嘗試呼叫看看我們的 10000 Port,可以看到順利呼叫到了我們 service1。

curl -s http://localhost:10000
Request served by service1
HTTP/1.1 GET /Host: localhost:10000
User-Agent: curl/7.64.1
Accept: */*
X-Forwarded-Proto: http
X-Request-Id: 6672902d-56ca-456c-be6a-992a603cab9a
X-Envoy-Expected-Rq-Timeout-Ms: 15000

接下來我們更改一下 CDS Config 讓 Envoy 把服務改導到 service2。

docker-compose exec -T proxy sed -i s/service1/service2/ /var/lib/envoy/cds.yaml

再嘗試呼叫一次

curl http://localhost:10000                                                                                                             
Request served by service2
HTTP/1.1 GET /Host: localhost:10000
User-Agent: curl/7.64.1
Accept: */*
X-Forwarded-Proto: http
X-Request-Id: 1c2417b6-df34-484e-9c94-b243ea1c6e68
X-Envoy-Expected-Rq-Timeout-Ms: 15000

讓我們來確認一下 Envoy 上的 Config

可以看到 Envoy Config 可以透過 FileSystem 的方式去動態的修改 Routing 的部分,但我們實際再運用的時候不管是服務部署或是更新都需要透過修改檔案來更新 Envoy 的確有點不太方便,所以接下來會說明如何利用 Control Plan 的方式來更新 Envoy 。

--

--