Apache ShenYu 发布 2.5.0

8,612 阅读4分钟

前言

时隔 4 个月,Apache ShenYu 迎来 2.5.0 的大版本,本次版本内容,共有 300 + 的 pull Request,60 + 的贡献者参与提交,88000 + 的添加或者修改的代码行数,该版本优化许多内容,让我们看下这个版本都做了什么。以下只是列举比较重要的一些功能。

日志功能

  • 新增对接阿里云SLS日志插件

具体使用参考:shenyu.apache.org/zh/docs/plu…

  • 新增对接Elastic Search日志插件

具体使用参考:shenyu.apache.org/zh/docs/plu…

  • 新增对接Apache RocketMQ日志插件

具体使用参考:shenyu.apache.org/zh/docs/plu…

  • 新增对接Apache Kafka日志插件

具体使用参考:shenyu.apache.org/zh/docs/plu…

新功能

新增 mock 插件。

为请求指定响应状态码和响应体方便进行测试。 支持设置请求的响应状态码和响应体。 支持配置 ${int|min-max} , ${double|min-max|format} , ${email} , ${phone} , ${zh|min-max} , ${list|[arg1,arg2...]} , ${array|item|length} 等占位符自动生成数据。

具体使用参考:shenyu.apache.org/zh/docs/plu…

用户也可以自定义开发其他占位符:

具体开发:shenyu.apache.org/zh/docs/dev…

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:github.com/apache/shen…

新增 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全量参数配置。满足用户的个性化配置

具体可以参考:shenyu.apache.org/zh/docs/use…

新增匹配缓存策略。流量匹配效率为 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线程池,重写队列等等。具体可以查看如下代码:

image.png

管控平台

  • 数据存储新增支持 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

image.png

Apache ShenYu 一款使用 Java Reactor 开发的响应式 API 网关。以其高性能,动态灵活的流量管控,热插拔,易部署等特性,开箱即用为用户提供整套全生命周期的 API 网关,包含 API 注册、服务代理、协议转换与 API 治理等功能。于2022年7月毕业成为Apache顶级项目。