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

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

盘古开发框架下实现微服务网关的缺省姿势为基于 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 代理、熔断和限流、权限认证、监控等等。

  • 选择器

每个插件可设置多个选择器,对流量进行初步筛选。

  • 规则

每个选择器可设置多个规则,对流量进行更细粒度的控制。

网关调用结构图

9-pangu-framework-shenyu.png

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: 9090

spring:
  main:
    allow-bean-definition-overriding: true

shenyu:
  cross:
    enabled: true
    allowedHeaders:
    allowedMethods: "*"
    allowedOrigin: "*"
    allowedExpose: "*"
    maxAge: "18000"
    allowCredentials: true
  switchConfig:
    local: true
  file:
    enabled: true
    maxSize : 10
  sync:
    websocket:
      urls: ${shenyu.websocket.urls:ws://localhost:9095/websocket}
  dubbo:
    parameter: multi
  exclude:
    enabled: false
    paths:
      - /favicon.ico
  extPlugin:
    path:
    enabled: true
    threads: 1
    scheduleTime: 300
    scheduleDelay: 30
  scheduler:
    enabled: false
    type: fixed
    threads: 16
  upstreamCheck:
    enabled: false
    timeout: 3000
    healthyThreshold: 1
    unhealthyThreshold: 1
    interval: 5000
    printEnabled: true
    printInterval: 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。如下图所示。
4-pangu-framework-shenyu-dubbo.png

重启服务提供者

  • 进入 ShenYu Admin 后台系统的『基础配置->元数据管理』菜单,会看到自动上报的服务元数据信息。如下图所示。

2-pangu-framework-shenyu-metadata.png

  • 进入 ShenYu Admin 后台系统的『插件列表-> proxy -> dubbo』菜单,会看到自动注册的选择器和规则信息。如下图所示。

3-pangu-framework-shenyu-plugin.png

启动入口

@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,
    }
}
相关文章
|
28天前
|
JavaScript 前端开发 持续交付
Prettier 高级应用:集成 CI/CD 流水线与插件开发
【10月更文挑战第18天】Prettier 是一款流行的代码格式化工具,它能够自动将代码格式化成一致的风格,从而提高代码的可读性和维护性。对于希望进一步发挥 Prettier 潜力的高级用户而言,将 Prettier 集成到持续集成(CI)和持续部署(CD)流程中,确保每次提交的代码都符合团队标准,是非常重要的。此外,通过开发自定义插件来支持更多语言或扩展 Prettier 的功能也是值得探索的方向。本文将详细介绍这两方面的内容。
43 2
|
25天前
|
Java 程序员 API
Android|集成 slf4j + logback 作为日志框架
做个简单改造,统一 Android APP 和 Java 后端项目打印日志的体验。
93 1
|
2月前
|
算法 API Apache
Flink CDC:新一代实时数据集成框架
本文源自阿里云实时计算团队 Apache Flink Committer 任庆盛在 Apache Asia CommunityOverCode 2024 的分享,涵盖 Flink CDC 的概念、版本历程、内部实现及社区未来规划。Flink CDC 是一种基于数据库日志的 CDC 技术实现的数据集成框架,能高效完成全量和增量数据的实时同步。自 2020 年以来,Flink CDC 经过多次迭代,已成为功能强大的实时数据集成工具,支持多种数据库和数据湖仓系统。未来将进一步扩展生态并提升稳定性。
599 1
Flink CDC:新一代实时数据集成框架
|
1月前
|
Dart Android开发
鸿蒙Flutter实战:03-鸿蒙Flutter开发中集成Webview
本文介绍了在OpenHarmony平台上集成WebView的两种方法:一是使用第三方库`flutter_inappwebview`,通过配置pubspec.lock文件实现;二是编写原生ArkTS代码,自定义PlatformView,涉及创建入口能力、注册视图工厂、处理方法调用及页面构建等步骤。
54 0
|
1月前
|
开发框架 监控 搜索推荐
GoFly快速开发框架集成ZincSearch全文搜索引擎 - Elasticsearch轻量级替代为ZincSearch全文搜索引擎
本文介绍了在项目开发中使用ZincSearch作为全文搜索引擎的优势,包括其轻量级、易于安装和使用、资源占用低等特点,以及如何在GoFly快速开发框架中集成和使用ZincSearch,提供了详细的开发文档和实例代码,帮助开发者高效地实现搜索功能。
121 0
|
2月前
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
150 0
|
3月前
|
测试技术 Java Spring
Spring 框架中的测试之道:揭秘单元测试与集成测试的双重保障,你的应用真的安全了吗?
【8月更文挑战第31天】本文以问答形式深入探讨了Spring框架中的测试策略,包括单元测试与集成测试的有效编写方法,及其对提升代码质量和可靠性的重要性。通过具体示例,展示了如何使用`@MockBean`、`@SpringBootTest`等注解来进行服务和控制器的测试,同时介绍了Spring Boot提供的测试工具,如`@DataJpaTest`,以简化数据库测试流程。合理运用这些测试策略和工具,将助力开发者构建更为稳健的软件系统。
59 0
|
3月前
|
测试技术 持续交付 开发者
Xamarin 高效移动应用测试最佳实践大揭秘,从框架选择到持续集成,让你的应用质量无敌!
【8月更文挑战第31天】竞争激烈的移动应用市场,Xamarin 作为一款优秀的跨平台开发工具,提供了包括单元测试、集成测试及 UI 测试在内的全面测试方案。借助 Xamarin.UITest 框架,开发者能便捷地用 C# 编写测试案例,如登录功能测试;通过 Xamarin 模拟框架,则可在无需真实设备的情况下模拟各种环境测试应用表现;Xamarin.TestCloud 则支持在真实设备上执行自动化测试,确保应用兼容性。结合持续集成与部署策略,进一步提升测试效率与应用质量。掌握 Xamarin 的测试最佳实践,对确保应用稳定性和优化用户体验至关重要。
63 0
|
3月前
|
开发者 存储 API
Xamarin 云服务集成竟然如此强大,简化后端开发不再是梦,数据存储、用户认证、推送通知全搞定!
【8月更文挑战第31天】Xamarin 是一款强大的跨平台移动应用开发工具,通过与云服务集成,显著简化了后端开发。开发者无需自行搭建服务器,即可利用云服务提供的数据存储、用户认证、推送通知等功能,大幅减少数据库设计、服务器配置及 API 开发的时间成本。借助 Azure Mobile Apps 等云服务,Xamarin 可轻松实现数据存取操作,同时增强应用安全性与用户参与度,使开发者更专注于业务逻辑和用户体验,提升开发效率并降低成本。这种方式在快速发展的移动应用领域极具价值。
59 0
|
4月前
|
监控 druid Java
spring boot 集成配置阿里 Druid监控配置
spring boot 集成配置阿里 Druid监控配置
291 6