它能够代理任何TCP协议
它支持双向SSL
它将HTTP/2视为一等公民,并且可以在HTTP/2和HTTP/1.1之间相互转换(双向)
它在服务发现和负载均衡方面很灵活
它被设计用于提高系统的可见性
尤其是,Enovy可以生成许多流量方面的统计数据,这是其它代理软件很难取代的地方
在某些情况下(如MongoDB和Amazon RDS),Enovy可以很确切地知道如何查看压缩协议(wire protocol)并进行透明监控
相比于其它代理软件,Envoy更容易搭建
Envoy是一个sidecar进程,因此它对服务的实现语言完全无感知
首先,会有一个“边缘Envoy”在某个地方单独运行。边缘Envoy的工作是给其他地方提供一个入口。来自外部的传入连接请求到这里,边缘Envoy将会决定他们在内部的转发路径。
其次,服务的每个实例都有自己的Envoy与它一起运行,这是一个运行在服务一侧的独立进程。这些“服务Envoy”会密切关注他们的服务,并且记住哪些是正在运行的,哪些不是。
所有的Envoy形成一个网格,然后在他们之间共享路由信息。
如果需要的话(通常都是这样),服务间调用也可以通过Envoy网格。我们稍后会讨论到这个问题。
过滤器可以——通常也是必须的——拥有他们自己的配置,而且通常他们会比监听器的配置更加复杂!
集群和负载平衡可以放在一起,并且可以用到像DNS之类的一些外部事物。
name:一个服务的可读名称
domains:一组DNS风格的域名,每个必须和该虚拟主机的URL中的域名匹配才能匹配
routes:一组路由字典
prefix:此路由的URL路径前缀
cluster:处理此请求的Envoy集群
timeout_ms:如果出错放弃的超时时间
“virtual_hosts”: [
{
“name”: “service”,
“domains”: [“*”],
“routes”: [
{
“timeout_ms”: 0,
“prefix”: “/service1”,
“cluster”: “service1”
},
{
“timeout_ms”: 0,
“prefix”: “/service2”,
“cluster”: “service2”
}
]
}
]
就是这样。请注意,我们使用domains [“*”]表明我们不太关心请求哪个主机,并且值得一提的是我们可以按需添加多条路由。最后,边缘Envoy和服务Envoy之间的这个监听器配置基本相同:主要区别在于服务Envoy可能只有一个路由,它只会代理localhost上的服务而不是包含多个主机的一个集群。
name:集群的一个可读名称
type:此集群将如何知道哪些主机已启动?
lb_type:这个集群将如何处理负载均衡?
hosts:定义集群所属主机的一个URL数组(实际上通常是tcp:// URLs)。
static:在集群中列出所有可代理的主机
strict_dns:Envoy将会监控DNS,而每个匹配的A记录都将被认为是有效的
logical_dns:Envoy一般会使用DNS来添加主机,但是如果DNS不再返回它们时,也不会丢弃它们(想想有数百台主机的round-robin DNS - 我们将在后续文章中详细介绍)
sds:Envoy将会去调用一个外部的REST服务以查找集群成员
round_robin:按顺序循环遍历所有健康的主机
weighted_least_request:选择两个随机健康的主机并选择请求最少的主机(这是O(1),其中扫描所有健康的主机将是O(n)。Lyft声称研究表明O(1)算法"差不多"和全扫描的效果“一样好”。
random:随机挑选一台主机
“clusters”: [
{
“name”: “service1”,
“type”: “strict_dns”,
“lb_type”: “round_robin”,
“hosts”: [
{
“url”: “tcp://service1:80”
}
]
},
{
“name”: “service2”,
“type”: “strict_dns”,
“lb_type”: “round_robin”,
“hosts”: [
{
“url”: “tcp://service2:80”
}
]
}
]
由于我们将这个集群标记为strict_dns类型,它将依赖于在DNS中查找service1和service2,我们假定任何新起的服务实例将会被添加到DNS中 ———— 这可能适用于像使用docker-compose配置的类似情况。针对服务Envoy(比如service1),我们可能会采取一个更直接的路由方式:
“clusters”: [
{
“name”: “service1”,
“type”: “static”,
“lb_type”: “round_robin”,
“hosts”: [
{
“url”: “tcp://127.0.0.1:5000”
}
]
}
]
想法类似,只是目标不太一样:我们总是在本地主机上转发到我们的服务,而不是重定向到其他主机。
https://lyft.github.io/envoy/
https://www.envoyproxy.io/
https://softwareengineeringdaily.com/2017/02/14/service-proxying-with-matt-klein/