[TOC]html
istio官方源码中有说明,istio项目的仓库除了istio自己外,还有istio proxy这个仓库,istio proxy官方源码和Envoy同样,采用C++编写,注意,这里的编译方式,再也不是Makefile,也不是CMake,是Google出品的bazel。bazel能够直接在编译中引入第三方库,加载第三方源码,而不是和之前同样采用加载动态库、静态库或者干脆直接引入第三方源码到项目中的方式;这个方式有点相似golang的import和包管理机制,只须要引用而且制定第三方库的位置和版本便可。更多关于Bazel的介绍能够参考Bazel官网。git
istio proxy这个项目工程既包含引用了Envoy的源码,还在此基础上本身作了扩展,这个扩展是经过Envoy filter(过滤器)的形式来提供,这样的话就可使得proxy代理将策略执行决策委托给Mixer,这样就解释了为何Mixer能够被设计为提供策略和遥测的组件,Mixer->istio proxy->Envoy这种形式来控制。这样经过这个方式就能:github
在istio-proxy项目中的Envoy BUILD中能够知道,这里会编译出name = "Envoy"
的二进制程序,而后start_Envoy会启动Envoy,同时会根据一些默认参数和配置文件模板生成一个全新的配置文件,而后运行。一些关键参数如Envoy二进制的路径和配置路径、监听的端口、mixer的地址以下:golang
-a ... backend address
-c ... Envoy config file path
-e ... Envoy binary path
-l ... debug level
-m ... mixer server address
-p ... listening port
-t ... Envoy config template file path
复制代码
也便是istio proxy 提供两大块:docker
Envoy缓存
mixer clientbash
istio-proxy源码中提供了envoy.conf.template 通用配置模板,这个模板文件最终会生成一个envoy的配置文件,而后envoy启动的时候指定运行。模板配置文件中已经配置好了Mixer相关的参数如mixer_server,这个Mixer对于Envoy来讲就是一个cluster,所以是在cluster_manager里面进行管理配置。微信
而后Envoy的官方文档Listener discovery service (LDS)一文中有说明静态的Listener文件配置是没法经过LDS API进行修改或删除的,所以静态配置会一直生效,istio-proxy源码中则提供了Envoy的静态配置文件envoy_lds.conf 静态listeners配置网络
根据Envoy的官方文档中的网络过滤器Network (L3/L4) filters的介绍,有三种 network filters,而在istio-proxy源码中恰好有实现Network::ReadFilter 和 Network::WriteFilter 过滤器,这样就能够经过filter API 绑定到Listener,而后当有数据读or写的时候调用到对应的filter了,这样数据流就从Envoy自己转到了filter中。tcp
而后network filter再转到Envoy 的 http filter,根据官方文档HTTP filters的介绍也有两种Filters,为Decoder和Encoder,而后在istio-proxy源码中实现了 Http::StreamDecoderFilter和Http::StreamEncoderFilter这两个Filter,这样的话整个流程就串起来了。
在具体实现中, Filter还对应有Controller进行管理,这个只是代码设计上的优雅风格,和流程无关,可是这个设计风格是能够借鉴参考的。
原有mixer client仓库是独立的,如今已经整合到了istio-proxy的代码仓库中,这样就能够很方便的在Sidecar Envoy代理中实现:
istio/istio项目中的pilot会提供Envoy所需的一切接口,istio/proxy项目则是真正Envoy的项目,会访问Pilot提供的接口。
官方pilot-agent-proxy命令中有详细说明,pilot-agent启动的时候,须要指定envoy的配置和二进制路径,而后镜像中的proxyv2的镜像的Dockerfile则参考这里。pilot-agent是容器中PID为 1 的启动进程,它启动时又建立了一个 Envoy 进程。
istio-proxy,这个Envoy的扩展,就是在Envoy基础上,增长了一些Filter,而后经过这些个Filter在利用Mixer Client和 Mixer Server进行通讯,这样就能够在proxy代理中:
【"欢迎关注个人微信公众号:Linux 服务端系统研发,后面会大力经过微信公众号发送优质文章"】