API网关框架ShenYu正式毕业成为Apache顶级项目

《开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐的是Java Reactor 开发的响应式 API 网关——ShenYu。

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


功能特性

  • 支持各种语言(http 协议),支持 Dubbo、 Spring Cloud、 gRPC、 Motan、 Sofa、 Tars 等协议
  • 插件化设计思想,插件热插拔,易扩展
  • 灵活的流量筛选,能满足各种流量控制
  • 内置丰富的插件支持,鉴权,限流,熔断,防火墙等等
  • 流量配置动态化,性能极高
  • 支持集群部署,支持 A/B Test,蓝绿发布

架构

脑图

模块

  • shenyu-admin : 插件和其他信息配置的管理后台
  • shenyu-bootstrap : 用于启动项目,用户可以参考
  • shenyu-client : 用户可以使用 Spring MVC,Dubbo,Spring Cloud 快速访问
  • shenyu-disruptor : 基于disruptor的封装
  • shenyu-register-center : shenyu-client提供各种rpc接入注册中心的支持
  • shenyu-common : 框架的通用类
  • shenyu-dist : 构建项目
  • shenyu-metrics : prometheus(普罗米修斯)实现的 metrics
  • shenyu-plugin : ShenYu 支持的插件集合
  • shenyu-spi : 定义 ShenYu spi
  • shenyu-spring-boot-starter : 支持 spring boot starter
  • shenyu-sync-data-center : 提供 ZooKeeper,HTTP,WebSocket,Nacos 的方式同步数据
  • shenyu-examples : RPC 示例项目
  • shenyu-web : 包括插件、请求路由和转发等的核心处理包


快速启动

运行ShenYu管理员:

> docker pull apache/shenyu-admin
> docker network create shenyu
> docker run -d -p 9095:9095 --net shenyu apache/shenyu-admin

运行引导程序:

> docker network create shenyu
> docker pull apache/shenyu-bootstrap
> docker run -d -p 9195:9195 --net shenyu apache/shenyu-bootstrap

设置路由器:

  • 真实请求: http: //127.0.0.1 :8080/helloworld
{
  "name" : "Shenyu",
  "data" : "hello world"
}
  • 设置路由规则

添加localKey: 123456到header。如果需要自定义localKey,可以使用sha512工具根据明文生成key并更新shenyu.local.sha512Key属性。

curl --location --request POST 'http://localhost:9195/shenyu/plugin/selectorAndRules' \
--header 'Content-Type: application/json' \
--header 'localKey: 123456' \
--data-raw '{
    "pluginName": "divide",
    "selectorHandler": "[{\"upstreamUrl\":\"127.0.0.1:8080\"}]",
    "conditionDataList": [{
        "paramType": "uri",
        "operator": "match",
        "paramValue": "/**"
    }],
    "ruleDataList": [{
        "ruleHandler": "{\"loadBalance\":\"random\"}",
        "conditionDataList": [{
            "paramType": "uri",
            "operator": "match",
            "paramValue": "/**"
        }]
    }]
}'
  • 代理请求:http://localhost:9195/helloworld
{
  "name" : "Shenyu",
  "data" : "hello world"
}


数据缓存和数据同步

由于所有数据都已在 JVM 中使用 ConcurrentHashMap 进行缓存,因此速度非常快。

当用户在后台管理中更改配置信息时,Apache ShenYu 通过监听 ZooKeeper 节点(或 WebSocket 推送、HTTP 长轮询)来动态更新缓存。


—END—

开源协议:Apache2.0

开源地址:
https://github.com/apache/shenyu