APISIX+Dubbo+Nacos最佳实践

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 微服务引擎MSE面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持Nacos/ZooKeeper/Eureka)、云原生网关(原生支持Ingress/Envoy)、微服务治理(原生支持Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。

项目简介


Apache APISIX

image.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

image.png

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

image.png

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

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

image.png

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

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

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


image.png

关于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个主要问题:

image.png

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

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


一般解决方案


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

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

image.png

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

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

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

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

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


APISIX+Dubbo+Nacos 最佳实践


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


image.png

由于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尝试进行调用。

image.png


计划与展望


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

image.png

路由规则自动生成


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

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


Mesh探索


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

相关文章
|
负载均衡 算法 Java
3. nacos服务发现
nacos基础文章3篇
727 0
3. nacos服务发现
|
5月前
|
Dubbo 应用服务中间件 Nacos
要让一个Dubbo-Consumer应用通过Higress调用Nacos里面的服务
要让一个Dubbo-Consumer应用通过Higress调用Nacos里面的服务
30 2
|
5月前
|
Dubbo 应用服务中间件 Nacos
让一个Dubbo-Consumer应用通过Higress调用Nacos里面的服务
让一个Dubbo-Consumer应用通过Higress调用Nacos里面的服务
43 4
|
8月前
|
缓存 Dubbo 应用服务中间件
Dubbo + Nacos这么玩就失去高可用的能力了
酱香配拿铁喝了伤头,Dubbo配Nacos这么玩也会伤头。本文介绍Dubbo配合Nacos搭建的微服务系统,在Nacos-Server集群重启时出现的问题。过程中通过种种现象、猜测、翻看源码、实践,最终让Nacos-Server平滑重启。
|
9月前
|
存储 缓存 Nacos
nacos的服务发现详解
nacos的服务发现详解
111 0
|
10月前
|
Dubbo Java 应用服务中间件
将Dubbo注册到Nacos,与DubboAdmin的部署
大家好,我是王有志。今天我们做两件事,将Dubbo的服务的注册中心从Zookeeper迁移到Nacos,然后我们部署一个用于测试Dubbo服务的DubboAdmain。
341 0
将Dubbo注册到Nacos,与DubboAdmin的部署
|
Kubernetes 网络协议 Dubbo
基于Kubernetes(k8s)部署Dubbo+Nacos服务
本文介绍基于 Kubernetes(k8s) 环境集成阿里云私有镜像仓库来部署一套 Dubbo + Nacos 的微服务系统,并使用 Kubernetes DNS 以及 port-forward 的方式来打通网络访问。
651 0
基于Kubernetes(k8s)部署Dubbo+Nacos服务
|
Dubbo Java 应用服务中间件
基于Docker部署Dubbo+Nacos服务
本文介绍基于 Docker 部署一套 Dubbo + Nacos 的微服务环境,并解决容器里的 IP 及端口的访问问题。
544 0
基于Docker部署Dubbo+Nacos服务
|
运维 Dubbo Cloud Native
APISIX+Dubbo+Nacos 最佳实践
虽然使用 APISIX+Dubbo+Nacos,能够解决这个实践中最主要的两个问题。但是它在使用中仍然还有需要进步的地方。社区中会在后续的计划和展望中继续优化。
401 0
APISIX+Dubbo+Nacos 最佳实践
|
SpringCloudAlibaba 负载均衡 Cloud Native
Nacos Discovery--服务治理
通过上一章的操作,我们已经可以实现微服务之间的调用。但是我们把服务提供者的网络地址 (ip,端口)等硬编码到了代码中,这种做法存在许多问题: - 一旦服务提供者地址变化,就需要手工修改代码 - 一旦是多个服务提供者,无法实现负载均衡功能 - 一旦服务变得越来越多,人工维护调用关系困难 那么应该怎么解决呢, 这时候就需要通过注册中心动态的实现服务治理。