入門istio,envoy如今看來必不可少,花點時間瞭解一下吧。nginx
咱們援引一段官網的描述:架構
Envoy is an L7 proxy and communication bus designed for large modern service oriented architectures. The project was born out of the belief that: "The network should be transparent to applications. When network and application problems do occur it should be easy to determine the source of the problem."app
Envoy
是和應用服務並行運行的,透明地代理應用服務發出/接收的流量。應用服務只須要和 Envoy
通訊,無需知道其餘微服務應用在哪裏。Envoy
的核心是一個 L3/L4 代理,而後經過插件式的過濾器(network filters
)鏈條來執行 TCP/UDP 的相關任務,例如 TCP 轉發,TLS 認證等工做。Envoy
內置了一個很是核心的過濾器: http_connection_manager
。http_connection_manager
自己是如此特殊和複雜,支持豐富的配置,以及自己也是過濾器架構,能夠經過一系列 http 過濾器(http filters
)來實現 http協議層面的任務,例如:http路由,重定向,CORS支持等等。Envoy
支持 HTTP/1.1 和 HTTP/2,推薦使用 HTTP/2。Envoy
能夠方便的支持 gRPC,特別是在負載和代理上。Envoy
服務的。Host負載均衡
這裏的 Host,能夠理解爲由 IP, Port 惟一肯定的服務實例dom
Downstreamsocket
發送請求給 Envoy 的 Host 是 Downstream(下游),例如gRPC的 client微服務
Upstream性能
接收 Enovy 發出的請求的 Host 是Upstream(上游),例如 gRPC的 serverui
Listenerspa
Envoy 監聽的一個地址,例如 ip:port, unix socket 等等
Cluster
一組功能一致的上游 Host,稱爲一個cluster。相似 k8s
的 Service
, nginx
的 upstream
Http Route Table
HTTP 的路由規則,例如請求的域名,Path符合什麼規則,轉發給哪一個 Cluster。
admin:
access_log_path: /tmp/admin_access.log
address:
socket_address: { address: 0.0.0.0, port_value: 9901 }
static_resources:
listeners:
- name: listener_0
address:
socket_address: { address: 0.0.0.0, port_value: 7777 }
filter_chains:
- filters:
- name: envoy.http_connection_manager
config:
stat_prefix: ingress_http
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains: ["*"]
routes:
- match: { prefix: "/" }
route: { cluster: some_service }
http_filters:
- name: envoy.router
clusters:
- name: some_service
connect_timeout: 0.25s
type: STATIC
lb_policy: ROUND_ROBIN
hosts: [{ socket_address: { address: 127.0.0.1, port_value: 8000 }}]