应用社区要求,我们于 2021 年 12 月 16 日对外分享一下我们的开源软件 Easegress 的源码,以便大家可以更好的进行代码开发。对于分享视频链接,参看本文结尾。
自从 2021 年 6 月份开源以来,Easegress目前有 262 个文件,近 6 万行代码,一共 1500 个提交,以及 300+个 PR,以及有 10 来个用户在使用,开源以来的开发进展是非常喜人的。但是我们还是一个比较年轻的项目,还需要大家多多的支持。
另个,还想再次说明一下,我们之所以开发 Easegress 是因为我们觉得需要一个控制能力更强的云原生网关,而不仅仅只是一个反向代理。另外,我们之所以选取 Go 语言主要是为了兼容性能和功能扩展性方面。如下图所示
Easegress 不仅仅只是一个反向代理,其更多的还是一个 Cloud Native 的服务网关,所以,其必然需要跟像 Kubernetes 和 Microservice 架构进行协同,而可能还需要有一些业务逻辑侵入。所以,我们需要在功能扩展性上给足空间。对于功能扩展来说,一般会有几个方式:
源码扩展。需要选择一个门槛低,性能也不错的语言 - Go。
脚本扩展。我们的选择了性能更强语言更多 WebAssembly 而不是 Lua。
FaaS扩展。我们选择了 Knative。
下图是整个 Easegress 的源码文件结构和一些概念模型
其中的几大模块说明如下:
Cluster。这个模块主是跟 Easegress 高可用集群相关的代码。其主要就是对 etcd 的包装。
Supervisor。这个模块主要是一个管理和创建整个 Easegress 运行时的代码,代码很简单不复杂。
Objects。这个是 Easegress 里的重要的一些对象,这个名字借鉴于 Kubernetes 那边,太过于抽象。但基本上来说是如下的东西。
System Controller。这是系统级的控制器,系统级的控制器只能有一个实例。如 Service Discovery 的控制器。
Business Controller。这是业务级的控制器,是可以扩展的。比如:Eureka, Consul, Zookeeper, Nacos 这些服务发现的控制器就是业务级别的控制器。
Traffic Gate。这个是网络协议,如:HTTP,MQTT、TCP 等。
Pipeline。这个是数据处理管线,其中是一组 filter 的编排。
Context。这个是上下文,其中保存本次请求的协议头和协议数据,供所有的 Filter 处理。
Filters。这个是数据处理的各种过滤器。其以插件的方式存在,可以自由扩展。目前,我们提供有 10 多个非常实用的 Ftiler,也欢迎大家贡献更多更好的 Filter。
关于这些模块的细节,大家可以点击如下的视频来获得相关的细节。在这个视频的最后,我们还讨论了一下如何 Debug Go 语言的程序。其中也包括,我们最近发现的一个非常 tricky 的不容易重现的在高并发下才会有的问题(和 Go 官方库有关),如果感兴趣的话可以看一下 issue#407
最后,欢迎大家关注我们的开源项目 Easegress