前言
Envoy 是一個(gè)開源的高性能、可擴(kuò)展的代理服務(wù),最初由 Lyft 公司開發(fā)。它設(shè)計(jì)用于處理現(xiàn)代的微服務(wù)架構(gòu)中的網(wǎng)絡(luò)通信,并提供了許多功能,包括負(fù)載均衡、服務(wù)發(fā)現(xiàn)、路由、認(rèn)證、授權(quán)等。Envoy 被廣泛用于構(gòu)建和部署云原生應(yīng)用程序以及微服務(wù)體系結(jié)構(gòu)。
本文將通過將envoy作為前端代理來演示envoy的安裝、配置和簡單使用。
本文使用環(huán)境
Ubuntu 22.04.3 LTS Desktop 64-bit
1 安裝
envoy 編譯比較復(fù)雜,可以使用Envoy 社區(qū)提供的docker鏡像和getenvoy項(xiàng)目,不過getenvoy所使用的版本比較老。在Linux下最簡單的方式還是直接使用官方的envoy預(yù)編譯二進(jìn)制文件。
1.1 下載
從Envoy 的 GitHub 發(fā)行版頁面下載 Ubuntu 的最新版的envoy預(yù)編譯二進(jìn)制文件,這里選擇“envoy-1.28.0-linux-x86_64”
https://github.com/envoyproxy/envoy/releases
1.2 安裝envoy
新建項(xiàng)目目錄,將文件復(fù)制到該目錄下(本文使用/home/zhg/Mine/Workplace/getenvoy/)
下載完成后如果是.tar.gz則需要解壓
如果是(application/x-executable)可執(zhí)行文件,則需要添加添加可執(zhí)行權(quán)限
# 重命名為"envoy"方便輸入命令 sudo mv envoy-1.28.0-linux-x86_64 envoy # 添加可執(zhí)行權(quán)限 chmod +x envoy
通過以下命令可以查看envoy版本,以驗(yàn)證envoy是否正確安裝
./envoy --version
2 配置
配置參考官網(wǎng)
www.envoyproxy.io/docs/envoy/…
envoy 可以通過靜態(tài)配置和動(dòng)態(tài)配置兩種方式實(shí)現(xiàn),靜態(tài)文件通常yaml格式的文件進(jìn)行配置,主要字段有:
listeners(監(jiān)聽器)
listeners 字段用于定義Envoy監(jiān)聽的網(wǎng)絡(luò)地址和協(xié)議。它描述了Envoy如何接收和處理傳入的連接請(qǐng)求。
listeners: - name:給監(jiān)聽器命名,方便引用。 - address:指定監(jiān)聽的 IP 地址和端口。 - filters:指定用于處理傳入連接的過濾器鏈,包括協(xié)議轉(zhuǎn)碼、路由、TLS 等。
filter(過濾器)
filters字段通常用于通過配置文件引入和加載Envoy的各種過濾器。過濾器是Envoy的功能組件,用于在請(qǐng)求或響應(yīng)的處理過程中執(zhí)行特定的操作。過濾器可以添加、修改或刪除請(qǐng)求或響應(yīng)的頭信息,執(zhí)行轉(zhuǎn)換,執(zhí)行日志記錄等操作。
envoy.http_connection_manager 是Envoy的HTTP連接管理器,它用于處理HTTP請(qǐng)求和響應(yīng)。它是Envoy配置的核心組件之一,負(fù)責(zé)管理HTTP連接的生命周期、處理HTTP協(xié)議、執(zhí)行各種過濾器等。該連接管理器允許您配置各種HTTP功能,包括路由、重試、負(fù)載均衡、超時(shí)等
filters: # 過濾器列表 - name: envoy.http_connection_manager # 使用 Envoy 的 HTTP 連接管理器過濾器 typed_config: # 配置該過濾器的類型和參數(shù) "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager codec_type: HTTP2 # 使用 HTTP/2 編解碼器 stat_prefix: ingress_http # 用于生成統(tǒng)計(jì)信息的前綴 route_config: # 路由配置 name: local_route # 路由的名稱 virtual_hosts: # 虛擬主機(jī)列表
clusters(集群)
clusters 字段用于定義集群(clusters)。集群是Envoy用于負(fù)載均衡和路由請(qǐng)求的基本單元,定義后端服務(wù)的地址、端口、協(xié)議等信息
clusters: - name:定義集群的名稱。 - type:指定集群類型,如 static, strict_dns, sds 等。 - connect_timeout:連接超時(shí)時(shí)間。 - lb_policy:負(fù)載均衡策略,如 round_robin, least_request 等。 - hosts:指定集群的后端主機(jī)。 - tls_context:配置 TLS。
routes(路由)
routes 字段用于定義路由規(guī)則。路由規(guī)則確定了Envoy在接收到請(qǐng)求時(shí)應(yīng)該將其轉(zhuǎn)發(fā)到哪個(gè)后端服務(wù)
routes: - prefix:URL 前綴匹配。 - cluster:指定請(qǐng)求應(yīng)該轉(zhuǎn)發(fā)到的集群。 - timeout:設(shè)置請(qǐng)求超時(shí)時(shí)間。 - retry_policy:配置請(qǐng)求重試策略。
admin(管理控制)
admin是用于提供管理和監(jiān)控功能的配置選項(xiàng)。通過 Envoy 的 admin`接口,用戶可以查看運(yùn)行時(shí)統(tǒng)計(jì)信息、配置信息,執(zhí)行一些診斷命令等
admin: - access_log_path:指定訪問日志文件的路徑。 - address:指定 Envoy 管理界面的監(jiān)聽地址和端口。
以下是一份配置實(shí)例,在項(xiàng)目目錄打開終端,輸入以下命令創(chuàng)建配置文件,并將配置內(nèi)容復(fù)制到文件中。
touch envoy_conf.yaml
# Envoy 管理配置 admin: # 訪問日志路徑 access_log_path: "/home/zhg/Mine/Workplace/getenvoy/envoy.log" # 管理界面監(jiān)聽地址和端口 address: socket_address: address: 0.0.0.0 port_value: 10001 # 靜態(tài)資源配置 static_resources: listeners: # 定義一個(gè)監(jiān)聽器,監(jiān)聽在 0.0.0.0:10000 - address: socket_address: { protocol: TCP, address: 0.0.0.0, port_value: 10000 } filter_chains: - filters: # 使用 HTTP 連接管理器過濾器 - name: envoy.filters.network.http_connection_manager typed_config: "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager codec_type: auto stat_prefix: http access_log: # 記錄 HTTP 請(qǐng)求到文件 - name: envoy.access_loggers.file typed_config: "@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog path: "/home/zhg/Mine/Workplace/getenvoy/envoy_http.log" log_format: text_format: | >>>> start_time: "%START_TIME%" method: "%REQ(:METHOD)%", original_path: "%REQ(X-ENVOY-ORIGINAL-PATH?:PATH)%", protocol: "%PROTOCOL%", response_code: "%RESPONSE_CODE%", response_flags: "%RESPONSE_FLAGS%" user_agent: "%REQ(USER-AGENT)%" authority: "%REQ(:AUTHORITY)%" upstream_host: "%UPSTREAM_HOST%" request_id: "%REQ(X-REQUEST-ID)%" custom_header: "%REQ(custom_header)%" static_header: "%REQ(static_header)%" route_config: name: search_route virtual_hosts: - name: backend domains: - "*" routes: - match: prefix: "/" route: # 將請(qǐng)求發(fā)送到 baidu 集群 cluster: baidu http_filters: - name: envoy.filters.http.router typed_config: "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router clusters: - name: baidu connect_timeout: 1s # 使用 STRICT_DNS 模式進(jìn)行 DNS 解析 type: STRICT_DNS dns_lookup_family: V4_ONLY lb_policy: round_robin load_assignment: cluster_name: baidu endpoints: - lb_endpoints: - endpoint: address: socket_address: # 目標(biāo)服務(wù)器地址 address: www.baidu.com port_value: 80
3 運(yùn)行envoy
寫好配置文件后,就可以在項(xiàng)目目錄打開終端,輸入以下命令啟動(dòng)envoy
# 通過靜態(tài)配置文件直接啟動(dòng) Envoy # -l debug :設(shè)置日志級(jí)別為debug,可省略 ./envoy -c envoy_conf.yaml -l debug //查看幫助 envoy --help
4.測(cè)試
4.1 查看envoy admin
打開瀏覽器,輸入localhost:10001,可以看到envoy已經(jīng)啟動(dòng)起來,可以正常訪問admin頁面
4.2 代理配置驗(yàn)證
普通 curl 請(qǐng)求
curl -vvv baidu.com
zhg@zhg-pc:~/Mine/Workplace/envoytest$ curl -vvv baidu.com * Trying 39.156.66.10:80... * Connected to baidu.com (39.156.66.10) port 80 (#0) > GET / HTTP/1.1 > Host: baidu.com > User-Agent: curl/7.81.0 > Accept: */* > * Mark bundle as not supporting multiuse < HTTP/1.1 200 OK < Date: Thu, 16 Nov 2023 0354 GMT < Server: Apache < Last-Modified: Tue, 12 Jan 2010 1300 GMT < ETag: "51-47cf7e6ee8400" < Accept-Ranges: bytes < Content-Length: 81 < Cache-Control: max-age=86400 < Expires: Fri, 17 Nov 2023 0354 GMT < Connection: Keep-Alive < Content-Type: text/html < * Connection #0 to host baidu.com left intact
使用 curl 訪問 Envoy,并添加 Header 字段 host: baidu.com
curl -v -H 'Host: baidu.com' 127.0.0.1:10000
可以看到請(qǐng)求被轉(zhuǎn)發(fā)到了 baidu.com,在響應(yīng)頭中,server: envoy表示服務(wù)器使用的是 Envoy 代理。這是 Envoy 代理的標(biāo)識(shí),表示請(qǐng)求經(jīng)過了 Envoy
zhg@zhg-pc:~/Mine/Workplace/envoytest$ curl -vvv -H 'Host: baidu.com' 127.0.0.1:15001 * Trying 127.0.0.1:15001... * Connected to 127.0.0.1 (127.0.0.1) port 15001 (#0) > GET / HTTP/1.1 > Host: baidu.com > User-Agent: curl/7.81.0 > Accept: */* > * Mark bundle as not supporting multiuse < HTTP/1.1 200 OK < accept-ranges: bytes < cache-control: private, no-cache, no-store, proxy-revalidate, no-transform < content-length: 2381 < content-type: text/html < date: Thu, 16 Nov 2023 03:45:17 GMT < etag: "588604dc-94d" < last-modified: Mon, 23 Jan 2017 13:27:56 GMT < pragma: no-cache < server: envoy < set-cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/ < x-envoy-upstream-service-time: 18 < ...省略...