当前位置:首页 > 技术 > 正文内容

Apache ShenYu 网关 2.3 版本新特性概览与实践部署

访客 技术 2026年10月22日 1

Apache ShenYu (原 Soul) 网关 2.3 版本核心更新

Apache ShenYu (原 Soul) API 网关发布了具有里程碑意义的 2.3.0 版本。此次更新带来了诸多重要改进与新功能,旨在提升网关的易用性、功能性和稳定性。以下是 2.3 版本的主要亮点:

管理控制台 (shenyu-admin) 增强

  • **权限管理升级:** 集成 Apache Shiro 框架,实现用户、角色、菜单、按钮级别的精细化权限控制。
  • **插件配置模板化:** 引入插件配置模板机制,用户无需关注前端页面实现细节,只需专注于数据配置。
  • **国际化支持:** 后端服务全面支持多语言,目前提供中文和英文界面切换。
  • **数据存储扩展:** 新增对 H2 嵌入式数据库的支持,方便快速启动与测试。
  • **界面优化:** 对表格、按钮等 UI 元素进行美化,提升用户体验。
  • **测试覆盖率提升:** 新增大量单元测试,代码覆盖率达到 70% 以上,保障系统质量。

网关插件体系发展

新增功能插件:

  • **GRPC 协议支持:** 新增 shenyu-plugin-grpc 插件,全面支持 GRPC 协议的代理。
  • **Tars 协议支持:** 新增 shenyu-plugin-tars 插件,集成腾讯 Tars RPC 协议。
  • **Sofa 协议支持:** 新增 shenyu-plugin-sofa 插件,支持 Sofa RPC 协议。
  • **Sentinel 集成:** 新增 shenyu-plugin-sentinel 插件,整合 Alibaba Sentinel 的熔断限流能力。
  • **Resilience4j 集成:** 新增 shenyu-plugin-resilience4j 插件,支持 Resilience4j 框架的熔断限流功能。
  • **重定向功能:** 新增 shenyu-plugin-redirect 插件,支持 HTTP 请求重定向。
  • **自定义 Context-path:** 新增 shenyu-plugin-context-path 插件,允许用户自定义服务上下文路径。

现有插件优化:

  • **Divide 插件:** 优化了节点探活机制和流量预热策略。
  • **RateLimiter 插件:** 引入并发、漏桶等多种限流算法,提供更灵活的限流选择。
  • **Sign 插件:** 修复了 URL 必填的缺陷,并增加了是否验证的标记,可用于开放平台 URI 认证。
  • **Dubbo 插件:** 增强了对表单和 URI 参数请求的处理,新增注册中心直连以及参数校验功能。

客户端 (shenyu-client) 改进

ShenYu Client 模块提供快速接入网关的能力,它并非强制依赖,用户也可直接在管理后台配置规则。

  • **多版本兼容性:** 优化了 Spring MVC、Spring Cloud 和 Dubbo 客户端,支持所有主流 Spring 和 Spring Boot 版本。
  • **新增特定协议客户端:**
    • shenyu-grpc-client:支持 Java GRPC 服务接入。
    • shenyu-tars-client:支持 Java Tars 服务接入。
    • shenyu-sofa-client:支持 Java Sofa 服务接入。
  • **注册中心模式扩展:**

    此版本在传统的 HTTP 方式接入之外,新增了多种注册中心接入方式:

    • 支持 ZooKeeper 作为注册中心。
    • 支持 Nacos 作为注册中心。
    • 支持 Consul 作为注册中心。
    • 支持 Etcd 作为注册中心。

详细使用方式请参考官方文档中关于注册中心接入的部分。

数据同步机制优化

  • 修复了 Nacos 配置中心在未设置 Namespace 时的同步问题。
  • 优化了 WebSocket 数据同步方式的效率和稳定性。
  • 解决了 shenyu-admin 集群部署环境下,HTTP 长轮询数据同步存在的缺陷。

环境搭建与示例应用接入

本节将引导读者通过本地方式部署 Apache ShenYu 网关并接入一个 Spring Boot 示例应用。

1. ShenYu Admin (控制台) 安装

首先,从官方仓库克隆源代码:

git clone https://github.com/apache/shenyu.git
cd shenyu

启动 shenyu-admin 模块下的 ShenYuAdminBootstrap 类。

  • **H2 数据库模式:** 若使用内置 H2 内存数据库,需设置 JVM 参数 --spring.profiles.active=h2。
  • **MySQL 数据库模式:** 若使用 MySQL,请修改 application.yaml 中的 MySQL 配置。

以 H2 模式为例,启动成功后,控制台会显示相关日志。随后,通过浏览器访问 http://localhost:9095,使用默认用户名 admin 和密码 123456 登录。

2. ShenYu Bootstrap (网关代理) 安装

在 shenyu 项目根目录,启动 shenyu-bootstrap 模块下的 ShenYuBootstrapApplication 类。启动成功后,控制台将显示网关与管理后台建立 WebSocket 连接的日志,表明网关已成功启动并连接到管理控制台进行数据同步。

3. Spring Boot 应用接入 ShenYu 网关

下面我们将创建一个简单的 Spring Boot 应用,并将其注册到 ShenYu 网关。本文使用官方示例项目中的 HTTP 代理模块进行演示。

Maven 依赖配置

在 Spring Boot 应用的 pom.xml 中,添加 ShenYu 客户端及相关插件依赖:

<properties>
    <shenyuGateway.version>2.3.0-RELEASE</shenyuGateway.version>
    <springBoot.version>2.3.12.RELEASE</springBoot.version>
</properties>

<dependencies>
    <!-- Spring Boot Web Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>${springBoot.version}</version>
    </dependency>

    <!-- ShenYu Gateway HTTP 代理插件 -->
    <dependency>
        <groupId>org.apache.shenyu</groupId>
        <artifactId>shenyu-spring-boot-starter-plugin-divide</artifactId>
        <version>${shenyuGateway.version}</version>
    </dependency>

    <!-- ShenYu Gateway HTTP 客户端插件 -->
    <dependency>
        <groupId>org.apache.shenyu</groupId>
        <artifactId>shenyu-spring-boot-starter-plugin-httpclient</artifactId>
        <version>${shenyuGateway.version}</version>
    </dependency>

    <!-- ShenYu Spring MVC 客户端,用于自动注册服务 -->
    <dependency>
        <groupId>org.apache.shenyu</groupId>
        <artifactId>shenyu-spring-boot-starter-client-springmvc</artifactId>
        <version>${shenyuGateway.version}</version>
    </dependency>
</dependencies>

应用配置 (application.yaml)

在 Spring Boot 应用的 application.yaml 中添加 ShenYu 客户端配置:

server:
  port: 8189 # 应用服务端口

shenyu:
  client:
    registerType: http # 注册类型,可选:http, zookeeper, etcd, nacos, consul
    serverLists: http://localhost:9095 # ShenYu Admin 服务地址
    props:
      contextPath: /api-service # 服务在 ShenYu 网关的路由前缀,例如 /users, /products
      appName: demo-service # 应用名称,未配置时默认为 spring.application.name
      port: 8189 # 应用服务端口,需与 server.port 保持一致
      nacosNameSpace: shenyu-dev-namespace # 若使用 Nacos,指定命名空间

示例 REST 控制器

创建一个简单的 REST 控制器,使用 @ShenYuSpringMvcClient 注解标记需要被网关代理的接口:

// SampleRequestDTO.java
public class SampleRequestDTO {
    private String inputMessage;

    public SampleRequestDTO() {}

    public SampleRequestDTO(String inputMessage) {
        this.inputMessage = inputMessage;
    }

    public String getInputMessage() {
        return inputMessage;
    }

    public void setInputMessage(String inputMessage) {
        this.inputMessage = inputMessage;
    }

    @Override
    public String toString() {
        return "SampleRequestDTO{inputMessage='" + inputMessage + "'}";
    }
}

// DataController.java
import org.apache.shenyu.client.springmvc.annotation.ShenyuSpringMvcClient;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/data") // 应用的基础路径
@ShenyuSpringMvcClient(path = "/data") // 对应网关中的选择器路径
public class DataController {

    /**
     * 处理示例数据请求。
     * 接收一个 SampleRequestDTO,并返回处理后的数据。
     *
     * @param requestPayload 包含输入消息的请求体
     * @return 处理后的 SampleRequestDTO
     */
    @PostMapping("/process") // 接口的具体路径
    @ShenyuSpringMvcClient(path = "/process", desc = "处理示例数据请求") // 对应网关中的规则路径及描述
    public SampleRequestDTO processData(@RequestBody final SampleRequestDTO requestPayload) {
        // 模拟数据处理逻辑
        String processedMsg = "Processed by ShenYu: " + requestPayload.getInputMessage().toUpperCase();
        requestPayload.setInputMessage(processedMsg);
        System.out.println("Received and processed: " + requestPayload);
        return requestPayload;
    }
}

@ShenYuSpringMvcClient 注解的关键属性包括:

  • path:定义在 ShenYu 网关中匹配该接口的请求路径。
  • desc:对接口功能的描述,方便在管理后台查看。
  • enable:是否启用该接口的网关代理,默认为 true。

启动应用并测试

启动 Spring Boot 应用的 main 方法。成功启动后,该服务会自动向 ShenYu Admin 注册其接口信息。

现在,你可以通过 ShenYu 网关访问该接口。网关默认运行在 9195 端口。

使用 Postman 或 curl 发送 POST 请求到:http://localhost:9195/api-service/data/process

请求体 (JSON):

{
    "inputMessage": "hello shenyu gateway"
}

预期返回 (JSON):

{
    "inputMessage": "Processed by ShenYu: HELLO SHENYU GATEWAY"
}

这表明请求已成功通过 ShenYu 网关转发至后端服务并返回结果。

通过这个简单的案例,我们可以理解 ShenYu 网关的数据同步和请求转发机制,其核心流程图如下:

ShenYu 数据同步流程图

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

linux screen 用法详情 (nohup 的替代方案)

一、screen 是什么?能干嘛?screen 是一个终端复用器,可以:在一个 SSH 会话中开多个“虚拟终端”SSH 断线后,程序仍然在后台运行随时重新连接到原来的会话特别适合:nohup 的替代方案跑脚本 / 爬虫 / 训练模型运维、远程开发二、安装 screen# CentOS / Rocky / Almayum install -y screen# Debian / Ubuntuapt i...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。