Apache ShenYu 网关正式支持 Dubbo3 服务代理
介绍
Aliware
Apache ShenYu
Apache Dubbo
Dubbo 快速开始
Aliware
本小节介绍如何将 Dubbo 服务接入到 ShenYu 网关,您可以直接在工程下找到本小节的示例代码 。
启动 shenyu-admin
shenyu-admin 是 Apache ShenYu 后台管理系统, 启动的方式有多种,本文通过本地部署的方式启动。启动成功后,需要在基础配置->插件管理中,把 dubbo 插件设置为开启,并设置你的注册地址,请确保注册中心已经开启。
启动 shenyu 网关
在这里通过源码的方式启动,直接运行 shenyu-bootstrap 中的 ShenyuBootstrapApplication。
<!-- apache shenyu apache dubbo plugin start--><dependency><groupId>org.apache.shenyu</groupId><artifactId>shenyu-spring-boot-starter-plugin-apache-dubbo</artifactId><version>${project.version}</version></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId><version>3.0.8</version></dependency><!-- Dubbo zookeeper registry dependency start --><dependency><groupId>org.apache.curator</groupId><artifactId>curator-client</artifactId><version>4.0.1</version><exclusions><exclusion><artifactId>log4j</artifactId><groupId>log4j</groupId></exclusion></exclusions></dependency><dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>4.0.1</version></dependency><dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>4.0.1</version></dependency><!-- Dubbo zookeeper registry dependency end --><!-- apache dubbo plugin end-->
启动 shenyu-examples-dubbo
以官网提供的例子为例 shenyu-examples-dubbo 。假如 dubbo 服务定义如下:
<beans /* ...... * /><dubbo:application name="test-dubbo-service"/><dubbo:registry address="${dubbo.registry.address}"/><dubbo:protocol name="dubbo" port="20888"/><dubbo:service timeout="10000" interface="org.apache.shenyu.examples.dubbo.api.service.DubboTestService" ref="dubboTestService"/></beans>
/*** DubboTestServiceImpl.*/@Service("dubboTestService")public class DubboTestServiceImpl implements DubboTestService {@Override@ShenyuDubboClient(path = "/findById", desc = "Query by Id")public DubboTest findById(final String id) {return new DubboTest(id, "hello world shenyu Apache, findById");}//......}
server:port: 8011address: 0.0.0.0servlet:context-path: /spring:main:allow-bean-definition-overriding: truedubbo:registry:address: zookeeper://localhost:2181 # dubbo使用的注册中心shenyu:register:registerType: http #注册方式serverLists: http://localhost:9095 #注册地址props:username: adminpassword: 123456client:dubbo:props:contextPath: /dubboappName: dubbo
调用 dubbo 服务
shenyu-examples-dubbo 项目成功启动之后会自动把加 @ShenyuDubboClient 注解的接口方法注册到网关。
选择器和规则是 Apache ShenYu 网关中最灵魂的东西。掌握好它,你可以对任何流量进行管理。对应为选择器与规则里面的匹配条件(conditions),根据不同的流量筛选规则,我们可以处理各种复杂的场景。流量筛选可以从 Header, URI, Query, Cookie 等等 Http 请求获取数据。 然后可以采用 Match,=,Regex,Groovy,Exclude 等匹配方式,匹配出你所预想的数据。多组匹配添加可以使用 And/Or 的匹配策略。 具体的介绍与使用请看: 选择器与规则管理 。
GET http://localhost:9195/dubbo/findById?id=100Accept: application/json
{"name": "hello world shenyu Apache, findById","id": "100"}
深入理解 Dubbo 插件
Aliware
在运行上述 demo 的过程中,是否存在一些疑问:
-
dubbo 服务是如何注册到 shenyu-admin? -
shenyu-admin 是如何将数据同步到 ShenYu 网关? -
DubboPlugin 是如何将 http 协议转换到到 dubbo 协议?
应用客户端接入
应用客户端接入是指将微服务接入到 Apache ShenYu 网关,当前支持 Http、 Dubbo、 Spring Cloud、 gRPC、 Motan、 Sofa、 Tars 等协议的接入。
-
客户端注册
-
服务端注册
数据同步原理
-
数据同步的意义
-
数据同步原理分析
下图展示了 Apache ShenYu 数据同步的流程,Apache ShenYu 网关在启动时,会从配置服务同步配置数据,并且支持推拉模式获取配置变更信息,然后更新本地缓存。管理员可以在管理后台(shenyu-admin),变更用户权限、规则、插件、流量配置,通过推拉模式将变更信息同步给 Apache ShenYu 网关,具体是 push 模式,还是 pull 模式取决于使用哪种同步方式。
流程分析
流程分析是从源码的角度,展示服务注册流程,数据同步流程和服务调用流程。
-
服务注册流程
1、读取 dubbo 服务
-
ShenyuClientRegisterService:客户端注册服务,顶层接口; -
FallbackShenyuClientRegisterService:注册失败,提供重试操作; -
AbstractShenyuClientRegisterServiceImpl:抽象类,实现部分公共注册逻辑; -
ShenyuClientRegisterDubboServiceImpl:实现 Dubbo 插件的注册;
-
数据同步流程
1、admin 更新数据
-
服务调用流程
在 Dubbo 插件体系中,类继承关系如下:
ShenyuPlugin:顶层接口,定义接口方法; AbstractShenyuPlugin:抽象类,实现插件共有逻辑; AbstractDubboPlugin:dubbo插件抽象类,实现dubbo共有逻辑(ShenYu网关支持ApacheDubbo和AlibabaDubbo); ApacheDubboPlugin:ApacheDubbo插件。
-
org.apache.shenyu.web.handler.ShenyuWebHandler.DefaultShenyuPluginChain#execute()
-
org.apache.shenyu.plugin.base.AbstractShenyuPlugin#execute()
-
org.apache.shenyu.plugin.global.GlobalPlugin#execute()
-
org.apache.shenyu.plugin.base.RpcParamTransformPlugin#execute()
-
org.apache.shenyu.plugin.dubbo.common.AbstractDubboPlugin
-
org.apache.shenyu.plugin.response.ResponsePlugin#execute()
MessageWriter:接口,定义消息处理方法; NettyClientMessageWriter:处理 Netty 调用结果; RPCMessageWriter:处理 RPC 调用结果; WebClientMessageWriter:处理 WebClient 调用结果;
-
org.apache.shenyu.plugin.response.strategy.RPCMessageWriter#writeWith()
小结
Aliware
本文从实际案例出发,由浅入深分析了 ShenYu 网关对 Dubbo 服务的代理过程。 涉及到的主要知识点如下:
-
通过责任链设计模式执行插件; -
使用模板方法设计模式实现 AbstractShenyuPlugin,处理通用的操作类型; -
使用单例设计模式实现缓存数据类 BaseDataCache; -
通过 springboot starter 即可引入不同的注册中心和数同步方式,扩展性很好; -
通过 admin 支持规则热更新,方便流量管控; -
Disruptor 队列是为了数据与操作解耦,以及数据缓冲。
-
Apache Shenyu 社区:
-
Dubbo3 社区:
作者简介
刘良:Apache ShenYu PPMC
往期回顾