Apache ShenYu(incubating) 2.4.0: 让API网关更简单

4,880 阅读9分钟

声明:本文中的Apache ShenYu 都指的是 Apache ShenYu (incubating) 本人作者:肖宇 Apache ShenYu(incubating) Founder && PPMC 2.4.0 Release Manager : 张永伦 Apache ShenYu(incubating) PPMC && Apache ShardingSphere PMC

所有的朋友们:

Apache ShenYu网关是原 Dromara/soul 网关捐献给Apache基金会后改名而来, 此次发布的 2.4.0 版本是 Apache ShenYu 网关进入Apache孵化器后的首个版本。这个版本涉及很多新功能的增加, 项目名称,包名以及maven依赖坐标的变更。

Apache ShenYu 是什么?

Apache ShenYu是使用Java reactor编程方式开发的,具有异步高性能跨语言等特性的 API 网关。 在流量控制方面,有精美的Admin控制台,能够精准动态控制流量,满足复杂的业务场景。 在功能方面,它使用插件化的设计思想,支持许多常见的协议:如 http/httpsDubboSpring CloudGRPCMotan SofaTars 等。 同时内置十分丰富的功能插件,如 熔断限流鉴权黑白名单防火墙监控参数更改等等插件。其架构图如下:

流量控制

对流量的控制是网关的灵魂,针对流量控制,Apache ShenYu 设计了选择器规则 2个概念,来控制流量。

选择器规则Apache ShenYu 网关中最灵魂的东西。掌握好它,你可以对任何流量进行管理。

一个插件有多个选择器,一个选择器对应多种规则。选择器相当于是对流量的一级筛选,规则就是最终的筛选。

对一个插件而言,我们希望根据我们的配置,达到满足条件的流量,插件才会被执行。

选择器和规则就是为了让流量在满足特定的条件下,才去执行我们想要的,这种规则首先要明白。

插件、选择器和规则执行逻辑如下,当流量进入到Apache ShenYu网关之后,会先判断是否有对应的插件,该插件是否开启;然后判断流量是否匹配该插件的选择器。

然后再判断流量是否匹配该选择器的规则。如果请求流量能满足匹配条件才会执行该插件,否则插件不会被执行,处理下一个。

Apache ShenYu网关就是这样通过层层筛选完成流量控制。其流程图如下 :

流量筛选

流量筛选,是选择器规则灵魂,对应为选择器与规则里面的匹配条件(conditions),根据不同的流量筛选规则,我们可以处理各种复杂的场景。

流量筛选可以从Header, URI, Query, Cookie 等等Http请求获取数据,

然后可以采用 Match=SpELRegexGroovy等匹配方式,匹配出你所预想的数据。

多组匹配添加可以使用And/Or的匹配策略。上述都是采用SPI的设计思想,用户可以自主进行扩展 :更多的请查看 : shenyu.apache.org/zh/projects…

其过程图如下 :

数据同步与缓存

为了提升网关的性能Apache ShenYu 网关会将所有的流量控制规则缓存在JVM 内存里面。在集群部署/分布式场景中,Apache ShenYu 自主研发了一套 将 Admin 控制台的数据,远程同步到每一个 Apache ShenYu 网关节点 JVM内存 的方案

每一种方案,采用 SPI 设计思想,以供用户灵活的选择。目前支持的方案有 HttpLongPull, Websocket, Zookeeper, Nacos, Consul, ETCD。 其整体流程如下 :

Admin控制台

为了方便用户快速便捷的控制流量以及网关的所有功能特性,Apache ShenYu 提供了 一个十分精美的Admin控制台,用户可以中英文切换,在这上面,可以随意的控制流量启停插件配置不同的参数与策略,这些操作更改通过上述的数据同步原理,同步到网关的 JVM内存。其后台示意图如下:

菜单/数据权限

网关的后台管理是十分重要的,为了针对企业级的用户,跨部门应用代理,Apache ShenYu设计了一整套的权限控制体系,它包含按钮级别的菜单权限,以及行数据级别的数据权限。并且这些权限控制在 Admin控制台 自主自动可配。

协议代理

协议代理是网关最核心的功能,目前 Apache ShenYu 支持 http 转成 http/httpsWebsocket,DubboSpring CloudGRPCMotan SofaTars 等协议的转换,未来将支持 TCP, MQTT,MQTT 等协议。

Divide插件

Divide插件,是用来专门代理 http/https/websocket 等方式请求 Apache ShenYu 网关的插件。 它具有 负载均衡流量预热, 节点发现超时重试超时控制 等功能。用户想要使用它,请在网关添加如下依赖, 然后在 Admin控制台 --> 插件管理 -->Divide插件将其设置为 开启。 更详细的介绍请看 : shenyu.apache.org/zh/projects…

<dependency>
   <groupId>org.apache.shenyu</groupId>
   <artifactId>shenyu-spring-boot-starter-plugin-divide</artifactId>
   <version>${project.version}</version>
</dependency>
<dependency>
   <groupId>org.apache.shenyu</groupId>
   <artifactId>shenyu-spring-boot-starter-plugin-httpclient</artifactId>
   <version>${project.version}</version>
</dependency>

Dubbo插件

Dubbo插件,是Apache ShenYu网关将 http/https 请求转换成 dubbo协议的插件 。 它采用了Dubbo泛化调用的机制,整合了 Dubbo的客户端,具有服务发现负载均衡 等功能。用户想要使用它,请在网关添加如下依赖, 然后在 Admin控制台 --> 插件管理 --> dubbo插件将其设置为 开启,并且配置上注册中心, 更详细的介绍请看 : shenyu.apache.org/zh/projects…

<!-- apache shenyu alibaba dubbo plugin start-->
<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-alibaba-dubbo</artifactId>
   <version>${project.version}</version>
</dependency>
<!-- apache shenyu apache dubbo plugin start-->
<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-apache-dubbo</artifactId>
   <version>${project.version}</version>
</dependency>

SpringCloud插件

SpringCloud插件,是Apache ShenYu网关代理 SpringCloud微服务业务的插件 。 它整合了 SpringCloud的注册中心,以及负载均衡服务,实现了服务的代理。用户想要使用它,请在网关添加如下依赖, 然后在 Admin控制台 --> 插件管理 --> SpringCloud插件将其设置为 开启。 更详细的介绍请看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-springcloud</artifactId>
   <version>${project.version}</version>
</dependency>

GRPC插件

GRPC插件,是Apache ShenYu网关将 http/https 请求转换成 GRPC协议的插件 。 它整合了 GRPC 客户端,实现了 GRPC服务的代理。用户想要使用它,请在网关添加如下依赖, 然后在 Admin控制台 --> 插件管理 --> GRPC插件将其设置为 开启。 更详细的介绍请看 :shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-grpc</artifactId>
   <version>${project.version}</version>
</dependency>

Tars插件

Tars插件,是Apache ShenYu网关将 http/https 请求转换成 Tars协议的插件 。 Tars是腾讯开源的 RPC框架, 该插件整合了 Tars-JAVA 客户端,实现了 Tars服务的代理。用户想要使用它,请在网关添加如下依赖, 然后在 Admin控制台 --> 插件管理 --> Tars插件将其设置为 开启。 更详细的介绍请看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-tars</artifactId>
   <version>${project.version}</version>
</dependency>

Sofa插件

Sofa插件,是Apache ShenYu网关将 http/https 请求转换成 Sofa-RPC协议的插件 。 它采用了Sofa泛化调用的机制,整合了 Sofa-RPC的客户端,具有服务发现负载均衡 等功能。用户想要使用它,请在网关添加如下依赖, 然后在 Admin控制台 --> 插件管理 --> sofa插件将其设置为 开启,并且配置上注册中心。 更详细的介绍请看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-sofa</artifactId>
   <version>${project.version}</version>
</dependency>

熔断限流

Hystrix插件

Hystrix插件,是Apache ShenYu网关整合Hystrix框架,提供请求熔断的功能,Hystrix熔断参数可动态化配置。用户想要使用它,请在网关添加如下依赖, 然后在 Admin控制台 --> 插件管理 --> Hystrix插件将其设置为 开启。 更详细的介绍请看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-hystrix</artifactId>
   <version>${project.version}</version>
</dependency>

Sentinel插件

Sentinel插件,是Apache ShenYu网关整合Sentinel框架,提供请求熔断限流的功能,Sentinel熔断限流参数可动态化配置。用户想要使用它,请在网关添加如下依赖, 然后在 Admin控制台 --> 插件管理 --> Sentinel插件将其设置为 开启。 更详细的介绍请看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-sentinel</artifactId>
   <version>${project.version}</version>
</dependency>

Resilience4j插件

Resilience4j插件,是Apache ShenYu网关整合Resilience4j框架,提供请求熔断限流的功能,Resilience4j熔断限流参数可动态化配置。用户想要使用它,请在网关添加如下依赖, 然后在 Admin控制台 --> 插件管理 --> Resilience4j插件将其设置为 开启。 更详细的介绍请看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-resilience4j</artifactId>
   <version>${project.version}</version>
</dependency>

RateLimiter插件

RateLimiter插件,是Apache ShenYu网关使用redis,提供请求集群限流的功能,限流算法策略有:令牌桶算法,并发限流漏桶算法滑动窗口算法。用户想要使用它,请在网关添加如下依赖, 然后在 Admin控制台 --> 插件管理 --> RateLimiter插件将其设置为 开启,并且配置上redis。 更详细的介绍请看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-ratelimiter</artifactId>
   <version>${project.version}</version>
</dependency>

安全/权限认证

Waf插件

Waf插件,是Apache ShenYu网关,用来对流量实现防火墙,主要用来拦截非法请求,或者异常请求,并且给与相关的拒绝策略,它提供了黑白名单配置的功能。用户想要使用它,请在网关添加如下依赖, 然后在 Admin控制台 --> 插件管理 --> Waf插件将其设置为 开启。 更详细的介绍请看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-waf</artifactId>
   <version>${project.version}</version>
</dependency>

Sign插件

Sign插件,是Apache ShenYu网关,用来对请求进行签名认证。用户想要使用它,请在网关添加如下依赖, 然后在 Admin控制台 --> 插件管理 --> Sign插件将其设置为 开启。 更详细的介绍请看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-sign</artifactId>
   <version>${project.version}</version>
</dependency>

JWT插件

JWT插件,是Apache ShenYu网关,是针对 http 请求头的 token 属性或者是 authorization 属性携带值进行鉴权判断,兼容 OAuth2.0。用户想要使用它,请在网关添加如下依赖, 然后在 Admin控制台 --> 插件管理 --> jwt插件将其设置为 开启。 更详细的介绍请看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-jwt</artifactId>
   <version>${project.version}</version>
</dependency>

OAuth2插件

OAuth2插件,是Apache ShenYu网关,使用 Webflux OAuth2客户端实现,用于支持 OAuth2 协议。用户想要使用它,请在网关添加如下依赖, 然后在 Admin控制台 --> 插件管理 --> oauth2插件将其设置为 开启。 更详细的介绍请看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-oauth2</artifactId>
   <version>${project.version}</version>
</dependency>

个性化处理

Rewrite插件

Rewrite插件,是Apache ShenYu网关,支持使用正则表达式来重写URI的插件。用户想要使用它,请在网关添加如下依赖, 然后在 Admin控制台 --> 插件管理 --> rewrite插件将其设置为 开启。 更详细的介绍请看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-rewrite</artifactId>
   <version>${project.version}</version>
</dependency>

Redirect插件

Redirect插件,是Apache ShenYu网关,将请求进行重定向的插件,支持网关内部接口与外部地址。用户想要使用它,请在网关添加如下依赖, 然后在 Admin控制台 --> 插件管理 --> redirect插件将其设置为 开启。 更详细的介绍请看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-redirect</artifactId>
   <version>${project.version}</version>
</dependency>

Request插件

Request插件,是Apache ShenYu网关容许用户对请求参数请求头 以及 Cookie 进行添加修改删除等功能。用户想要使用它,请在网关添加如下依赖, 然后在 Admin控制台 --> 插件管理 --> request插件将其设置为 开启。 更详细的介绍请看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-request</artifactId>
   <version>${project.version}</version>
</dependency>

Context-Path插件

Context-Path插件,是Apache ShenYu网关,容许用户对请求路径上的 Context-Path,进行 添加修改删除等功能。用户想要使用它,请在网关添加如下依赖, 然后在 Admin控制台 --> 插件管理 --> context_path插件将其设置为 开启。 更详细的介绍请看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-context-path</artifactId>
   <version>${project.version}</version>
</dependency>

Param-Mapping插件

Param-Mapping插件,是Apache ShenYu网关,容许用户对请求体中的 Body,进行 添加修改删除字段等功能。用户想要使用它,请在网关添加如下依赖, 然后在 Admin控制台 --> 插件管理 --> param_mapping插件将其设置为 开启。 更详细的介绍请看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-param-mapping</artifactId>
   <version>${project.version}</version>
</dependency>

ModifyResponse插件

ModifyResponse插件,是Apache ShenYu网关,用来对请求响应体中的 响应头,状态码响应内容,进行 添加修改删除等功能。用户想要使用它,请在网关添加如下依赖, 然后在 Admin控制台 --> 插件管理 --> modifyResponse插件将其设置为 开启。 更详细的介绍请看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-modify-response</artifactId>
   <version>${project.version}</version>
</dependency>

可观测性

Monitor插件

Monitor插件,是Apache ShenYu网关,使用 prometheus来完成对请求量QPS, JVM等相关metrics进行监控的插件。用户想要使用它,请在网关添加如下依赖, 然后在 Admin控制台 --> 插件管理 --> monitor插件将其设置为 开启, 并且配置 prometheus相关参数。 更详细的介绍请看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-monitor</artifactId>
   <version>${project.version}</version>
</dependency>

Logging插件

Monitor插件,是Apache ShenYu网关,容许用户日志中打印本次请求信息,包含 请求路径请求方法请求参数响应头响应体等信息。用户想要使用它,请在网关添加如下依赖, 然后在 Admin控制台 --> 插件管理 --> logging插件将其设置为 开启。 更详细的介绍请看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-logging</artifactId>
   <version>${project.version}</version>
</dependency>

下一个版本规划

  • RPC框架灰度发布增强,包含 SpringCloudGRPCDubboSofa-RPCTars等。

  • 新增ShenYu-Agent模块,打造网关metrics, tracing, logging 等可观测性体系。

  • 自定义插件动态加载,方便用户快速,不停机扩展与更新。

  • 集成测试 + 单元测试 全面覆盖。

社区

Apache ShenYu 是完全由国人主导的自主性社区开源项目,目前处在高速发展时期,功能开发文档完善BUG修复 等大量的事情需要完成。Apache ShenYu 社区遵循 Apache Way的社区理念,打造一个完全开放治理的社区。每半个月,会进行一次全体社区会议,社区的committers,contributors, users都会参与其中,在会议上大家可以畅所欲言,提出自己的观点和看法,比如对不同的功能,不同的代码进行讨论,最好达成一致性的观点。在Apache ShenYu 社区中,我们推崇邮件列表 > Github Issue > 微信群的沟通优先级的原则。 主要的目的是让每一个问题,没一个观点,都有记录存档,更好的帮助他人,以推进社区的可持续发展。

邮件订阅

  • 发送订阅邮件。

用自己的邮箱向dev-subscribe@shenyu.apache.org发送一封邮件,主题和内容任意。

  • 接收确认邮件并回复。

完成步骤1后,您将收到一封来自dev-help@shenyu.apache.org的确认邮件(如未收到,请确认该邮件是否已被拦截,或已经被自动归入订阅邮件、垃圾邮件、推广邮件等文件夹)。直接回复该邮件,或点击邮件里的链接快捷回复即可,主题和内容任意。

  • 接收欢迎邮件。

完成以上步骤后,您会收到一封主题为WELCOME to dev@shenyu.apache.org的欢迎邮件,至此您已成功订阅Apache ShenYu的邮件列表。

GitHub

Gitee

社区微信群