APISIX+Dubbo+Nacos 最佳实践

4,120 阅读9分钟

作者:杨翊

项目简介

Apache APISIX

1.png

Apache APISIX 是 Apache 软件基金会下的云原生 API 网关,它具有多平台支持、精细化路由、运维友好和插件支持的优点特点。

  1. 多平台支持:APISIX 提供了多平台解决方案,它不但支持裸机运行,也支持在 Kubernetes 中使用,还支持与 AWS Lambda、Azure Function、Lua 函数和 Apache OpenWhisk 等云服务集成。

  2. 精细化路由:APISIX 支持使用 NGINX 内置变量做为路由的匹配条件,用户可以自定义匹配函数来过滤请求,匹配路由。

  3. 运维友好:

  • 全动态能力:APISIX 支持热加载,这意味着用户不需要重启服务就可以更新 APISIX 的配置。请访问为什么 [Apache APISIX 选择 Nginx + Lua 这个技术栈]以了解实现原理。

apisix.apache.org/zh/blog/202…/

  • 生态友好:APISIX 支持与以下工具和平台集成:HashiCorp Vault、Zipkin、Apache SkyWalking、Consul、Nacos、Eureka。通过 APISIX Dashboard,运维人员可以通过友好且直观的 UI 配置 APISIX。 
  1. 多语言插件支持:APISIX 支持多种开发语言进行插件开发,开发人员可以选择擅长语言的 SDK 开发自定义插件。APISIX 于 2022 年 1 月 适配 Nacos 作为其注册中心用于发现后端服务,几乎同时 APISIX 支持 Dubbo 协议代理,即支持 HTTP 协议转 Dubbo 协议,以实现对 Dubbo 服务的直接调用。

Apache Dubbo

2.jpeg

Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。比如 Dubbo-go 社区就是最新比较活跃的一个新社区。

Dubbo 具备了开箱即用、大规模部署、高度可扩展的优点,同时也具有一定的微服务治理的能力。

  1. 开箱即用:
  • 易用性高,如 Java 版本的面向接口代理特性能实现本地透明调用。
  • 功能丰富,基于原生库或轻量扩展即可实现绝大多数的微服务治理能力。 
  1. 面向超大规模微服务集群设计:极致性能,高性能的 RPC 通信协议设计与实现,横向可扩展,轻松支持百万规模集群实例的地址发现与流量治理。

  2. 高度可扩展:

  • 调用过程中对流量及协议的拦截扩展,如 Filter、Router、LB 等。
  • 微服务治理组件扩展,如 Registry、Config Center、Metadata Center 等。 
  1. 微服务治理:Dubbo 有一些默认的路由等能力,同时也提供了 dubbo-admin 这样的微服务治理控制台,提供给用户简单的微服务治理功能。

Dubbo 早期版本就将 Nacos 作为注册配置中心使用,两者紧密结合使用已成为用户的共识。

Alibaba Nacos

3.png

Alibaba Nacos 是 Dynamic Naming and Configuration Service 的首字母缩写,目标是构建一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台,具有 简单易用,特性丰富,超高性能,超大容量,高可用的优势,Nacos 生态支持所有主流编程语言、RPC 框架和网关,包括 Dubbo 和 APISIX。

Nacos 从 2018 年开源以来经历了 3 个大的版本,从 0.X 的初露端倪,到 1.X 的生产可用;而随着 Nacos 开源社区的发展已经用户的增多,和用户规模的逐渐增大,社区发现 Nacos 1.0 基于 HTTP 的架构开始暴露一些性能问题,于是新增了 gRPC 作为更高效的通信方式,同时对内核架构做了大量重构和更新,将性能和扩展性提升了 10 倍。同时 Nacos 2.0 也在积极进行插件化改造,让 Nacos 的架构更加易于拓展和更新,变得更加易用和更加能够适应不同用户的不同需求。我们首先推荐大家使用 2.X 版本来进行使用。

4.png

Nacos 2.X 架构层次如上图,它相比 Nacos 1.X 的最主要变化是:

  1. 客户端和服务端之间绿色部分的通信层和连接层,增加了 gRPC 长链接协议,同时也将会补充客户端和服务端之间的流量控制和负载均衡。

  2. 将增加一些可拓展的接口,实现一些插件,比如将来会实现的的配置加解密,多数据源支持;还有将目前的鉴权抽象成插件实现;还有现在的 MCP 和 XDS 协议的支持。

5.jpeg

关于 Nacos 的生态环境,能支持目前绝大多数开源微服务生态产品;比如 RPC 框架,即支持阿里自身的 Dubbo,Sofastack, 也支持像头条的 kitex,社区火爆的gRPC 等;在网关方面,有 Spring Cloud体系的 SC gateway, zuul,也有阿里自身的 tegine,还有 Mesh火爆的 Envoy,当然还是有今天分享主题内容的 APISIX;另外在应用框架层面, Nacos 也能支持 spring 体系,包括 boot, cloud,同时也有社区很火爆的 Dapr 的适配;高可用框架方面, 分布式事务 seata 和熔断限流的 sentinel 也都在使用 Nacos 做配置管理和服务发现;最后在 Mesh 探索方面, Nacos 可以通过 mcp 协议,与 istio 互通,帮助 istio 发现服务,也支持 coreDNS 和 confd,融入 K8s 体系。

Nacos 社区也还会不停的扩大相关的生态图谱,打造一个互联互通的 Nacos 微服务生态。

最佳实践

开始介绍最佳实践之前,请大家可以现象一下, 如果想要将让用户的入口南北向流量通过网关转发到 Dubbo 进行一系列微服务的调用,需要如何部署我们的架构?

Dubbo 本身可以用 Nacos 做服务发现,进行服务调用;只要简单让网关从 Nacos 中获取到 Dubbo 的服务列表,然后按照 url 转发是不是就就行?

其实不是的,在实践中,通常会遇到下面 2 个主要问题:

6.jpeg

首先,除去少量自研的网关,大多数网关暴露出来的服务,通常都是 HTTP 或者 HTTPS 协议的,而 Dubbo 服务通常使用 Dubbo 协议来进行通信的。这就有一个协议转换的问题;而大多数网关并不具备,HTTP 协议和 Dubbo 协议互相转换的能力。

其次,网关需要从注册中心中获取 Dubbo 的服务列表和对应的 provider 列表;但很多网关甚至都不具备动态获取后端 RS 的能力,更别说从注册中心中获取了。

一般解决方案

解决上述问题的一般解决方案,通常是在网关和 Dubbo 服务之间,添加一层适配层,或者叫胶水层,暴露 HTTP 的接口,将信息转换成 Dubbo 协议,然后在调用实际的 Dubbo 服务。

同时还需要针对网关,开发对应的网关插件,以支持网关从 Nacos 中动态获取和刷新配置服务地址的能力。如果网关并不支持插件能力,还需要对其源码进行改动。

7.jpeg

一般解决方案虽然能够解决前面提到的两个问题,但是其也会引入一些其他的问题:

  1. 适配层会导致调用的服务多了一次流量转发,RT 和稳定性都会受到影响,比如适配服务性能不足了,响应慢了,或者适配服务挂了的情况。同时适配层服务可能需要额外部署在一批服务器上,可能导致更高的成本。

  2. 网关和适配服务,适配服务和底层服务之间也需要通过注册中心来进行注册和发现,多一层服务,可能会导致 Nacos 的订阅量翻倍,也可能需要提升 Nacos 的集群规格,导致一部分提高的成本。

  3. 针对网关的额外插件开发或源码改动,可能需要投入一定人力进行高难度开发,毕竟大多数网关的开发语言都是 C/C++/Lua 等,后续还需要投入人员维护。

综上所述,一般的解决方案,不仅需要投入人力进行额外的高难度开发,还对稳定性,响应速度,成本有一定的影响。

APISIX+Dubbo+Nacos 最佳实践

使用 APISIX+Dubbo+Nacos,则可以完美符合我们对这个实践的最初构想,即网关直接调用 Dubbo 服务,且直接从注册中心中获取服务地址自动更新路由。用户不需要额外考虑中间的转换以及服务发现的问题,只需要专注于开发自己的 Dubbo 业务即可。

8.jpeg

由于 APISIX 原生支持 HTTP 和 Dubbo 协议的转换,不需要适配层来帮忙,实现最简单的直接调用 Dubbo 服务。同时由于 APISIX 原生支持将 Nacos 作为 upstream(也就是后端服务的)注册中心来源,支持动态刷新 RS 列表。

笔者编写了一个简单的工程 Demo 来模拟最佳实践的使用结果。

github.com/KomachiSion…

整个实践过程,仅需要 4 个步骤:

  1. Clone 工程 Demo 到本地环境;

  2. 执行 docker-compose 命令,自动部署 APISIX 以及 Nacos;

  3. 启动 Dubbo 样例,可在 Nacos 上查看到注册的服务;

  4. 调用 APISIX 的 openAPI, 创建流量的 Dubbo 路由规则;

自此,APISIX+Dubbo+Nacos 的组合使用就已经全部完成,通过 Demo 中的样例 uri 尝试进行调用。

9.jpeg

计划与展望

虽然使用 APISIX+Dubbo+Nacos,能够解决这个实践中最主要的两个问题。但是它在使用中仍然还有需要进步的地方。社区中会在后续的计划和展望中继续优化。

10.png

路由规则自动生成

在刚才的 Demo 工程中,创建路由规则的动作是手动通过 OpenAPI 进行创建的,如果需要路由的规则众多,势必对运维人员有较高的要求;同时维护这些 uri 和后端服务的映射关系,也是一个比较麻烦的事情。

后续社区间是否能进一步的合作,Dubbo 的元数据实际上都存放在 Nacos 中,而 APISIX 是否能通过读取这部分信息,按照一定的规则自动生成这份路由规则,免去用户自行创建和维护路由规则的可能。

Mesh 探索

当前 Service Mesh 是开源社区中一个很热门的方向,3 个社区也都在积极进行 Mesh 化的探索;例如 Nacos 就在 3.0 中规划将 Mesh 化作为主要的演进方向,直接支持 XDS 协议;Dubbo 3 也在进行 Mesh 化改造,同时也支持 XDS 协议;而 APISIX 已经支持作为 Ingress Controller 来使用;将来 3 个社区产品获取能通过 Mesh 的方式,更加紧密的结合使用,提供更多更丰富的功能。

作者介绍:

杨翊,Alibaba Nacos PMC、Apahce ShardingSphere PMC