带你读《Apache Dubbo微服务开发从入门到精通》——三、 网关(7)

简介: 带你读《Apache Dubbo微服务开发从入门到精通》——三、 网关(7)

《Apache Dubbo微服务开发从入门到精通》——服务治理与生态——三、 网关(6) https://developer.aliyun.com/article/1223986


c) 流程分析

 

流程分析是从源码的角度,展示服务注册流程,数据同步流程和服务调用流程。

 

服务注册流程

 

读取dubbo服务

 

使用注解@ShenyuDubboClient标记需要注册到网关的dubbo服务。

 

注解扫描通过ApacheDubboServiceBeanListener完成,它实现了ApplicationListener接口,在Spring容器启动过程中,发生上下文刷新事件时,开始执行事件处理方法onApplicationEvent()。在重写的方法逻辑中,读取Dubbo服务ServiceBean,构建元数据对象和URI对象,并向shenyu-admin注册。

 

具体的注册逻辑由注册中心实现,请参考客户端接入原理

 

处理注册信息

 

客户端通过注册中心注册的元数据和URI数据,在shenyu-admin端进行处理,负责存储到数据库和同步给shenyu网关。Dubbo插件的客户端注册处理逻辑在ShenyuClientRegisterDubboServiceImpl中。继承关系如下:

 

image.png

 

ShenyuClientRegisterService:客户端注册服务,顶层接口

FallbackShenyuClientRegisterService:注册失败,提供重试操作

AbstractShenyuClientRegisterServiceImpl:抽象类,实现部分公共注册逻辑

ShenyuClientRegisterDubboServiceImpl:实现`Dubbo`插件的注册

 

注册信息包括选择器,规则和元数据。

 

整体的dubbo服务注册流程如下:

 

image.png

 

数据同步流程

 

admin更新数据

 

假设在在后台管理系统中,新增一条选择器数据,请求会进入SelectorController类中的createSelector()方法,它负责数据的校验,添加或更新数据,返回结果信息。

 

在SelectorServiceImpl类中通过createOrUpdate()方法完成数据的转换,保存到数据库,发布事件,更新upstream。

 

在Service类完成数据的持久化操作,即保存数据到数据库。发布变更数据通过eventPublisher.publishEvent()完成,这个eventPublisher对象是一个ApplicationEventPublisher类,这个类的全限定名是org.springframework.context.ApplicationEventPublisher,发布数据的功能正是是通过Spring相关的功能来完成的。

 

当事件发布完成后,会自动进入到DataChangedEventDispatcher类中的onApplicationEvent()方法,根据不同数据类型和数据同步方式进行事件处理。

 

网关数据同步

 

网关在启动时,根据指定的数据同步方式加载不同的配置类,初始化数据同步相关类。

 

在接收到数据后,进行反序列化操作,读取数据类型和操作类型。不同的数据类型,有不同的数据处理方式,所以有不同的实现类。但是它们之间也有相同的处理逻辑,所以可以通过模板方法设计模式来实现。相同的逻辑放在抽象类AbstractDataHandler中的handle()方法中,不同逻辑就交给各自的实现类。

 

新增一条选择器数据,是新增操作,会进入到SelectorDataHandler.doUpdate()具体的数据处理逻辑中。

 

在通用插件数据订阅者CommonPluginDataSubscriber,负责处理所有插件、选择器和规则信息

 

将数据保存到网关的内存中,BaseDataCache是最终缓存数据的类,通过单例模式实现。选择器数据就存到了SELECTOR_MAP这个Map中。在后续使用的时候,也是从这里拿数据。

 

上述逻辑用流程图表示如下:

 

image.png

 

服务调用流程

 

在Dubbo插件体系中,类继承关系如下:

 

image.png

 

注:

ShenyuPlugin:顶层接口,定义接口方法

AbstractShenyuPlugin:抽象类,实现插件共有逻辑

AbstractDubboPlugin:dubbo插件抽象类,实现dubbo共有逻辑(ShenYu网关支持ApacheDubbo和AlibabaDubbo)

ApacheDubboPlugin:ApacheDubbo插件。

 

org.apache.shenyu.web.handler.ShenyuWebHandler.DefaultShenyuPluginChain#execute()

 

通过ShenYu网关代理后,请求入口是ShenyuWebHandler,它实现了org.springframework.web.server.WebHandler接口,通过责任链设计模式将所有插件连接起来。

 

org.apache.shenyu.plugin.base.AbstractShenyuPlugin#execute()

 

当请求到网关时,判断某个插件是否执行,是通过指定的匹配逻辑来完成。在execute()方法中执行选择器和规则的匹配逻辑。

 

org.apache.shenyu.plugin.global.GlobalPlugin#execute()

 

最先被执行的是GlobalPlugin,它是一个全局插件,在execute()方法中构建上下文信息。

 

org.apache.shenyu.plugin.base.RpcParamTransformPlugin#execute()

 

接着被执行的是RpcParamTransformPlugin,它负责从http请求中读取参数,保存到exchange中,传递给rpc服务。在execute()方法中,执行该插件的核心逻辑:从exchange中获取请求信息,根据请求传入的内容形式处理参数。

 

org.apache.shenyu.plugin.dubbo.common.AbstractDubboPlugin

 

然后被执行的是DubboPlugin。在doExecute()方法中,主要是检查元数据和参数。在doDubboInvoker()方法中设置特殊的上下文信息,然后开始dubbo的泛化调用。

 

在genericInvoker()方法中:

 

获取ReferenceConfig对象

获取泛化服务GenericService对象

构造请求参数pair对象

发起异步的泛化调用。

 

通过泛化调用就可以实现在网关调用dubbo服务了。

 

ReferenceConfig对象是支持泛化调用的关键对象 ,它的初始化操作是在数据同步的时候完成的。

 

org.apache.shenyu.plugin.response.ResponsePlugin#execute()

 

最后被执行的是ResponsePlugin,它统一处理网关的响应结果信息。处理类型由MessageWriter决定,类继承关系如下:

 

image.png

 

注:

MessageWriter:接口,定义消息处理方法

NettyClientMessageWriter:处理`Netty`调用结果

RPCMessageWriter:处理`RPC`调用结果

WebClientMessageWriter:处理`WebClient`调用结果

 

Dubbo服务调用,处理结果是RPCMessageWriter。

 

org.apache.shenyu.plugin.response.strategy.RPCMessageWriter#writeWith()

 

在writeWith()方法中处理响应结果,获取结果或处理异常。

 

分析至此,关于Dubbo插件的源码分析就完成了,分析流程图如下:

 

image.png

 

4) 小结

 

本文从实际案例出发,由浅入深分析了ShenYu网关对Dubbo服务的代理过程。涉及到的主要知识点如下:

 

通过责任链设计模式执行插件

使用模板方法设计模式实现AbstractShenyuPlugin,处理通用的操作类型

使用单例设计模式实现缓存数据类BaseDataCache

通过springboot starter即可引入不同的注册中心和数同步方式,扩展性很好

通过admin支持规则热更新,方便流量管控

Disruptor队列是为了数据与操作解耦,以及数据缓冲。

相关文章
|
6月前
|
人工智能 安全 API
20 万奖金池就位!Higress AI 网关开发挑战赛参赛指南
本次赛事共设三大赛题方向,参赛者可以任选一个方向参赛。本文是对每个赛题方向的参赛指南。
549 52
|
人工智能 Dubbo 应用服务中间件
使用 Apache Dubbo 释放 DeepSeek R1 的全部潜力
本文介绍了如何利用 Apache Dubbo 的多语言 SDK 充分释放 DeepSeek R1 的全部潜力,助力 AI 开发的高效落地。
489 88
|
监控 Cloud Native 安全
基于 API 网关践行 API First 开发实践
API First 开发模式的核心在于:以 API 为先,将其视为“头等公民”,在构建应用、服务及集成之前,应优先定义并设计 API 及其配套。API First 作为一种相对较新的开发模式,它已逐渐流行并获得业内的广泛认可。
696 150
|
Dubbo 安全 应用服务中间件
Apache Dubbo 正式发布 HTTP/3 版本 RPC 协议,弱网效率提升 6 倍
在 Apache Dubbo 3.3.0 版本之后,官方推出了全新升级的 Triple X 协议,全面支持 HTTP/1、HTTP/2 和 HTTP/3 协议。本文将围绕 Triple 协议对 HTTP/3 的支持进行详细阐述,包括其设计目标、实际应用案例、性能测试结果以及源码架构分析等内容。
1081 122
|
Dubbo 应用服务中间件 Apache
Star 4w+,Apache Dubbo 3.3 全新发布,Triple X 领衔,开启微服务通信新时代
在 Apache Dubbo 突破 4w Star 之际,Apache Dubbo 团队正式宣布,Dubbo 3.3 正式发布!作为全球领先的开源微服务框架,Dubbo 一直致力于为开发者提供高性能、可扩展且灵活的分布式服务解决方案。此次发布的 Dubbo 3.3,通过 Triple X 的全新升级,突破了以往局限,实现了对南北向与东西向流量的全面支持,并提升了对云原生架构的友好性。
479 100
|
Dubbo 应用服务中间件 Apache
Star 4w+,Apache Dubbo 3.3 全新发布,Triple X 领衔,开启微服务通信新时代
Star 4w+,Apache Dubbo 3.3 全新发布,Triple X 领衔,开启微服务通信新时代
213 0
|
监控 负载均衡 API
Apache Apisix轻松打造亿级流量Api网关
Apache APISIX 是一个动态、实时、高性能的 API 网关,提供负载均衡、动态上行、灰度发布、熔断、鉴权、可观测等丰富的流量管理功能。适用于处理传统南北向流量、服务间东西向流量及 k8s 入口控制。Airflow 是一个可编程、调度和监控的工作流平台,基于有向无环图 (DAG) 定义和执行任务,提供丰富的命令行工具和 Web 管理界面,方便系统运维和管理。
Apache Apisix轻松打造亿级流量Api网关
|
存储 分布式计算 物联网
Apache IoTDB进行IoT相关开发实践
当今社会,物联网技术的发展带来了许多繁琐的挑战,尤其是在数据库管理系统领域,比如实时整合海量数据、处理流中的事件以及处理数据的安全性。例如,应用于智能城市的基于物联网的交通传感器可以实时生成大量的交通数据。据估计,未来5年,物联网设备的数量将达数万亿。物联网产生大量的数据,包括流数据、时间序列数据、RFID数据、传感数据等。要有效地管理这些数据,就需要使用数据库。数据库在充分处理物联网数据方面扮演着非常重要的角色。因此,适当的数据库与适当的平台同等重要。由于物联网在世界上不同的环境中运行,选择合适的数据库变得非常重要。 原创文字,IoTDB 社区可进行使用与传播 一、什么是IoTDB 我
612 9
Apache IoTDB进行IoT相关开发实践
|
Java 持续交付 项目管理
Maven是一款基于Apache许可的项目管理和构建自动化工具,在Java开发中极为流行。
Maven是一款基于Apache许可的项目管理和构建自动化工具,在Java开发中极为流行。它采用项目对象模型(POM)来描述项目,简化构建流程。Maven提供依赖管理、标准构建生命周期、插件扩展等功能,支持多模块项目及版本控制。在Java Web开发中,Maven能够自动生成项目结构、管理依赖、自动化构建流程并运行多种插件任务,如代码质量检查和单元测试。遵循Maven的最佳实践,结合持续集成工具,可以显著提升开发效率和项目质量。
292 1
|
开发框架 Dubbo 应用服务中间件
微服务开发框架-----Apache Dubbo
这篇文章介绍了Apache Dubbo微服务开发框架,它提供RPC通信和微服务治理能力,支持服务发现、负载均衡和流量治理等功能,并强调了Dubbo在微服务规模化实践和企业级治理方面的优势。
微服务开发框架-----Apache Dubbo

热门文章

最新文章

推荐镜像

更多