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.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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值