Easegress
什么是 Easegress
Easegress
是一个云原生流量协调系统,其主要有以下设计:
- 高可用性:内置Raft共识和领导者选举提供99.99%的可用性。
- 流量编排:为每个流量管道简单编排各种过滤器。
- 高性能:轻量级和基本功能加快了性能。
- 可观察性:有许多有意义的统计数据定期以可读的方式进行。
- 可扩展性:很容易用高级编程语言开发自己的过滤器或控制器。
- 集成性:简单的接口使它很容易与其他系统集成,如:Kubernetes Ingress、EaseMesh、sidecar、Workflow等。
下面是 Easegress 的架构。
功能列表
- 服务管理
- 支持多种协议
- HTTP/1.1
- HTTP/2
- HTTP/3(QUIC)
- MQTT
- 路由规则:精确路径、路径前缀、路径的正则表达式、方法、标头。
- 弹性和容错。
- 熔断: 暂时阻止可能的故障。
- 限流: 限制请求的速率。
- 重试:重试失败的请求。
- 时间限制:限制请求的执行时间。
- 部署管理
- 蓝绿部署:一次性切换流量。
- 金丝雀部署:按着色编排流量。
- API管理
- API聚合:聚合多个API的结果。
- API编排:编排API的处理流程。
- 安全
- 管道过滤机制。
- 责任链模式:编排过滤器链。
- 过滤器管理:轻松开发新过滤器。
- 服务网格
- 网格主控:是管理网格服务生命周期的控制平面。
- 边车:是数据平面,作为端点进行流量拦截和路由。
- 网格入口控制器:是针对网格的入口控制器,将外部流量路由到网格服务。
注意,EaseMesh使用了此功能。
- 第三方的集成
- FaaS:与 ServerLess 平台 Knative 集成。
- 服务发现:与 Eureka、Consul、Etcd 和 Zookeeper 集成。
- 入口控制器:与 Kubernetes 集成,作为入口控制器。
- 支持多种协议
- 扩展性
- WebAssembly:执行用户开发的 WebAssembly 代码。
- 高性能和可用性
- 改编:使用过滤器改编请求和应答。
- 验证:标头验证、OAuth2、JWT 和 HMAC 验证。
- 负载平衡:轮询、随机、加权随机、IP哈希、标头哈希。
- 缓存:缓存后端服务的应答,减少对后端服务的请求量。
- 压缩:减少应答数据的体积。
- 热更新:线上更新 Easegress 的配置和二进制文件,服务不中断。
- 操作
- 易于集成:命令行(
egctl
)、MegaEase Portal,以及 HTTP 客户端,如 curl、postman 等。 - 分布式跟踪
- 内置 Open Zipkin
- Open Tracing,提供厂商中立的 API。
- 可观察性
- 节点:角色(Leader、Writer、Reader)、健康状态、最后一次心跳时间,等等。
- 多维度的服务器和后端流量数据
- 吞吐量:请求数、TPS/m1、m5、m15 和错误百分比等。
- 延迟:p25、p50、p75、p95、p98、p99、p999。
- 数据大小:请求和响应大小。
- 状态代码:HTTP状态代码。
- TopN:按 API 聚合并排序(仅服务器维度)。
- 易于集成:命令行(
用户案例
下面的例子展示了如何在不同场景下使用 Easegress。
- API 聚合 - 将多个 API 聚合为一个。
- 分布式调用链 - 如何使用 Zipkin 进行 APM 追踪。
- 函数即服务 FaaS - 支持 Knative FaaS 集成。
- 高并发秒杀 - 如何使用 Easegress 进行高并发的秒杀活动。
- Kubernetes入口控制器 - 如何作为入口控制器与 Kubernetes 集成。
- 负载均衡 - 各种负载均衡策略。
- MQTT代理 - 支持 Kafka 作为后端的 MQTT 代理
- 高性能 - 性能优化,压缩、缓存等。
- 管道编排 - 如何编排 HTTP 过滤器来处理请求和应答。
- 弹力和容错设计 - 断路器、速率限制、重试、时间限制等(移植自Java resilience4j
- 安全 - 如何通过标头、JWT、HMAC、OAuth2 等进行认证。
- 服务网关 - 使用 Zookeeper、Eureka、Consul、Nacos 等进行服务注册。
- WebAssembly - 使用 AssemblyScript 来扩展 Easegress。
- 工作流 - 将若干 API 进行组合,定制为工作流。
完整的列表请参见 Cookbook。
开始使用
Easegress 的基本常用方法是快速设置后台服务器的代理。我们把它分成多个简单的步骤来说明基本概念和操作。
安装 Easegress
我们可以从发布页下载二进制文件。下面的 Shell 命令会下载并解压最新版的 Easegress 到 ./easegress 目录下:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/megaease/easegress/main/scripts/install.sh)"
或是从源码编译。
$ git clone https://github.com/megaease/easegress && cd easegress
$ make
然后我们可以把执行文件目录添加到 PATH
中,并启动 Easegress。
$ export PATH=${PATH}:$(pwd)/bin/
$ easegress-server
2021-05-17T16:45:38.185+08:00 INFO cluster/config.go:84 etcd config: init-cluster:eg-default-name=http://localhost:2380 cluster-state:new force-new-cluster:false
2021-05-17T16:45:38.185+08:00 INFO cluster/cluster.go:379 client is ready
2021-05-17T16:45:39.189+08:00 INFO cluster/cluster.go:590 server is ready
2021-05-17T16:45:39.21+08:00 INFO cluster/cluster.go:451 lease is ready
2021-05-17T16:45:39.231+08:00 INFO cluster/cluster.go:187 cluster is ready
2021-05-17T16:45:39.253+08:00 INFO supervisor/supervisor.go:180 create system controller StatusSyncController
2021-05-17T16:45:39.253+08:00 INFO cluster/cluster.go:496 session is ready
2021-05-17T16:45:39.253+08:00 INFO api/api.go:96 api server running in localhost:2381
2021-05-17T16:45:44.235+08:00 INFO cluster/member.go:210 self ID changed from 0 to 689e371e88f78b6a
2021-05-17T16:45:44.236+08:00 INFO cluster/member.go:137 store clusterMembers: eg-default-name(689e371e88f78b6a)=http://localhost:2380
2021-05-17T16:45:44.236+08:00 INFO cluster/member.go:138 store knownMembers : eg-default-name(689e371e88f78b6a)=http://localhost:2380
Makefile的默认目标是将两个可执行文件编译到bin/
目录中。bin/easegress-server
是服务器端的可执行文件,bin/egctl
是客户端的可执行文件。我们可以把它添加到$PATH
中,以简化下面的命令。
我们可以运行easegress-server
而不指定任何参数,它通过打开默认的 2379
、2380
、2381
端口启动自己。当然,我们可以在配置文件中改变它们,或者运行 easegress-server --help
查看完整的命令参数。
$ egctl member list
- options:
name: eg-default-name
labels: {}
cluster-name: eg-cluster-default-name
cluster-role: writer
cluster-request-timeout: 10s
cluster-listen-client-urls:
- http://127.0.0.1:2379
cluster-listen-peer-urls:
- http://127.0.0.1:2380
cluster-advertise-client-urls:
- http://127.0.0.1:2379
cluster-initial-advertise-peer-urls:
- http://127.0.0.1:2380
cluster-join-urls: []
api-addr: localhost:2381
debug: false
home-dir: ./
data-dir: data
wal-dir: ""
log-dir: log
member-dir: member
cpu-profile-file: ""
memory-profile-file: ""
lastHeartbeatTime: "2021-05-05T15:43:27+08:00"
etcd:
id: a30c34bf7ec77546
startTime: "2021-05-05T15:42:37+08:00"
state: Leader
成功启动后,我们可以检查单节点集群的状态。上面显示了心跳和 etcd 的静态选项和动态的运行状态。
创建一个HTTPServer和管道
现在让我们创建一个HTTPServer,监听端口为10080,以处理HTTP流量。
$ echo '
kind: HTTPServer
name: server-demo
port: 10080
keepAlive: true
https: false
rules:
- paths:
- pathPrefix: /pipeline
backend: pipeline-demo' | egctl object create
上面的路由器规则意味着它将把前缀为/pipeline
的流量引向pipeline-demo
的管道,这个管道将在下面创建。如果我们在创建之前curl
它,它将返回 503
。
$ echo '
name: pipeline-demo
kind: HTTPPipeline
flow:
- filter: proxy
filters:
- name: proxy
kind: Proxy
mainPool:
servers:
- url: http://127.0.0.1:9095
- url: http://127.0.0.1:9096
- url: http://127.0.0.1:9097
loadBalance:
policy: roundRobin' | egctl object create
该 pipeline 意味着它将在负载平衡策略roundRobin
中为3个后端终端做代理。
测试
现在你可以使用一些HTTP客户端,如:curl
来测试相关功能。
$ curl -v http://127.0.0.1:10080/pipeline
如果你没有设置相关的应用程序来处理 localhost
中的 9095
、9096
和9097
,其会返回 503
。这里,我们准备了一个简单的服务来让我们方便地测试,例子如下:
$ go run example/backend-service/mirror/mirror.go & # Running in background
$ curl http://127.0.0.1:10080/pipeline -d 'Hello, Easegress'
Your Request
===============
Method: POST
URL : /pipeline
Header: map[Accept:[*/*] Accept-Encoding:[gzip] Content-Type:[application/x-www-form-urlencoded] User-Agent:[curl/7.64.1]]
Body : Hello, Easegress
更多过滤器
现在我们想给管道添加更多的功能,那么我们可以给管道添加各种过滤器。例如,我们希望对pipeline-demo
进行验证和请求适应。
$ cat pipeline-demo.yaml
name: pipeline-demo
kind: HTTPPipeline
flow:
- filter: validator
jumpIf: { invalid: END }
- filter: requestAdaptor
- filter: proxy
filters:
- name: validator
kind: Validator
headers:
Content-Type:
values:
- application/json
- name: requestAdaptor
kind: RequestAdaptor
header:
set:
X-Adapt-Key: goodplan
- name: proxy
kind: Proxy
mainPool:
servers:
- url: http://127.0.0.1:9095
- url: http://127.0.0.1:9096
- url: http://127.0.0.1:9097
loadBalance:
policy: roundRobin
$ egctl object update -f pipeline-demo.yaml
更新管道后,原来的curl -v http://127.0.0.1:10080/pipeline
会因为验证不通过而得到 400
。下面,让我们发出正确的请求:
$ curl http://127.0.0.1:10080/pipeline -H 'Content-Type: application/json' -d '{"message": "Hello, Easegress"}'
Your Request
===============
Method: POST
URL : /pipeline
Header: map[Accept:[*/*] Accept-Encoding:[gzip] Content-Type:[application/json] User-Agent:[curl/7.64.1] X-Adapt-Key:[goodplan]]
Body : {"message": "Hello, Easegress"}
我们还可以看到 Easegress 又向镜像服务发送了一个头 X-Adapt-Key: goodplan
。
文档
请参考 Easegress 路线图 来了解详情。
路线图
参见Easegress路线图了解详情。
许可证
Easegress采用Apache 2.0许可。详情请参见 LICENSE 文件。