盘古开发框架下实现微服务网关的缺省姿势为基于 pangu-web 模块的传统接口调用模式,具体请参考文档:如何发布微服务 (API 网关)。本文提供另外一种通过集成Apache ShenYu 实现网关泛化调用 Dubbo 服务将其发布为 HTTP 接口的可选方法。

ShenYu 网关介绍

ShenYu 网关基于 Webflex 非阻塞模型通过泛化调用后端 Dubbo 服务。依赖 Netty 不需要 Servlet 容器,不需要引入服务接口包即可通过 Dubbo 泛化调用服务接口的方式就可以将后端 Dubbo 服务转换为 HTTP API。同时网关支持鉴权、动态限流、熔断、防火墙、灰度发布等。

相关名词解释

  • shenyu-admin
    网关插件和元数据信息配置管理后台。独立 JAR,需要单独部署。
  • shenyu-gateway
    网关模块,代理 Http 请求,泛化调用后端 Dubbo 服务。此模块负责接收 Http 请求。
  • 数据同步
    数据同步是指在 ShenYu-Admin 后台操作数据以后,使用何种策略将数据同步到 ShenYu Gateway 网关模块。ShenYu 当前支持 ZooKeeper、WebSocket、Http 长轮询、Nacos 、Etcd 和 Consul 进行数据同步。盘古开发使用的是 WebSocket 方式进行数据同步。
  • 插件
    ShenYu 使用插件化设计思想,实现插件的热插拔。内置丰富的插件,包括 RPC 代理、熔断和限流、权限认证、监控等等。
  • 选择器
    每个插件可设置多个选择器,对流量进行初步筛选。
  • 规则
    每个选择器可设置多个规则,对流量进行更细粒度的控制。

网关调用结构图

ShenYu 网关实战

ShenYu 网关提供的功能非常多,这里我们只关注 HTTP 请求代理功能。即代理前端 HTTP 请求,通过 Dubbo 泛化调用后端 Dubbo 服务。

安装相关模块

  • 盘古 Parent
<parent><groupId>com.gitee.pulanos.pangu</groupId><artifactId>pangu-parent</artifactId><version>latest.version.xxx</version><relativePath/>
</parent>
  • 基础模块
<dependency><groupId>com.gitee.pulanos.pangu</groupId><artifactId>pangu-spring-boot-starter</artifactId>
</dependency>
  • Dubbo 模块
<dependency><groupId>com.gitee.pulanos.pangu</groupId><artifactId>pangu-dubbo-spring-boot-starter</artifactId>
</dependency>
  • 网关模块
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency><groupId>org.apache.shenyu</groupId><artifactId>shenyu-spring-boot-starter-gateway</artifactId>
</dependency>
<dependency><groupId>org.apache.shenyu</groupId><artifactId>shenyu-spring-boot-starter-sync-data-websocket</artifactId>
</dependency>
<dependency><groupId>org.apache.shenyu</groupId><artifactId>shenyu-spring-boot-starter-plugin-apache-dubbo</artifactId>
</dependency>

基于 ShenYu 网关开发模式不需要引入 Dubbo 服务接口 Jar,网关会根据服务接口的元数据信息,泛化调用 Dubbo 服务接口。服务接口的元数据信息则根据 Dubbo 服务应用中的配置自动上传到 ShenYu 网关管理系统。此内容在下文会继续讲解。

本地配置

为便于理解,本文基于本地配置的方式编写。若改为标准的 Nacos 配置中心模式,请参阅:配置中心 章节。

server:port: 9090spring:main:allow-bean-definition-overriding: trueshenyu:cross:enabled: trueallowedHeaders:allowedMethods: "*"allowedOrigin: "*"allowedExpose: "*"maxAge: "18000"allowCredentials: trueswitchConfig:local: truefile:enabled: truemaxSize : 10sync:websocket:urls: ${shenyu.websocket.urls:ws://localhost:9095/websocket}dubbo:parameter: multiexclude:enabled: falsepaths:- /favicon.icoextPlugin:path:enabled: truethreads: 1scheduleTime: 300scheduleDelay: 30scheduler:enabled: falsetype: fixedthreads: 16upstreamCheck:enabled: falsetimeout: 3000healthyThreshold: 1unhealthyThreshold: 1interval: 5000printEnabled: trueprintInterval: 60000

关键配置项说明

  • shenyu.sync.websocket.urls
    表示网关和 ShenYu Admin 之间使用 Websocket 的方式进行数据同步,这里是配置 ShenYu Admin 提供的 Websocket 数据同步服务的地址(支持集群,逗号分割)。

上表中提到到 ShenYu Admin 是 ShenYu 网关框架的配置 & 元数据管理后台。这里包含了网关模块自己的配置信息也包含了后台服务接口元数据信息,这理的配置信息和元数据信息需要和网关模块同步。ShenYu 支持多种数据同步方案,Websocket 只是盘古开发选用的一种缺省方案。

调用微服务接口

基于 ShenYu 的网关开发模式既不需要引入服务接口 JAR,也不需要编写具体的调用代码。完全由网关根据服务接口元数据进行 Dubbo 泛化调用。

网关是如何知道 Dubbo 服务接口元数据的呢?

  • 通过 ShenYu Admin 后台系统,『基础配置->元数据管理』菜单,手工新增每一个接口的元数据,然后将数据自动同步到网关模块。(不建议,量大的话太繁琐)
  • 对Dubbo服务提供者增加 ShenYu Client 支持,通过在接口方法上使用注解 @ShenyuDubboClient 来自动采集上传接口元数据到 ShenYu Admin,然后将数据自动同步到网关模块。(具体实现见下文所述)

改造 Dubbo 服务端,自动上传接口元数据

对原 Dubbo 服务端做一些配置变更,使其能自动将接口元数据上传到 ShenYu Admin 后台系统。
安装 ShenYu Client 依赖包

<dependency><groupId>org.apache.shenyu</groupId><artifactId>shenyu-spring-boot-starter-client-apache-dubbo</artifactId>
</dependency>

增加配置项

shenyu.client.register-type=http
shenyu.client.server-lists=${shenyu.server-lists:http://localhost:9095}
shenyu.client.props.contextPath=/dubbo
  • shenyu.client.register-type
    服务接口元数据采集方式,可选 http 直连模式或配置中心 zookeeper、etcd、consul 和 nacos。盘古开发采集接口元数据缺省选择 http 直接 ShenYu Admin 的方式。
  • shenyu.client.server-lists
    ShenYu Admin 地址或配置中心地址。集群时多个地址用逗号分开。
  • shenyu.client.props.contextPath
    本服务在网关中的路由前缀,可自定义按需配置。

自动上报服务接口元数据
在 Dubbo 服务实现类的方法上使用注解 @ShenyuDubboClient 标记,表示该接口方法元数据自动上传到 ShenYu Admin。如下代码所示。

@Service(version = "1.0.0", group = "pangu-examples-dubbo-gateway-service")
public class UserServiceImpl implements UserService {@Override@ShenyuDubboClient(path = "/findUserEntity", desc = "查询用户信息")public UserEntity findUserEntity(Long id) {...return userEntity;}
}

配置网关泛化调用 Dubbo 服务所需的注册中心地址
通过 ShenYu Admin 后台系统『基础配置->插件管理』菜单,启用 dubbo插件 并填入注册中心地址。比如,我测试用的注册中心地址:nacos://169.188.88.140:1688?namespace=pangu-dev。如下图所示。

重启服务提供者

  • 进入 ShenYu Admin 后台系统的『基础配置->元数据管理』菜单,会看到自动上报的服务元数据信息。如下图所示。
  • 进入 ShenYu Admin 后台系统的『插件列表-> proxy -> dubbo』菜单,会看到自动注册的选择器和规则信息。如下图所示。

启动入口

@SpringBootApplication
public class WebApiGatewayApplication {public static void main(String[] args) {PanGuApplicationBuilder.init(WebApiGatewayApplication.class).run(args);}
}

网关请求URL

至此,网关就可以调用 Dubbo 服务了。但是,如何确定 Dubbo 服务对应的请求 url 地址呢?

  • 由网关模块配置文件可知网关应用端口是 9090
  • Dubbo 服务的配置项 shenyu.client.props.contextPath 为 /dubbo
  • Dubbo 方法通过 @ShenyuDubboClient 标记的 path 属性为:/findUserEntity

综上,Dubbo 服务 UserService#findUserEntity 的完整请求地址为:http://localhost:9090/dubbo/findUserEntity

参数说明

通过 http 协议,post 方式访问网关。在 http body 中传入 json 格式的参数。

请求示例

curl --location --request POST 'http://127.0.0.1:9090/dubbo/findUserEntity' \
--header 'Content-Type: application/json' \
--data '{id=1}'
{"code": 200,"message": "Access to success!","data": {"name": "云南码农大熊","id": 1,"userType": 2,}
}

本范例源码

  • pangu-examples-dubbo-api:Dubbo 服务接口包
  • pangu-examples-dubbo-gateway-shenyu-service:Dubbo 服务提供者(支持接口元数据上传到网关系统)
  • pangu-examples-webapi-gateway-shenyu-based:基于 ShenYu 网关将 Dubbo 服务发布为 HTTP 接口

参考文献

  • 如何开发微服务
  • 如何发布微服务 (API 网关)
  • 盘古开发框架简介

盘古开发框架集成 ShenYu 网关实现 Dubbo 泛化调用相关推荐

  1. 接口测试-dubbo泛化调用

    一.为什么要用dubbo泛化调用 泛化接口调用方式主要用于客户端没有 API 接口及模型类元的情况,参数及返回值中的所有 POJO 均用 Map 表示,通常用于框架集成,比如:实现一个通用的服务测试框 ...

  2. 代码技巧——dubbo泛化调用

    现在有一种业务场景: (1)业务方B调用任务系统A,提交一个任务,由A保证任务尽可能的被执行成功(系统A自带幂等.重试),在A完成任务的执行后将执行情况同步回调通知B应用: (2)因此,B应用在提交任 ...

  3. Dubbo泛化调用处理序列化问题

    知其然要知其所以然,刚好趁这个机会把博客重新捡起来. 之前项目的目的是处理dubbo泛化调用的返回值,处理LocalDateTim,LocalDate,LocalTime.转换为时间戳. 一.如何泛化 ...

  4. Dubbo 泛化调用

    dubbo 泛化调用 含义 使用 含义 官方说的文邹邹的,不太懂.按我的理解,就是可以通过指定某个接口的全限定名和方法名,调用远程有提供该方法的服务. 通过上篇文章Dubbo入门,我们可以知道作为服务 ...

  5. 微服务-API网关-协议转换(泛化调用)

    RPC和REST的区别 REST和RPC是两种通讯方式,并不是协议,这一点大家要注意. REST是基于HTTP协议的,而RPC可以基于HTTP协议来实现,也可以通过TCP协议来实现. 业界普遍采用的做 ...

  6. dubbo泛化调用原理

    泛接口调用方式主要用于客户端没有API接口及模型类元的情况,参数及返回值中的所有POJO均用Map表示,通常用于框架集成,比如:实现一个通用的服务测试框架,可通过GenericService调用所有服 ...

  7. dubbo的调用原理及泛化调用

    简单介绍 dubbo是阿里开源出来的一个rpc框架,主要是用于微服务分布式项目的远程调用,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现,下面是调用的原理图: ...

  8. Dubbo笔记 ⑱ :泛化调用 泛化实现

    文章目录 一.前言 二.泛化调用与泛化实现 1. 泛化调用 2. 泛化实现 三.源码实现 1. GenericImplFilter 2. GenericFilter 四.总结 一.前言 本系列为个人D ...

  9. Dubbo泛化引用和泛化实现

    开篇 在Dubbo官方文档中关于泛化调用和泛化实现的说明,这里针对文档的案例做一些简单的说明和解释. 例子 // 引用远程服务 // 该实例很重量,里面封装了所有与注册中心及服务提供方连接,请缓存 R ...

  10. Dubbo 泛化引用

    前言 大家好,今天开始给大家分享 - Dubbo 专题之 Dubbo 泛化引用.在前一个章节中我们介绍了 Dubbo 中的参数验证以及使用场景.我们在这个章节会继续介绍 Dubbo 泛化引用.那么什么 ...

最新文章

  1. 全球首个开源图像识别系统上线!
  2. python秒数转化为时间用户jianpang_Python中文转为拼音
  3. java地狱猫_ES6 ES6变量的声明
  4. 三年经验前端社招——腾讯微保
  5. 怎么发表博客,还不能显示在自己的博客首页上,这还不如玩单机!
  6. Kotlin入门(6)条件分支的实现
  7. Github应用最广泛的开源项目
  8. 一些自成系统、完备的教程(链接、博客、github等)
  9. substring splice
  10. 蓝桥杯 -罗马数字问题
  11. 数据分析--数据预处理
  12. python生成excel文件报扩展名错误_在python中打开扩展名为.xls的文本文件时出错
  13. CC2530 IIC 4线驱动中景0.96寸OLED屏显示程序,从c51移植过来的
  14. python 闲鱼_闲鱼上哪些商品抢手?Python 分析后告诉你
  15. CANOpen协议详解(二):协议具体内容
  16. RigNet神经网络模型自动绑定骨骼
  17. 计算机最低配置有哪些,win10对电脑配置有哪些要求?win10最低配置要求
  18. html按钮字号,html button样式
  19. Vue移动端H5生成二维码功能(qrcodejs2)
  20. H3C DIS命令记录

热门文章

  1. 计算机科目三教学设计,驾校科目三教案
  2. 多通道振弦传感器VTN416采集仪应用工程项目安全监测实用性强
  3. 一个非常好用的批量图片压缩工具
  4. 中英文标点符号切换的组合键_中英文标点切换的快捷键
  5. 黑客的google运用技巧
  6. 【二】如何用Python创建一个docx文档
  7. 数据归档方案(带流程图)
  8. android js回调函数,JavaScript回调函数的几种用法
  9. maven atuo import
  10. 【Codecs系列】HEVC-SCC(四):SCC IBC句法