带你读《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队列是为了数据与操作解耦,以及数据缓冲。

相关文章
|
5月前
|
人工智能 安全 API
20 万奖金池就位!Higress AI 网关开发挑战赛参赛指南
本次赛事共设三大赛题方向,参赛者可以任选一个方向参赛。本文是对每个赛题方向的参赛指南。
522 48
|
11月前
|
人工智能 安全 Java
智慧工地源码,Java语言开发,微服务架构,支持分布式和集群部署,多端覆盖
智慧工地是“互联网+建筑工地”的创新模式,基于物联网、移动互联网、BIM、大数据、人工智能等技术,实现对施工现场人员、设备、材料、安全等环节的智能化管理。其解决方案涵盖数据大屏、移动APP和PC管理端,采用高性能Java微服务架构,支持分布式与集群部署,结合Redis、消息队列等技术确保系统稳定高效。通过大数据驱动决策、物联网实时监测预警及AI智能视频监控,消除数据孤岛,提升项目可控性与安全性。智慧工地提供专家级远程管理服务,助力施工质量和安全管理升级,同时依托可扩展平台、多端应用和丰富设备接口,满足多样化需求,推动建筑行业数字化转型。
389 5
|
11月前
|
人工智能 Java 数据库
飞算 JavaAI:革新电商订单系统 Spring Boot 微服务开发
在电商订单系统开发中,传统方式耗时约30天,需应对复杂代码、调试与测试。飞算JavaAI作为一款AI代码生成工具,专注于简化Spring Boot微服务开发。它能根据业务需求自动生成RESTful API、数据库交互及事务管理代码,将开发时间缩短至1小时,效率提升80%。通过减少样板代码编写,提供规范且准确的代码,飞算JavaAI显著降低了开发成本,为软件开发带来革新动力。
|
8月前
|
IDE Java API
Java 17 新特性与微服务开发的实操指南
本内容涵盖Java 11至Java 17最新特性实战,包括var关键字、字符串增强、模块化系统、Stream API、异步编程、密封类等,并提供图书管理系统实战项目,帮助开发者掌握现代Java开发技巧与工具。
407 0
|
消息中间件 API 持续交付
后端开发中的微服务架构实践####
【10月更文挑战第21天】 本文深入探讨了微服务架构在后端开发中的应用,从基本概念出发,详细阐述了微服务的核心优势、设计原则及关键技术。通过实际案例分析,揭示了微服务如何助力企业应对复杂业务需求,提升系统的可扩展性、灵活性与可靠性。同时,也指出了实施微服务过程中可能面临的挑战,并提供了相应的解决方案和最佳实践。 ####
215 3
|
监控 Cloud Native 安全
基于 API 网关践行 API First 开发实践
API First 开发模式的核心在于:以 API 为先,将其视为“头等公民”,在构建应用、服务及集成之前,应优先定义并设计 API 及其配套。API First 作为一种相对较新的开发模式,它已逐渐流行并获得业内的广泛认可。
673 153
|
10月前
|
人工智能 数据可视化 JavaScript
颠覆开发效率!国内首个微服务编排框架Juggle开源啦!
Juggle是国内首个开源的微服务编排框架,专注于解决企业微服务进程中接口重复开发、系统对接复杂等问题。它提供零代码、低代码和AI增强功能,通过可视化拖拽快速组装简单API为复杂接口,支持多协议、多语言脚本和流程多版本管理。相比国外框架如Conductor,Juggle更贴合国内需求,具备高效开发、企业级可靠性及信创适配等优势,助力企业实现敏捷创新与数字化转型。
颠覆开发效率!国内首个微服务编排框架Juggle开源啦!
|
9月前
|
Java API 微服务
Java 21 与 Spring Boot 3.2 微服务开发从入门到精通实操指南
《Java 21与Spring Boot 3.2微服务开发实践》摘要: 本文基于Java 21和Spring Boot 3.2最新特性,通过完整代码示例展示了微服务开发全流程。主要内容包括:1) 使用Spring Initializr初始化项目,集成Web、JPA、H2等组件;2) 配置虚拟线程支持高并发;3) 采用记录类优化DTO设计;4) 实现JPA Repository与Stream API数据访问;5) 服务层整合虚拟线程异步处理和结构化并发;6) 构建RESTful API并使用Springdoc生成文档。文中特别演示了虚拟线程配置(@Async)和StructuredTaskSco
1015 0
|
负载均衡 监控 Java
深入探索微服务架构下的服务治理
深入探索微服务架构下的服务治理
229 39
|
消息中间件 运维 安全
后端开发中的微服务架构实践与挑战####
在数字化转型的浪潮中,微服务架构凭借其高度的灵活性和可扩展性,成为众多企业重构后端系统的首选方案。本文将深入探讨微服务的核心概念、设计原则、关键技术选型及在实际项目实施过程中面临的挑战与解决方案,旨在为开发者提供一套实用的微服务架构落地指南。我们将从理论框架出发,逐步深入至技术细节,最终通过案例分析,揭示如何在复杂业务场景下有效应用微服务,提升系统的整体性能与稳定性。 ####
292 32

热门文章

最新文章

推荐镜像

更多