Skip to main content

One post tagged with "Apache ShenYu"

View All Tags

· One min read

新晋Committer介绍

大家好,我叫唐震,目前在多点Dmall中间件工作,工作方向是分布式任务调度和消息中间件。非常荣幸收到Apache ShenYu社区的邀请成为Apache ShenYu的Committer,下面跟大家分享一下我参与Apache ShenYu社区这段时间的成长和建议。

一、初识Apache Shenyu社区

​ 今年年初,我在调研API网关期间了解到Apache ShenYu网关(以下以ShenYu指代Apache ShenYu (incubating))。ShenYu有着高性能、多协议、易扩展、响应式的特性,并且已经提供了多种插件,开箱即用,非常有潜力,就想着学习一下。

​ ShenYu除了官方提供的文档之外,还有很多社区的小伙伴提供的源码解析,在快速使用的基础上也能快速了解实现原理。社区十分活跃,大家积极上报和主动修复遇见的bug,一起讨论新的想法,帮助新朋友融入社区。起初使用时遇到的问题,提出issue或者在社区交流区中咨询都会有社区的朋友积极解答疑惑。这些文档和社区朋友们帮助我快速的上手ShenYu网关,同时也让我感受到ShenYu社区友好积极的氛围。

二、开源并不遥远

​ 在刚开始阅读ShenYu源码的时候,看到一处代码有点冗余,可以进行精简,基于此我想建立一个issue,又担心这个优化太小不会被社区接纳。纠结了一下,还是参照之前的issue格式建立了一个issue表达我的想法。一小会儿就收到了社区的反馈,鼓励我提交PR来优化这段代码。我跟着社区的贡献指南,一步一步的完成了这个小优化,新的PR很快就合并了,并在Contributor列表中看到了自己。这是从普通用户向Contributor的转变,虽然很简单,但是对自己的激励很大,也让我感受到开源并不遥远。

​ 这之后,我对ShenYu的代码越来越熟悉,各个模块之间的关系脉络也逐渐梳理清楚,我从项目中学习到了不少优雅的设计思想,期间偶尔会发现一些bug、可以优化的代码和功能,我主动提出issue修复和完善这些问题,社区的Committer每次都会非常细致的review代码,给出一些改进的建议。后面我也参与了社区官网的建设,编写和完善相关文档。

​ ShenYu社区是开放、包容的,经常会发布一些任务,其中就有很多适合新手的任务,其实是为了帮助更多的同学融入到社区来,大家可以关注社区的邮件、issue、微信交流群等领取任务,有一个目标去完成,也能更快的熟悉项目。同时,社区有开放的周例会,大家都可以参加,能够了解到ShenYu目前的功能开发进度,以及社区后续的规划。

​ 在成为Committer后,除了继续跟进处理社区的issue外,我会也更多地主动思考和参与到一些新功能的开发中来,努力为社区做出更多的贡献,与社区一同成长。

三、给新人的一些建议

对于希望参与到开源的朋友,以下有一些小的建议:

  • 从官方文档开始,先把项目的主要功能使用一下,有一个整体的认识。然后在参考社区的一些源码解析文章,了解内部实现的细节。刚开始可能会有一些小困难,可以从简单的小issue开始,逐步参与到社区的贡献中来。
  • 大胆提出你的想法,不管是代码结构、新的功能、使用上的疑问,都可以提出。贡献的形式不只限于代码,还包括文档、积极参与功能的讨论、帮助其他朋友解答疑问等等。
  • 积极关注社区,领取社区发布的任务,对于实现上的疑问可以多与社区其他同学沟通。

· One min read

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

声明:本文中的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 CloudGRPCMotanSofaTars 等。 同时内置十分丰富的功能插件,如 熔断限流鉴权黑白名单防火墙监控参数更改等等插件。其架构图如下:

流量控制

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

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

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

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

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

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

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

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

流量筛选

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

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

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

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

其过程图如下 :

数据同步与缓存

为了提升网关的性能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 CloudGRPCMotanSofaTars 等协议的转换,未来将支持 TCP, MQTT,MQTT 等协议。

Divide插件

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

<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插件将其设置为 开启,并且配置上注册中心, 更详细的介绍请看 : https://shenyu.apache.org/zh/projects/shenyu/dubbo-proxy/

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

SpringCloud插件

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

 <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插件将其设置为 开启。 更详细的介绍请看 :https://shenyu.apache.org/zh/projects/shenyu/grpc-proxy/

 <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插件将其设置为 开启。 更详细的介绍请看 : https://shenyu.apache.org/zh/projects/shenyu/tars-proxy/

  <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插件将其设置为 开启,并且配置上注册中心。 更详细的介绍请看 : https://shenyu.apache.org/zh/projects/shenyu/sofa-proxy/

  <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插件将其设置为 开启。 更详细的介绍请看 : https://shenyu.apache.org/zh/projects/shenyu/hystrix-plugin/

<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插件将其设置为 开启。 更详细的介绍请看 : https://shenyu.apache.org/zh/projects/shenyu/sentinel-plugin/

<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插件将其设置为 开启。 更详细的介绍请看 : https://shenyu.apache.org/zh/projects/shenyu/resilience4j-plugin/

<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。 更详细的介绍请看 : https://shenyu.apache.org/zh/projects/shenyu/rate-limiter-plugin/

<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插件将其设置为 开启。 更详细的介绍请看 : https://shenyu.apache.org/zh/projects/shenyu/waf-plugin/

<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插件将其设置为 开启。 更详细的介绍请看 : https://shenyu.apache.org/zh/projects/shenyu/sign-plugin/

<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插件将其设置为 开启。 更详细的介绍请看 : https://shenyu.apache.org/zh/projects/shenyu/jwt-plugin/

<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插件将其设置为 开启。 更详细的介绍请看 : https://shenyu.apache.org/zh/projects/shenyu/oauth2-plugin/

<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插件将其设置为 开启。 更详细的介绍请看 : https://shenyu.apache.org/zh/projects/shenyu/rewrite-plugin/

<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插件将其设置为 开启。 更详细的介绍请看 : https://shenyu.apache.org/zh/projects/shenyu/redirect-plugin/

<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插件将其设置为 开启。 更详细的介绍请看 : https://shenyu.apache.org/zh/projects/shenyu/request-plugin/

<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插件将其设置为 开启。 更详细的介绍请看 : https://shenyu.apache.org/zh/projects/shenyu/context-path-plugin/

<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插件将其设置为 开启。 更详细的介绍请看 : https://shenyu.apache.org/zh/projects/shenyu/param-mapping-plugin/

<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插件将其设置为 开启。 更详细的介绍请看 : https://shenyu.apache.org/zh/projects/shenyu/modify-response-plugin/

<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相关参数。 更详细的介绍请看 : https://shenyu.apache.org/zh/projects/shenyu/monitor-plugin/

<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插件将其设置为 开启。 更详细的介绍请看 : https://shenyu.apache.org/zh/projects/shenyu/logging-plugin/

<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 > 微信群的沟通优先级的原则。 主要的目的是让每一个问题,没一个观点,都有记录存档,更好的帮助他人,以推进社区的可持续发展。

· One min read

新晋Committer介绍

大家好,我叫刘良,目前在招银网络科技担任软件开发工程师。非常荣幸收到Apache ShenYu社区的邀请成为Apache ShenYu的Committer,下面跟大家分享一下我参与Apache ShenYu社区这段时间的成长和建议。

了解开源

去年毕业后,觉得自己的技能还远远不够,所以平常也在不断学习。在学习的过程中,有一位老师提供了参与开源项目的机会。刚开始的想法是:参与开源项目可以提升自己的技能,也利于找工作,抱着这样的想法就加入其中了。

参与的开源项目是Apache ShenYu(incubating),这是一个异步的,高性能的,跨语言的,响应式的 API 网关。在社区交流群中,里面有好多积极的同学,大家积极的讨论Issue和自觉发现Bug。

参与开源

我第一个任务是添加测试案例。任务通常是以issue的形式发布,如果你感兴趣,就在issue下面进行回复。幸运的是,官方社区提供了一个操作文档,按照上面的步骤来做就可以,主要是fork项目到自己的仓库,然后拉到本地,在本地创建对应的issue分支,然后才是实际写代码的过程。

第一个任务是为实体类写单元测试,这个也不知道咋弄,也觉得奇怪,实体类还需要写单元测试?那就只能开始上网google了,解决办法是通过反射调用get/set方法,完成之后就将自己写完的代码提交上去了,并且被合并了。这就是我在开源项目中贡献的自己的第一个pr,从此我也是开源项目的贡献者了,哈哈哈。

后面又做了其他的任务。第二次做的时候,又回头看了下自己第一次提交的代码,发现跟我提交上去的不一样了,查看了下git的提交记录,发现自己的代码被committer重构了。仔细看了下自己的代码和重构后的代码,发现:嗯,这样写法是要更优雅一些,学习了,默默膜拜大佬。

在持续的参与过程中,对Apache ShenYu(incubating)项目有了更深的理解,对开源文化也有了更多认识。

Apache ShenYu(incubating)的committer会经常通过邮件、issue、社区群发布任务。我注意到有一个关于gRPC优化的功能还没有人做,然后准备就去领这个任务。但是,到现在我还记得,在当时还是犹豫了很久,这个功能是要做啥都不知道,我能搞定吗?gRPC都没有用过,我还能去优化?在不断的怀疑和否定自己中......这个功能是项目中比较核心的一块,机会难得,要不先试试?最后,终于踏出了一步,去完成这个任务。

接下来的过程,就是如何解决这个问题。这是一个很具体的技术问题,就不展开了,主要说说自己的感受。遇到问题,要先分析分析,这个问题具体是什么,要从哪儿开始解决,现有的方案为什么不行,最后要达到什么结果,还要多与其他人沟通。我在解决这个问题的时候,也经常在跟Apache ShenYu(incubating)的PPMC沟通,讨论自己的方案是否可行。在调研分析的过程中,也时时打退堂鼓,因为这个问题对我来说,还不太好做。不过,Apache ShenYu(incubating)的PPMC也一直在鼓励我:这个没有时间限制,你可以慢慢研究,不明白的地方,还可以跟大家讨论。就这样,一步步的做,不断请教,最终还是解决了这个问题,提交的代码被项目成功合并。

再到后面,开始参加Apache ShenYu(incubating)的周例会,了解其他人在做什么,了解接下来的发展计划,也了解到了更多的开源文化。自己也在Apache ShenYu(incubating)的官网建设中做出了更多的贡献。

在Apache ShenYu(incubating)社区的体验

前面一直在讲述自己的开源经历,其实这也是个人的真实内心活动,也是一个成长的过程。自从接触到开源以来,慢慢的感受到了开源的更多魅力,Apache ShenYu(incubating)社区的良好氛围。

  • 社区大于代码:营造好一个好的社区氛围是很重要的,比写代码还要重要。Apache ShenYu(incubating)社区也在不断的改进,不断的完善,尽可能的让新人参与进来,降低门槛;
  • 决策透明公开:不论是社区发展,还是功能开发,还是用户问题都会以邮件列表公开并存档;
  • 平等与尊重:专注于技术社区的交流,你的贡献决定你的权威;
  • 开阔视野:不满足于日常工作中的CRUD,参与开源,你的代码会被review,看看什么是好的代码,了解更多开源项目,提升个人技术能力;
  • 贡献无大小:不论你是完成了核心功能开发,还是编写测试案例,还是建设官网,修改文档,这些贡献都是一样的,都会得到社区的认可。

给新人的一点建议

如果有对开源感兴趣,但是还没有参与过的朋友,你们是否存在这些问题呢?

  • 自己提的问题太简单,会不会显得自己没有水平?不是的,大家就技术讨论,自己提出的问题准备充分,有更多背景信息,社区的人是很乐意回复你,给你解惑。
  • 新人不知道怎么参与?社区提供了相关文档,按照操作来,就可以参与进来。也有新手任务可以直接参与。
  • 没有时间啊?社区的发展都是个人投入,没有商业利益,成员都是空余时间参与其中,相信你也可以。
  • 问题太难,不能解决?多和社区的人讨论,这就是在提升自己的技能。

· One min read

个人介绍

大家好,我是段海波,github账号haibo-duan,非常荣幸收到Apache ShenYu社区的邀请成为Apache ShenYu的Committer,下面跟大家分享一下我参与Apache ShenYu社区这段时间的成长和建议。

初识Apache ShenYu

在去年的一次源码阅读活动中,我第一次听说了Dromara开源社区的Soul网关正式进入Apache基金会孵化器并改名叫ShenYu的故事。 由于ShenYu(神禹)是第一个以中国传统文化命名的开源项目,而如何命名又是程序员最头疼的事情,因此,在好奇心的驱使下,我关注了ShenYu的公众号。在此后,我了解到ShenYu不仅具备高性能、多协议、易扩展的特性,还提供了各种开箱即用的插件,抱着学习的心态,我在github上fork了ShenYu的源码,正好ShenYu官网的文档也非常丰富,许多文档对技术细节也描述得非常详细。 于是根据文档的描述,订阅了ShenYu的邮件,并尝试能否参与到社区的建设中来。

我的开源之路

在关注社区的过程中,有一次,社区组织了一次代码清洁活动,旨在对当前shenyu的代码进行清洁和优化。我看了一下这个task的要求并不难,于是,抱着试一试的心态,我按照代码规范对一些代码进行了优化之后,尝试提交了第一个PR。 万事开头难,实际上在第一个PR中需要学习的东西还是挺多的,包括PR的格式、代码的分支、以及提交的流程等。幸好这一切在贡献者指南中描述得非常详细。不过让我感触最深的就是ShenYu的checkstyle, 这是一个非常严格的规范,包括注释、空格都有要求,虽然我平时已经很注意代码规范了,但是一开始在这个checkstyle上也会有点小痛苦。 不过这个过程很快就会适应,毕竟,经过统一checkstyle之后的代码看上去让人极度舒适。

在有了从0到1的第一个PR之后,后续的过程就轻松很多了。我发现每次提交PR本地打包的过程中,最耗时的就是执行单元测试用例。我发现还有部分代码没有提供单元测试代码。因此,我决定从单元测开始参与,首先可以不用了解太多的源码,毕竟ShenYu数万行的存量代码也不是一两天就能掌握的。 此外,还能很快的看到结果。在写单元测试用例的过程中,不仅能发现源码中的bug,提升代码质量,还能更好的了解源码。

而恰好就在此时,工作上的一些问题也需要我对单元测试技术进行调研,当我了解到了junit5的新特性之后,我发现Shenyu采用的是junit4,于是我就有了一个大胆的想法,发邮件询问了ShenYu社区是否可以进行升级。在邮件中经过数轮讨论之后,我的提议被采纳,我也成为了这个task的负责人。而我在做这个任务的过程中,由于涉及的测试代码比较多,我分成了许多小的任务,也吸引了几位新的小伙伴一起加入。 此外,在做这个junit5升级的任务中,还发现了之前很多用例都用到了PowerMock,而在新版本的jdk中,PowerMock的兼容性存在问题。因此PowerMock也被移除掉了。

ShenYu社区是开放和包容的,在完成了这些任务之后,我对ShenYu的功能模块已经非常熟悉,除了能继续跟进社区的一些issue之外,还能够更多的结合自身的工作和经历去思考,并在周例会中提出自己的问题和想法。 恰在此时,我也收到了ShenYu社区的邀请,正式成为了committer,在我看来,成为Apache committer这不仅仅是一种荣誉,更多的也是一种责任。代表了社区的信任,需要更多的为社区做出贡献。成为Apache committer不是终点,仅仅是一个更高的起点。

我在Apahce ShenYu社区的体验

在过去这段参与开源的过程中,有非常多的收获,有如下几点心得,提供给大家参考:

  • 从小事做起:开源社区的贡献并并没有区分大小,无论是重大功能改进,还是一行文档错误,对社区而言,这都是贡献。因此,勿以善小而不为。只要是有价值的贡献,社区都是欢迎的。

  • 积极参与,持续贡献:开源是个积沙成塔的过程,也许一次的贡献有限,但只要积极参与社区活动,无论是邮件中的方案讨论还是Review代码,只要坚持参与,就能获得提升。也许你不能像面对工作那样全部投入,但只要利用好业余时间,长期坚持,一样也能成功。

  • 参与邮件讨论,大胆提出想法:开源社区最大的特点就是民主、开放和透明。在这里,任何想法和建议都会被充分重视。如果你有一个好想法,你只需要发送一封邮件,就能在社区里和大家一起讨论,你的邮件总会得到回复,所有的讨论都是公开的,你可以看到大家对你问题的讨论过程。而在很多时候,讨论问题的过程往往比解决问题本身更有价值。

· One min read

距离上一次发布长达半年之久,在这半年的时间里,我与我的社区小伙伴们,做了太多太多的事情。 完成了将近 200 多次PR,发表了将近300 篇文章的源码解析,新增贡献者 120 多位,晋升了 7 位committer,并且全部获得正版 jetbrains 全家桶。非常感谢他们,在他们的帮助下,我们完成了非常多非常多的功能。

soul-admin(dashboard)

admin是整个网关的控制面板,掌管所有的流量,规则的匹配。

  • 整合shiro框架,完成了用户按钮级别的权限控制。
  • 模板化插件,让用户无需感知前端页面,只专注于数据的配置。
  • admin整个后端的国际化,支持中英文切换。
  • 新增支持H2来存储数据。
  • admin界面的美观优化(表格,按钮)。
  • 新增单元测试,覆盖率达到百分之七十。

Soul 网关插件

插件新增

  • 新增GRPC插件,全面支持GRPC协议。
  • 新增Tars插件,支持腾讯 tars RPC协议。
  • 新增Sofa 插件,支持 sofa RPC协议。
  • 新增 Sentinel 插件,整合 sentinel框架的熔断限流功能。
  • 新增 Resilience4j 插件,整合 Resilience4j框架的熔断限流功能。
  • 新增 Rediect 插件,支持用户的重定向。
  • 新增 Context-path插件,支持用户自定义 context-path

插件优化

  • Divide 插件:节点探活方式的优化,流量预热方式的优化。
  • Ratelimiter插件:新增并发,漏桶等不同的限流算法,供用户选择。
  • Sign 插件:修复必须设置 url 的 bug,新增是否验证 标记,可以用来做开放平台的URI认证。
  • Dubbo插件:新增 form 表单,URI 参数请求, 新增注册中心直连,参数校验等功能。

Soul Client

soul-client只是提供一种快速接入网关的客户端,不是必须的。如果用户不使用,可以在soul-admin自行配置规则即可。
  • spring-mvc客户端的优化,支持springspring-boot所有版本。
  • spring-cloud客户端的优化,支持springspring-boot所有版本。
  • dubbo客户端的优化,支持springspring-boot所有版本。
  • 新增 soul-grpc-client 支持 grpc-java用户接入。
  • 新增 soul-tars-client 支持 tars-java用户接入。
  • 新增 soul-sofa-client 支持 sofa-java用户接入。
在之前的版本中,只支持http方式接入,而这次新增注册中心方式接入。

Soul 数据同步

  • 修复 Nacos 配置中心同步未设置 NameSpace 的Bug。
  • 优化 Websocket 同步方式。
  • 解决 soul-admin 集群部署时候,Http 长轮询方式同步数据 Bug。

鸣谢

这是一次具有里程碑意义的发布,也是 soul 网关,正式正规的一次变革,我们的 dashboard, 代码,文档, issue, PR 全部英文国际化,整个项目的单元测试覆盖率达到了百分之70。再次感谢你们的辛苦付出。虽然我们完成了非常多的功能(在上面我没有完全列举),但是在接下来,我们会有更多的挑战,我相信有你们在,这并不是我们的终点,而是我们腾飞起点。

加入我们

目前 soul 处于高速发展阶段,如果你追求写高质量的代码,或者想深刻的理解API网关,或者享受开源的乐趣,结识很多优秀的朋友,欢迎大家加入我们的社区。