Easegress

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的处理流程。
    • 安全
      • IP过滤:限制对IP地址/地址段的访问。
      • 静态HTTPS:静态证书文件。
      • API签名:支持 HMAC 验证。
      • JWT验证:验证 JWT Token
      • OAuth2:验证 OAuth/2 请求。
      • Let’s Encrypt: 自动管理证书文件。
    • 管道过滤机制
      • 责任链模式:编排过滤器链。
      • 过滤器管理:轻松开发新过滤器。
    • 服务网格
      • 网格主控:是管理网格服务生命周期的控制平面。
      • 边车:是数据平面,作为端点进行流量拦截和路由。
      • 网格入口控制器:是针对网格的入口控制器,将外部流量路由到网格服务。

        注意,EaseMesh使用了此功能。

    • 第三方的集成
      • FaaS:与 ServerLess 平台 Knative 集成。
      • 服务发现:与 Eureka、Consul、Etcd 和 Zookeeper 集成。
      • 入口控制器:与 Kubernetes 集成,作为入口控制器。
  • 扩展性
    • WebAssembly:执行用户开发的 WebAssembly 代码。
  • 高性能和可用性
    • 改编:使用过滤器改编请求和应答。
    • 验证:标头验证、OAuth2、JWT 和 HMAC 验证。
    • 负载平衡:轮询、随机、加权随机、IP哈希、标头哈希。
    • 缓存:缓存后端服务的应答,减少对后端服务的请求量。
    • 压缩:减少应答数据的体积。
    • 热更新:线上更新 Easegress 的配置和二进制文件,服务不中断。
  • 操作
    • 易于集成:命令行(egctl)、MegaEase Portal,以及 HTTP 客户端,如 curl、postman 等。
    • 分布式跟踪
    • 可观察性
      • 节点:角色(Leader、Writer、Reader)、健康状态、最后一次心跳时间,等等。
      • 多维度的服务器和后端流量数据
        • 吞吐量:请求数、TPS/m1、m5、m15 和错误百分比等。
        • 延迟:p25、p50、p75、p95、p98、p99、p999。
        • 数据大小:请求和响应大小。
        • 状态代码:HTTP状态代码。
        • TopN:按 API 聚合并排序(仅服务器维度)。

用户案例

下面的例子展示了如何在不同场景下使用 Easegress。

完整的列表请参见 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而不指定任何参数,它通过打开默认的 237923802381 端口启动自己。当然,我们可以在配置文件中改变它们,或者运行 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 中的 909590969097,其会返回 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 文件。