前言
时隔 4 个月,Apache ShenYu 迎来 2.5.0 的大版本,本次版本内容,共有 300 + 的 pull Request,60 + 的贡献者参与提交,88000 + 的添加或者修改的代码行数,该版本优化许多内容,让我们看下这个版本都做了什么。以下只是列举比较重要的一些功能。
日志功能
- 新增对接阿里云SLS日志插件
具体使用参考:https://shenyu.apache.org/zh/docs/plugin-center/observability/logging-aliyun-sls/
- 新增对接Elastic Search日志插件
具体使用参考:https://shenyu.apache.org/zh/docs/plugin-center/observability/logging-elasticsearch
- 新增对接Apache RocketMQ日志插件
具体使用参考:https://shenyu.apache.org/zh/docs/plugin-center/observability/logging-rocketmq
- 新增对接Apache Kafka日志插件
具体使用参考:https://shenyu.apache.org/zh/docs/plugin-center/observability/logging-kafka
新功能
新增 mock 插件。
为请求指定响应状态码和响应体方便进行测试。 支持设置请求的响应状态码和响应体。 支持配置 ${int|min-max}
, ${double|min-max|format}
, ${email}
, ${phone}
, ${zh|min-max}
, ${list|[arg1,arg2...]}
, ${array|item|length}
等占位符自动生成数据。
具体使用参考:https://shenyu.apache.org/zh/docs/plugin-center/mock/mock-plugin
用户也可以自定义开发其他占位符:
具体开发:https://shenyu.apache.org/zh/docs/developer/spi/custom-mock-generator
response 插件中自定义输出结果
ShenYu代码 :
@Bean
public ShenyuPlugin responsePlugin(final ObjectProvider<List<MessageWriter>> httpWriter) {
Map<String, MessageWriter> writerMap = new LinkedHashMap<>();
List<MessageWriter> writerList = httpWriter.getIfAvailable(ArrayList::new);
for (MessageWriter writer : writerList) {
List<String> supportTypes = writer.supportTypes();
for (String type : supportTypes) {
writerMap.put(type, writer);
}
}
return new ResponsePlugin(writerMap);
}
用户自定实现 :rg.apache.shenyu.plugin.response.strategy.MessageWriter
/**
* The interface Message writer.
*/
public interface MessageWriter {
/**
* Write with exchange and shenyu plugin chain.
*
* @param exchange exchange the current server exchange
* @param chain provides a way to delegate to the next filter
* @return {@code Mono<Void>} to indicate when request processing is complete
*/
Mono<Void> writeWith(ServerWebExchange exchange, ShenyuPluginChain chain);
/**
* Support type list.
*
* @return the list
*/
List<String> supportTypes();
}
注册中心
ShenYu的注册中心的目的是将网关的实例暴露出去,以便支持ShenYu的集群功能。可以使用shenyu-nginx项目,也可以对接其他的负载均衡服务。
ShenYu-Nginx:https://github.com/apache/shenyu-nginx
新增 Nacos的支持
使用: 在网关bootstarp的yaml新增如下配置:
shenyu :
instance:
enabled: true //设置true表示打开
registerType: nacos //类型为nacos
serverLists: localhost:8848
props:
新增 Consul的支持
使用: 在网关bootstarp的yaml新增如下配置:
shenyu :
instance:
enabled: true //设置true表示打开
registerType: consul //类型为consul
serverLists: localhost:2379
props:
性能优化
-
升级SpringBoot 到 2.6.8, 同时将Reactor-netty升级到 1.0.19
-
网关自定义Netty全量参数配置。满足用户的个性化配置
具体可以参考:https://shenyu.apache.org/zh/docs/user-guide/property-config/gateway-property-config
新增匹配缓存策略。流量匹配效率为 O(1)
。
如何使用? 在网关的yaml文件中进行配置:
shenyu:
matchCache:
enabled: true //设置为true 开启
maxFreeMemory: 256 # //内存大小 单位M
新增自定义线共享线程池。
如何使用? 在网关的yaml文件中进行配置:
shenyu:
sharedPool:
enable: true
prefix: "shenyu-shared"
corePoolSize: 200
maximumPoolSize: 2000
keepAliveTime: 60000
maxWorkQueueMemory: 1073741824 # 1GB
maxFreeMemory: 268435456 # 256MB
原理:自定义shenyu线程池,重写队列等等。具体可以查看如下代码:
管控平台
- 数据存储新增支持 oracle 数据库。
- 新增API文档管理功能。
- ShenYu Admin管理控制台新增日志记录。
- 更多....
重构
-
重构 spring cloud插件负载均衡。
-
重构 IpUtils 获取 ip逻辑 。
-
Zookeeper 客户端替换成 Apache Curator。
-
重构ShenYu Java Client注册逻辑。
-
更多....
BugFix
- 修复 divide插件空指针异常.
- 修复 body 体过大的异常。
- 修复 Java客户端注册,循环错误。
- 修复 Grpc客户端注册错误。
- 修复 加载本地插件失败的问题。
- 修复 Consul注册只注册1个元数据的问题。
- 修复 使用Websocket同步数据时候的 CSRF攻击。
- 修复 Admin pg脚本错误。
- 更多....
贡献者
特别感谢对 2.5.0 的支持的贡献者,排名不分顺序。
dragon-zhang,renzhuyan,moremind,xiaoyu,likeguo,qinghai777,Kevin, Qicz,,yunlongn,lianjunwei,zhengpeng,Han,weihubeats,Zihao, DamonXue(Fibonacci),Luke.Z,ShawnSiao,sunshujie1990,Codd,dayu, LiuTianyou,PJ,Sixh-PrFor,ChineseTony,chuang,erdengk,hutaishi,impactCn, Jiageng,lahmxu,qifanyyy,Shawn,SongTao,zouchangfu,damonxue,Kunshuai, mango,nuo-promise,Salted,Seth,SongTaoZhuang,wklong,AhahaGe,Bigbang, Chencheng,Dongx,Ethan,haibo.duan,Haitao,huanccwang,jerbo99,Lidyaqf Liming,midnight2104,Nick-fengzl,ningminglong,Rubén,Shuaiqi,vijay wjlonger,Zhang,zhc,Zhiqiang,ZZQ
关于Apache ShenYu
Apache ShenYu 一款使用 Java Reactor 开发的响应式 API 网关。以其高性能,动态灵活的流量管控,热插拔,易部署等特性,开箱即用为用户提供整套全生命周期的 API 网关,包含 API 注册、服务代理、协议转换与 API 治理等功能。于2022年7月毕业成为Apache顶级项目。