Skip to main content

【Apache ShenYu 2.5.1 版本发布】

· One min read

春节刚过,Apache ShenYu便迎来了2.5.1版本。此次发布内容,共有 259 个pull Request,64位贡献者的参与。新增了若干功能,修复了bug,优化了若干内容。

新功能

  1. 添加 brpc 插件
  2. 支持nacos不同命名空间
  3. 优化 mock 插件
  4. 注册中心实例支持eureka
  5. 支持 API 文档
  6. 添加 sentinel 插件的规则处理参数
  7. 添加 e2e 测试引擎
  8. 添加 casdoor插件支持SSO
  9. 添加 logging-tencent-cls 插件
  10. 添加 logging-clickhouse 插件
  11. 添加 logging-pulsar 插件
  12. 添加 key-auth 插件

增强

  1. 优化 motan 客户端注解
  2. 优化 motan 插件配置
  3. 优化 websocket 客户端注解
  4. 优化 springcloud 客户端注解
  5. 优化 springmvc 客户端注解

重构

  1. 重构 API文档的mock请求
  2. 重构 logging-clickhouse 插件
  3. 优化 dubbo相关maven依赖
  4. 重构 sign 插件
  5. 更新 ShenyuExtConfiguration
  6. 移除不必要的单例
  7. 修复并发场景mock数据
  8. 重构 sdk 测试
  9. 重构 DefaultSignService
  10. 重构 shenyu-admin 规则
  11. 优化 ShaUtil
  12. 优化缓存
  13. 修复 ConcurrentModificationException
  14. 修复 etcd 数据同步
  15. 重构 sdk 客户端
  16. 优化请求超时
  17. 重构日志模块
  18. 重构 springcloud 客户端
  19. 重构 Motan插件
  20. 重构 admin 数据同步
  21. 重构 tars 客户端
  22. 重构 alibaba-dubbo 客户端
  23. 重构 springmvc 客户端
  24. 重构 admin 配置
  25. 优化随机算法
  26. 重构负载均衡算法
  27. 重构 logging-kafka 插件

错误修复

  1. 移除多余的 cookie 设置
  2. 修复 appAuth 删除逻辑
  3. 修复 Cryptor-Request 插件
  4. 修复 ext 插件
  5. 修复升级脚本
  6. 修复 Nacos 注册空指针问题
  7. 修复 sandbox json 解析
  8. 修复插件更新时的异常
  9. 修复 postgresql 脚本
  10. 修复 sentinel 插件的异常
  11. 修复 TencentClsLog异常
  12. 修复更新密码异常
  13. 修复选择器分页异常
  14. 修复 request 插件异常
  15. 修复 RateLimiter插件并发处理异常
  16. 修复 sign 插件异常
  17. 修复 context-path 插件异常

特别感谢以下贡献者对 2.5.1版本的支持和参与(排名不分先后)。

dragon-zhang, zhengpeng, mahaitao, 愿凌飞, hdgaadd, dayu, SongTao Zhuang, Misaya295 , Shawn Jim , yunlongn , Will , moremind , RayayChung , Kevin Clair , huanccwang , 柯杨 , Kunshuai Zhu , fantiq , youzipi , class , kyeongsun , 杨阳洋 , Liming Deng , 杨文杰 , xcsnx , hnxiaoyuan , dependabot , xiaoyu , wzhangNJ , Zihao Huang , ywj1352 , pandaapo , WuLang , Nineteen , kyeongsun , ableYang , Runqi Zhao , WeiS , Luke.Z , lahmxu , Sinsy , Daming , BoyuLi4 , jakiuncle , Bowen Li , huanccwang , gitchenjh , DamonXue , Wu Daifu , Jiageng , nuo-promise , Guocheng Tang , likeguo , Sixh-PrFor , throwable , renzhuyan , wangteng , qinghai777 , zly123987123 , 奕仁 , 尔等同学 , qifanyyy , Jairo , ousinka

【从在校生到Apache Committer之路】

· One min read
朱坤帅

个人介绍

姓名:朱坤帅

学校:东北大学

角色: Apache ShenYu Committer

邮箱:jooks@apache.org

接触开源

大二下学期,一个偶然的机会,我看到了中科院软件研究所和openEuler社区举办的开源软件供应链点亮计划(下文简称开源之夏)的宣传。后来慢慢地了解到,原来在中国有那么多人活跃在开源社区,极大推动了开源生态的发展。之后也是非常巧合,认识了Apache ShenYu的VP (肖宇),他是我在开源之夏Apache ShardingSphere社区的导师。我提前完成开源之夏的任务之后,看到ShenYu刚进入Apache孵化器没多久,如火如荼,于是就开始接触到了Apache ShenYu。

在社区中成长

我最早给ShenYu提交的贡献并不是代码,而是文档。当时在官网发现了几个typo,于是果断提交了pr,“混”到了ShenYu的Contributor。

后来参与了社区的例会后,发现了ShenYu作为一个Apache孵化器项目,其实还存在着许多待优化、待丰富的地方。于是,我就从集成测试入手,开始了打怪升级之旅。

事实上,做集成测试能学习到的东西非常多,从Docker、CI到ShenYu的功能实现细节、微服务生态等等。有时在测试时会发现官网文档的不恰当之处,于是就需要自己阅读源码,理解代码逻辑,然后完善或更正文档;有时会发现一些bug,于是就能在定位bug、修复bug中熟悉ShenYu网关的细节。再到后来,逐渐可以自己实现一些new feature。

在对ShenYu项目越来越熟悉的同时,对ShenYu的敬畏感也越来越高,确实有种钻之弥坚的感觉。ShenYu中的设计模式、异步编程、函数式编程等都是非常巧妙,值得学习。

在开源中收获

回顾参与开源以来的近半年,感觉自己收获颇丰,主要体现在以下几方面。

  1. 技术水平的提升。参与开源不仅能接触很多在学校学不到的知识,同时也可以看到自己曾经学过的“屠龙武术”的实践场景。Apache ShenYu作为API网关,是整个微服务系统的入口,在参与项目建设的同时,自然会接触到各种微服务领域的知识。

  2. 开拓了视野。亲身经历项目new feature的讨论,参与ApacheCon、开源年会这类活动,使得我对微服务生态以及发展趋势有了更系统的理解和思考。

  3. 对求职面试的帮助。在个人简历上多出了开源经历这一项,在我找实习的面试中,确实有一定帮助,也得到了面试官的肯定。

给新人的一些建议

  1. 适应异步的交流方式。与我们平时的交流方式不同,开源社区往往使用的是异步的交流方式,比如邮件列表、GitHub issue、Jira等,而Apache ShenYu社区推荐的交流方式的优先级是:邮件列表 > Github issue > 微信群。这是因为通过邮件列表和github的方式,可以将问题的讨论过程和结果保留下来,是公开透明的。从另一个角度看,在邮件列表抛出问题,往往能得到最迅速且有效的解决。

  2. 积极参与讨论。社区胜于代码,这是Apache Way提倡的。通过充分的交流讨论而来的代码,更富有生命力。另外,Apache ShenYu社区每两周会召开一次线上例会,会对社区的工作做出周期性总结,以及讨论之后的目标、任务(同时也会发布到邮件列表)。

  3. 如何参与贡献?首先是经过上面说的讨论,然后才是动手。对于在工作中没有应用到ShenYu的人来说,编写集成测试、源码解析文章是非常好的切入点。同时,Apache ShenYu社区还时常会发布很多或易或难的任务,都期待大家的参与。

  4. 给想参与开源但还未动手的在校学生的建议。大胆参与开源吧,在我接触到的几个开源社区中,对学生都是更加友好、期待且包容的。另外,一些组织会举办专门引导学生群体参与开源的活动,比如开源之夏(前面提到的)、GSoC(谷歌编程之夏)等,也是非常不错的参与方式,不仅会有丰厚的奖金,还能结识很多小伙伴和技术大佬。

【从用户到Committer,别样体验和收获】

· One min read
qicz

新晋Committer介绍

大家好,我是qicz,非常荣幸收到Apache ShenYu社区的邀请成为Apache ShenYu的Committer。我是一个“杂牌”程序设计师。杂牌,是因为那年那月自己也是创业一份子,那时候常常不得不选择不同的程序设计语言,以此练就杂牌大法,这过程中也有更多的机会可以去了解和接触很多品种的项目。我也是一个开源爱好者,喜欢“玩代码”,也因此会常在开源社区得瑟,个人一直秉承着开源理念,也搞过好几个开源项目。在社区常有很多好玩的有意思的开源项目,而Apache ShenYu就是其中之一。下面,我简单的跟大家分享一下,在参与Apache ShenYu社区这段时间的感受。

一、心路历程

​ 了解到Soul是很早的时候了,正式接触Apache ShenYu是今年9月份的时候,那时刚收到了公司的网关需求,需要很短的时间掌握且要出东西。

​ 对于网关类项目,之前也有研究过比如Spring Gateway, Kong等。经过这段时间的研究并不断的参与到Apache ShenYu项目中,对它的设计理念非常的认可——插件化,所有的一切都是基于插件完成的。虽然类似Kong这样的网关也是支持插件的,但是lua搞起来是真的不好玩啊。另外一个就是Apache ShenYu的文档也是非常的丰富,把核心的设计,还有一些插件的原理都讲解的非常细致。Apache ShenYu是Java实现的,作为杂牌设计师,我还是很稀饭的。但尽管如此,研究它也真的是很痛苦的,第一次看到Apache ShenYu的源码时就非常的头大,那模块分的又细又多。

​ 万事开头难吧,有了好的开头可能就顺利了。我的开头是关于crossfilter的处理,把写在代码中的配置放到外置的配置文件中去。回想第一次提交pr的过程,真的是太磨人了,直到现在都觉得太痛苦了。

二、提供Pull Request

​ 首先,所有的issue,pr,email都要使用英文。有些时间没有用英文写东西了,很多时候自己写了,都不敢相信和确定自己写的是不是有问题,估计很多时候都搞了中式英文了。不过以自己多年创业经验来说,一切都是纸老虎,很多时候只要坚持做下去,就会越来越好了。直到现在,不断的使用英文整理各类东西,已经越来越游刃有余了。乐哉!美哉!妙哉!

​ 另一个,每次提交pr的checkstyle和test,也是很磨人。因为源码有很严格的规范,从注释到换行,到标点都有要求。从上大学开始接触程序设计,因为导师要求我们必须注意编码风格,所以直到今天一直严格要求自己的编码,不断的操练我的代码洁癖技能。自认为自己的编码很规范了,但是在第一次pr的时候是真的被打败。一方面是流程也不是很清楚,再者因为模块非常多,本地打包checkstyle非常慢,而很多问题需要完整的执行打包流程才能暴露。记得最久的一次,既然花了差不多2个小时。

​ 这过程是真的太痛苦了。不过经过多次的尝试,第一个pr成功了。艰难的开头算是结束了。但是从个人角度是非常支持和赞成的,如果没有这样的细致的要求,何以更好的建设这项目和社区,并以此为基础去帮助和服务更多的小伙伴。

三、社区与公司结合

​ 在不断对接公司的需求的过程中,对Apache ShenYu的研究也在不断的深入。开始做一些定制的开发,这过程中又不断的发现了其他的bug,于是有了第二个第三个和更多个pr。这过程中,很多时候是周末或者熬夜完成的,是真的很累,但还是非常有成就感的,尤其自己的pr解决了实际的需求,同时得到的社区的认可的时候,真的是成就感满满的。

​ 随着时间的推移,现在对Apache ShenYu已经有很深刻的认识,在未来自己也会尽全力在闲暇投入到社区的建设中,集合实际的需求,不管完善和丰富各类特性的设计和研发,坚持开源的初衷——源自社区回馈社区,为社区做出更多的贡献,与社区一同成长。

【Apache ShenYu(incubating)新晋PPMC】

· One min read
刘良

新晋PPMC介绍

社区贡献

  • 深度参与Apache ShenYu插件体系的开发(GRPC插件等)。

  • 践行Apache Way,活跃在社区,帮助他人,积极参与源码活动与官网文档建设。

社区体验

  • 社区大于代码:营造好一个好的社区氛围是很重要的,比写代码还要重要。Apache ShenYu(incubating)社区也在不断的改进,不断的完善,尽可能的让新人参与进来,降低门槛。

  • 决策透明公开:不论是社区发展,还是功能开发,还是用户问题都会以邮件列表公开并存档。

  • 平等与尊重:专注于技术社区的交流,你的贡献决定你的权威。

  • 开阔视野:不满足于日常工作中的CRUD,参与开源,你的代码会被review,看看什么是好的代码,了解更多开源项目,提升个人技术能力。

  • 贡献无大小:不论你是完成了核心功能开发,还是编写测试案例,还是建设官网,修改文档,这些贡献都是一样的,都会得到社区的认可。

【从用户到Committer,参与Apache ShenYu社区并不遥远】

· 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开始,逐步参与到社区的贡献中来。
  • 大胆提出你的想法,不管是代码结构、新的功能、使用上的疑问,都可以提出。贡献的形式不只限于代码,还包括文档、积极参与功能的讨论、帮助其他朋友解答疑问等等。
  • 积极关注社区,领取社区发布的任务,对于实现上的疑问可以多与社区其他同学沟通。

【发布Apache首个版本-2.4.0】让API网关变得简单

· One min read
xiaoyu

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

【毕业一年我是如何成为Apache ShenYu Committer】

· 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代码,只要坚持参与,就能获得提升。也许你不能像面对工作那样全部投入,但只要利用好业余时间,长期坚持,一样也能成功。

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

【Soul 网关发布里程碑的2.3.0版本】新增支持GRPC,Tars,Sofa协议

· One min read
xiaoyu

距离上一次发布长达半年之久,在这半年的时间里,我与我的社区小伙伴们,做了太多太多的事情。 完成了将近 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网关,或者享受开源的乐趣,结识很多优秀的朋友,欢迎大家加入我们的社区。