基于 Apache APISIX 的服务网格方案( 三 )


对ApacheAPISIX的改造成本
对ApacheAPISIX的改造成本涉及到ApacheAPISIX技术栈的生态 。
第一个要考虑的是Lua语言 , 因为Lua语音的使用者比较小众 , 虽然Lua很强大 , 但是对它生态和工具的支持都比较匮乏 。
第二个需要考虑的是OpenResty , ApacheAPISIX底层是基于OpenResty的 , 而OpenResty是通过将LuaJIT嵌入到Nginx里面 , 来实现其强大的动态能力 , 而因为Nginx社区不活跃 , Lua语言比较小众 , 导致OpenResty社区非常小 , 近几年社区也越来越不活跃 。 如果基于OpenResty做扩展 , 如:支持xDS协议 , 缺少gRPC的IDL翻译工具 , 需要EnvoyxDS整套配置的Lua翻译 , 因为Envoy没有提供Lua版本的 。
2.3.3解决方案:apisix-mesh-agent
计算机科学有一句名言:计算机科学的任意一个问题都能通过引入一个额外的间接层来解决掉 。
如果只在数据面中使用ApacheAPISIX , 上面三个问题很难解决 , 而且使用起来可能有很多的问题 。 所以结论是:开发一个间接层 。 间接层是起名为apisix-mesh-agent , 现已经开源 , 点击跳转项目地址 。
3.apisix-mesh-agent的功能与优势
apisix-mesh-agent作为ApacheAPISIX和控制面的中间层 , 从控制面获取配置(变更) , 并模拟etcdV3API使ApacheAPISIX获取到配置;并创建iptables规则劫持出入流量 。
接下来详细介绍下apisix-mesh-agent的功能与优势 。
3.1对接控制面
apisix-mesh-agent支持xDS协议 , 这使得ApacheAPISIX能对接实现xDS协议的控制面 , 如:Istio 。 从控制面获得的配置格式也是xDS协议格式的 , apisix-mesh-agent把配置转换成ApacheAPISIX可识别的格式 。 使用ApacheAPISIX格式的配置有点好处:节省内存资源 。 因为xDS协议的字段比较冗余 , ApacheAPISIX的配置字段非常简洁 , 保存配置到内存 , 占用的内存资源比较少 。
3.2实现etcdV3API
etcdV3API有两类的接口 , 一类是etcd实例之间进行Raft协议数据传递的API , 另一类是面向客户端的API 。 apisix-mesh-agent实现的是面向客户端的API , 目前只实现了ApacheAPISIX必用API , 如:Range、Watch 。 实现这些接口后 , 只需要在ApacheAPISIX的配置里将etcd的地址配置到apisix-mesh-agent的监听地址 , ApacheAPISIX不需要任何改动就可以把数据从apisix-mesh-agent存到内存里 。
通过这个间接层 , 数据就能够从服务网格控制面传递到ApacheAPISIX 。
3.3架构设计
基于 Apache APISIX 的服务网格方案

基于ApacheAPISIX的服务网格架构图
架构是按照控制面和数据面来进行拆分的 , 架构图的上面是控制面 , 控制面可以选用Istio、Kuma等;架构图的下面是网格的数据面 , 每一个服务网格的数据面有三个Pod , 每一个Pod的instance都有自己的sidecar容器 , 在这个容器里有两个进程 , 分别是ApacheAPISIX和对应的apisix-mesh-agent 。 apisix-mesh-agent和对应的控制面进行交互 , 及时获取数据 , 获取后转换成ApacheAPISIX能够解析的格式 , ApacheAPISIX和apisix-mesh-agent之间通过etcdAPI交互 。 如此一来ApacheAPISIX就能够及时获取配置的变更并生效 。
3.4优势
在服务网格里使用ApacheAPISIX有什么优势呢?
第一 , ApacheAPISIX自身的优势 。
ApacheAPISIX是一个高性能API网关 , 上面已经介绍过它的特性 , 此处不再赘述 。 值得一提的是ApacheAPISIX是使用RadixTree实现路由匹配 , 路由匹配性能和路由的数量无关 , 无论有多少路由ApacheAPISIX都能够保证非常快速地匹配到路由 , 时间复杂度是常数级别的 。
第二 , 复用ApacheAPISIX全部插件 。
ApacheAPISIX目前开源了50多个插件 , 使用ApacheAPISIX作为服务网格的数据面 , 可以复用这些插件 。 如果现有插件不能满足业务需求 , 也可以自行开发插件 , 而且ApacheAPISIX支持多语言开发插件 , 如Java、Go 。