目录
在envoy源码分析(一):启动_wyy4045的专栏-CSDN博客中已经分析了envoy本身是一个完整的服务器,启动后,服务器中所有的组件都已经就绪,就绪后的服务器就可以处理客户端的请求了,本文通过一个简单的envoy使用实例来分析envoy服务器是怎么处理客户端请求的。
第一节 一个简单的用例
envoy通过配置文件来完成各种用例,这里例举一个简单的用例,配置文件可以是json格式,也可以是yaml,本文使用的是yaml。
现在有一个用例,我们需要将地址127.0.0.1:10000重定向到地址www.envoyproxy.io。先来看www.envoyproxy.io的内容:
我们期望的结果如下:
对于该用例,我们可以将envoy作为地址127.0.0.1:10000到地址www.envoyproxy.io的代理来达到目的,首先我们需要编写一个配置文件envoy-demo.yaml,内容如下所示:
admin:
address:
socket_address:
address: 0.0.0.0
port_value: 8081
static_resources:
listeners:
- name: listener_0
address:
socket_address:
address: 0.0.0.0
port_value: 10000
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
stat_prefix: ingress_http
access_log:
- name: envoy.access_loggers.stdout
typed_config:
"@type": type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLog
http_filters:
- name: envoy.filters.http.router
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains: ["*"]
routes:
- match:
prefix: "/"
route:
host_rewrite_literal: www.envoyproxy.io
cluster: service_envoyproxy_io
clusters:
- name: service_envoyproxy_io
connect_timeout: 5s
type: LOGICAL_DNS
# Comment out the following line to test on v6 networks
dns_lookup_family: V4_ONLY
load_assignment:
cluster_name: service_envoyproxy_io
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: www.envoyproxy.io
port_value: 443
transport_socket:
name: envoy.transport_sockets.tls
typed_config:
"@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext
sni: www.envoyproxy.io
然后运行envoy如下:
然后查看实际结果如下:
实际结果和期望结果一致,envoy成功地将地址127.0.0.1:10000代理到了地址www.envoyproxy.io。
第二节 分析
该节将分析envoy的配置及其相应的源码来看envoy是怎么完成第一节的用例的。
配置解析
admin
1~4行:envoy为我们提供了一个本地的管理界面,可以用来查询和修改服务器的状态,这里我们配置了这个管理界面的IP和端口号后,就可以通过这个地址来查询服务器状态了,我们在浏览器中打开这个界面,如下所示:
admin相关的详细资料:https://www.envoyproxy.io/docs/envoy/latest/start/quick-start/admin.html?highlight=admin
static_resources
static_resources包含了在Envoy启动时静态配置的所有内容,这里配置了一个listener和一个cluster,如下所示:
7-35:配置listener
8行:配置了listener的名称,这里的配置的名称为listener_0。
9~12行:配置了listener的地址,这里listener_0的ip配置为0.0.0.0,端口号为10000。地址配置 好了以后listener_0就会监听来自端口号10000的请求了。
13~35行:为listener_0配置filter chain,filter chain里的filter会将匹配的请求路由到相应的集群cluster。
15-17行:配置了一个 HTTP connection manager 过滤器,该滤器将原始字节转换为HTTP级别的消息和事件(例如,header、body、trailer等)。它还处理所有HTTP连接和请求相关的功能,如访问日志记录、路由表管理和统计信息等。在我们的用例中,我们发送的是http请求,所以需要配置HTTP connection manager 过滤器。
18行:stat_prefix用来配置该HTTP connection manager的统计数据的前缀,这里配置为ingress_http,我们就可以在管理界面中通过ingress_http前缀来查看该http过滤器的统计信息,如下所示:
19~22行:配置日志的输出方式,这里的配置envoy.access_loggers.stdout是将日志通过标准输出流输出,除此之外,日志该可以输出到日志,日志输出相关的详细情况参考:envoy日志
23~26行:配置http过滤器类型为envoy.filters.http.router,我们的用例中需要这个过滤器将地址127.0.0.1:10000上收到的请求路由到www.envoyproxy.io,除此之外,envoy还有其他过滤器,比如带宽限制过滤器envoy.filters.http.bandwidth_limit,速率限制过滤器envoy.filters.http.ratelimit等。具体可参考:http 过滤器。
27~37行:配置静态路由表,28行配置路由表名称,virtual_hosts是路由配置中的顶级元素,它可以将,31行domains会匹配请求的域名,这里会匹配所有域名,34行会匹配http请求的uri前缀,被匹配的请求会路由到37行指定的cluster。
39~58行:配置cluster
40行:指定了cluster的名称为service_envoyproxy_io, 上文中的listener监听到的请求在37行就会被路由到该cluster,listener_0监听来自下游主机的请求后,路由到service_envoyproxy_io,service_envoyproxy_io会将该请求发送给相应的上游端点进行处理。
41行:配置请求超时时间,这里是5s
42行:配置主机查找方式,这里用的是逻辑DNS,集群查找主机的详细介绍参考:主机查找
51~53行:指定上游目标端点的地址,我们的用例是要将127.0.0.1:10000的请求重定向到地址www.envoyproxy.io,所以这里的address是 www.envoyproxy.io,端口是443。
以上就是关于配置文件的解析,接下来通过源码分析envoy的工作原理。
源码解析
TBD