Apache ShenYu 网关 2.3 版本新特性概览与实践部署
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 网关的数据同步和请求转发机制,其核心流程图如下:
