envoy源码分析(二):处理客户端请求
目录
第一节 一个简单的用例
第二节 分析
配置解析
admin
static_resources
源码解析
在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.0port_value: 8081
static_resources:listeners:- name: listener_0address:socket_address:address: 0.0.0.0port_value: 10000filter_chains:- filters:- name: envoy.filters.network.http_connection_managertyped_config:"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManagerstat_prefix: ingress_httpaccess_log:- name: envoy.access_loggers.stdouttyped_config:"@type": type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLoghttp_filters:- name: envoy.filters.http.routertyped_config:"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Routerroute_config:name: local_routevirtual_hosts:- name: local_servicedomains: ["*"]routes:- match:prefix: "/"route:host_rewrite_literal: www.envoyproxy.iocluster: service_envoyproxy_ioclusters:- name: service_envoyproxy_ioconnect_timeout: 5stype: LOGICAL_DNS# Comment out the following line to test on v6 networksdns_lookup_family: V4_ONLYload_assignment:cluster_name: service_envoyproxy_ioendpoints:- lb_endpoints:- endpoint:address:socket_address:address: www.envoyproxy.ioport_value: 443transport_socket:name: envoy.transport_sockets.tlstyped_config:"@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContextsni: 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
envoy源码分析(二):处理客户端请求相关推荐
- 【OkHttp】OkHttp 源码分析 ( 同步 / 异步 Request 请求执行原理分析 )
OkHttp 系列文章目录 [OkHttp]OkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 ) [OkHttp]Android 项目导入 OkHttp ( 配置依赖 | 配置 ...
- gSOAP 源码分析(二)
gSOAP 源码分析(二) 2012-5-24 flyfish 一 gSOAP XML介绍 Xml的全称是EXtensible Markup Language.可扩展标记语言.仅仅是一个纯文本.适合用 ...
- ENS最新合约源码分析二
ENS(以太坊域名服务)智能合约源码分析二 0.简介 本次分享直接使用线上实际注册流程来分析最新注册以太坊域名的相关代码.本次主要分析最新的关于普通域名注册合约和普通域名迁移合约,短域名竞拍合约不 ...
- 【Android 事件分发】ItemTouchHelper 源码分析 ( OnItemTouchListener 事件监听器源码分析 二 )
Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...
- Envoy 源码分析--network L4 filter manager
目录 Envoy 源码分析--network L4 filter manager FilterManagerImpl addWriteFilter addReadFilter addFilter in ...
- SpringBoot源码分析(二)之自动装配demo
SpringBoot源码分析(二)之自动装配demo 文章目录 SpringBoot源码分析(二)之自动装配demo 前言 一.创建RedissonTemplate的Maven服务 二.创建测试服务 ...
- Android Q 10.1 KeyMaster源码分析(二) - 各家方案的实现
写在之前 这两篇文章是我2021年3月初看KeyMaster的笔记,本来打算等分析完KeyMaster和KeyStore以后再一起做成一系列贴出来,后来KeyStore的分析中断了,这一系列的文章就变 ...
- 【投屏】Scrcpy源码分析二(Client篇-连接阶段)
Scrcpy源码分析系列 [投屏]Scrcpy源码分析一(编译篇) [投屏]Scrcpy源码分析二(Client篇-连接阶段) [投屏]Scrcpy源码分析三(Client篇-投屏阶段) [投屏]Sc ...
- Nouveau源码分析(二):Nouveau结构体的基本框架
Nouveau源码分析(二) 在讨论Nouveau对Nvidia设备的初始化前,我准备先说一下Nouveau结构体的基本框架 Nouveau的很多结构体都可以看作是C++中的类,之间有很多相似的东西, ...
最新文章
- SAP ECM的相关设定(ECN)
- UI仿写 - 收藏集 - 掘金
- linux下gzip
- 计算机网络管理第三版试卷,《计算机网络管理技术》试卷.doc
- video.js android,VideoJS + HTML5自动播放失败,适用于Android 2.3+和IOS 4+
- Linux系统运维成长记
- MySQL (1)---概述
- java ee 第二周作业 web应用后台运行过程
- Cap22_信息系统安全管理
- 微信公众号授权H5页面
- opencv与openmv?
- Unity小游戏-平衡大师(安卓、PC、web)2D益智类游戏 项目展示+完整项目源码
- 线性代数系列(三)--向量空间
- 中国软件服务外包IT公司最新排名-IT外包最强前50名
- 二级学科 计算机科学技术,一级学科、二级学科,考研专业哪个包含了计算机考研方向...
- HTML5/Node.js/JS 经验谈 (会员专属)【讲师辅导】-曾亮-专题视频课程
- 【华为OD机试真题 python】预订酒店【2022 Q4 | 100分】
- vue+springboot 制作属于自己的个人网站 ① vue前端部署
- 【转载】浅谈 flash 中的设计模式:模版
- 2019四川大学计算机夏令营之旅