APISIX+Dubbo+Nacos 最佳实践

本文涉及的产品
性能测试 PTS,5000VUM额度
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: 虽然使用 APISIX+Dubbo+Nacos,能够解决这个实践中最主要的两个问题。但是它在使用中仍然还有需要进步的地方。社区中会在后续的计划和展望中继续优化。

作者:杨翊


项目简介


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 这个技术栈]以了解实现原理。

https://apisix.apache.org/zh/blog/2021/08/25/why-apache-apisix-chose-nginx-and-lua /

  • 生态友好:APISIX 支持与以下工具和平台集成:HashiCorp Vault、Zipkin、Apache SkyWalking、Consul、Nacos、Eureka。通过 APISIX Dashboard,运维人员可以通过友好且直观的 UI 配置 APISIX。 


4. 多语言插件支持: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 版本的面向接口代理特性能实现本地透明调用。
  • 功能丰富,基于原生库或轻量扩展即可实现绝大多数的微服务治理能力。 


2. 面向超大规模微服务集群设计:极致性能,高性能的 RPC 通信协议设计与实现,横向可扩展,轻松支持百万规模集群实例的地址发现与流量治理。


3. 高度可扩展:


  • 调用过程中对流量及协议的拦截扩展,如 Filter、Router、LB 等。
  • 微服务治理组件扩展,如 Registry、Config Center、Metadata Center 等。 


4. 微服务治理: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 来模拟最佳实践的使用结果。


https://github.com/KomachiSion/APISIX-Dubbo-Nacos


整个实践过程,仅需要 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

相关文章
|
7月前
|
Dubbo Java 应用服务中间件
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用
|
1月前
|
存储 Java Nacos
Spring Cloud+Nacos+KMS 动态配置最佳实践
本文讲述了 Spring Cloud 应用中结合 Nacos 实现了运行期配置动态更新的功能,以及在此基础上结合 KMS 在不改动代码的情况下对应用使用的敏感配置进行保护,解决将配置迁移到 Nacos 中可能存在的数据安全顾虑,并对其底层工作原理做了简单介绍。
416 15
|
27天前
|
Dubbo Cloud Native 应用服务中间件
阿里云的 Dubbo 和 Nacos 深度整合,提供了高效的服务注册与发现、配置管理等关键功能,简化了微服务治理,提升了系统的灵活性和可靠性。
在云原生时代,微服务架构成为主流。阿里云的 Dubbo 和 Nacos 深度整合,提供了高效的服务注册与发现、配置管理等关键功能,简化了微服务治理,提升了系统的灵活性和可靠性。示例代码展示了如何在项目中实现两者的整合,通过 Nacos 动态调整服务状态和配置,适应多变的业务需求。
37 2
|
1月前
|
Dubbo Java 应用服务中间件
深入探讨了“dubbo+nacos+springboot3的native打包成功后运行出现异常”的原因及解决方案
本文深入探讨了“dubbo+nacos+springboot3的native打包成功后运行出现异常”的原因及解决方案。通过检查GraalVM版本兼容性、配置反射列表、使用代理类、检查配置文件、禁用不支持的功能、查看日志文件、使用GraalVM诊断工具和调整GraalVM配置等步骤,帮助开发者快速定位并解决问题,确保服务的正常运行。
49 1
|
4月前
|
Dubbo Java Nacos
【实战攻略】破解Dubbo+Nacos+Spring Boot 3 Native打包后运行异常的终极秘籍——从零开始彻底攻克那些让你头疼不已的技术难题!
【8月更文挑战第15天】Nacos作为微服务注册与配置中心受到欢迎,但使用Dubbo+Nacos+Spring Boot 3进行GraalVM native打包后常遇运行异常。本文剖析此问题及其解决策略:确认GraalVM版本兼容性;配置反射列表以支持必要类和方法;采用静态代理替代动态代理;检查并调整配置文件;禁用不支持的功能;利用日志和GraalVM诊断工具定位问题;根据诊断结果调整GraalVM配置。通过系统排查方法,能有效解决此类问题,确保服务稳定运行。
113 0
|
5月前
|
消息中间件 Java 数据库连接
理解java的springboot+mybatisplus+dubbo+nacos+kafka这一套技术栈
理解java的springboot+mybatisplus+dubbo+nacos+kafka这一套技术栈
106 0
|
7月前
|
Dubbo Cloud Native 应用服务中间件
【阿里云云原生专栏】云原生环境下的微服务治理:阿里云 Dubbo 与 Nacos 的深度整合
【5月更文挑战第25天】阿里云Dubbo和Nacos提供微服务治理的强大工具,整合后实现灵活高效的治理。Dubbo是高性能RPC框架,Nacos则负责服务发现和配置管理。整合示例显示,通过Nacos注册中心,服务能便捷注册发现,动态管理配置。简化部署,提升适应性,但也需注意服务稳定性和策略规划。这种整合为云原生环境的微服务架构带来强大支持,未来应用前景广阔。
293 2
|
7月前
|
Dubbo Java 应用服务中间件
深度剖析:Dubbo使用Nacos注册中心的坑
2020年笔者在做微服务部件升级时,Dubbo的注册中心从Zookeeper切换到Nacos碰到个问题,最近刷Github又有网友提到类似的问题,就在这篇文章里做个梳理和总结。
深度剖析:Dubbo使用Nacos注册中心的坑
|
7月前
|
SQL 监控 Java
nacos常见问题之dubbo+nacos+springboot3的native打包成功后运行出现异常如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
405 2
|
7月前
|
XML Dubbo Java
【Dubbo3高级特性】「框架与服务」 Nacos作为注册中心-服务分组及服务分组聚合实现
【Dubbo3高级特性】「框架与服务」 Nacos作为注册中心-服务分组及服务分组聚合实现
285 0