Apache ShenYu 集成 RocketMQ 实时采集海量日志的实践

本文介绍了Apache ShenYu作为一个高性能API网关的流量治理特性,并展示了如何利用RocketMQ进行实时日志采集。ShenYu支持多种协议,具备插件化设计,通过选择器和规则实现灵活的流量筛选。集成RocketMQ能实现日志削峰填谷和系统解耦,确保高并发场景下日志的可靠传输。文章还详细阐述了日志采集的实现细节,包括采样策略和异常处理,以及如何通过RocketMQ实现日志的高效处理和可视化分析。

本文作者:胡泰室, 快手Java开发工程师。

认识Apache ShenYu(神禹)

网关最重要的是流量治理,而流量治理与大禹治水有很多相似的地方,因此,网关的流量治理项目被命名为神禹。

ShenYu是一个高性能、多协议、易扩展、响应式的 API 网关,主要特性包括丰富的协议、插件化、流量治理和高性能。

ShenYu支持 HTTP、Spring Cloud、gRPC、Dubbo、Sofa、Tars、Motan 等协议。为了保证可扩展性,ShenYu采用了插件化的设计,支持热插拔,内置丰富的插件。插件化设计最大的好处为可扩展性强,ShenYu大量的流量治理功能都各自对应了不同的插件。ShenYu支持鉴权、限流、熔断、安全、负载均衡、灰度、动态上游、可观测性等丰富而灵活的流量管理。由于网关对性能要求特别高,ShenYu采用了响应式全链路异步,支持集群部署、蓝绿发布等。

客户端发起请求经过网关,再由网关将请求转换到服务提供者,并将服务提供者的响应发送给客户端。

从发起请求的角度来看架构,它支持多语言,不限操作平台。HTTP 请求首先经过一层代理层,代理层可以是 Nginx、ShenYuNginx、ShenYu代理或 K8s,将请求通过负载均衡路由到ShenYu集群中的节点上。ShenYu网关接收到请求之后,首先对请求进行筛选。网关为了保证性能,将各种元数据都存储在本地内存中,再配合高效的算法来实现高性能。

数据的请求处理离不开元数据,而元数据的获取主要依靠ShenYu网关与ShenYu后台的同步机制,在ShenYu admin 后台进行数据变更后,比如插件变更、选择器变更、规则变更、数据变更等,会通过一定的方式将变更同步到ShenYu网关中。

用户可以根据项目特点选择拉取或推送的同步方式。首先要对流量进行筛选,可以根据请求的 URL 查询参数、请求头、请求参数、host或请求 Body 等进行匹配。匹配的条件可以是 like、match、正则表达、包含或排除等,再通过 SPI 的方式来加载对应的实现。

如果流量匹配,则将流量转发到各个插件。各个插件形成插件链,每一个插件链对于匹配的流量会执行其插件功能。最终请求会经过出口插件转发到服务提供者,然后将服务提供者的响应转交给客户端。

对于网关运行状态的监控是非常重要的模块,可观测性指标loggin的请求量可能非常大,导致日志量也很大,这种情况一般需要集成消息队列。

ShenYu的流量筛选流程如上图所示,每个请求都有一定的元数据,可以根据这些元数据进行匹配来筛选出需要的请求。ShenYu的流量筛选有两个非常重要的组件,分别是选择器和规则。

请求到达后,首先判断插件是否开启,如果未开启,则不予处理;如果已开启,则插件对应的选择器会判断请求是否匹配。如果请求匹配,则将交给规则再进行一次匹配;如果不匹配,则交给下一个插件进行处理,匹配则执行插件。

选择器相当于一级匹配,是一种粗粒度的匹配,而规则相当于二级匹配,是一种细粒度的匹配,这样的设计能够保证更高的灵活性。

插件形成了一条插件链,前一个插件执行完后再决定是否交由下一个插件进行处理。

### Apache ShenYu 的功能介绍 Apache ShenYu 是一款高性能、分布式 API 网关,支持多种插件扩展和动态路由配置。它于 2022 年 7 月 28 日正式成为 Apache 软件基金会的顶级项目 (TLP)[^1]。该网关不仅适用于传统的单体架构,还特别针对微服务和云原生环境进行了优化。 #### 主要特性 - **多协议支持**: 支持 HTTP、Dubbo、gRPC 和 WebSocket 等主流通信协议。 - **动态路由管理**: 提供灵活的动态路由规则配置能力,能够实时调整流量分配策略[^3]。 - **插件化设计**: 基于插件机制实现功能模块化开发,便于用户按需加载所需组件。 - **监控与日志分析**: 集成了完善的性能监控体系以及详细的请求日志记录工具[^4]。 #### 安装部署方式 为了满足不同场景下的需求,ShenYu 提供了多样化的安装方案,其中包括但不限于本地单机模式、Docker 容器化运行以及 Kubernetes 集群编排等选项。对于希望快速上手的新手来说,推荐通过 Docker 来完成初始设置过程。 以下是利用 Docker 运行 Apache ShenYu 的基本命令片段: ```bash docker run -d --name shenyu-admin \ -p 9095:9095 \ -e SPRING_DATASOURCE_URL=jdbc:mysql://your-mysql-host:3306/shenyu?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC \ -e SPRING_DATASOURCE_USERNAME=root \ -e SPRING_DATASOURCE_PASSWORD=password \ apache/shenyu-admin:latest ``` 上述脚本会启动一个包含默认数据库连接参数的服务实例,并将其绑定到主机端口 `9095` 上监听外部访问请求。 另外值得一提的是,除了核心网关之外,整个生态系统还包括图形界面控制台 (`shenyu-dashboard`) 及配套的数据同步中间件 (`shenyu-watcher`) ,它们共同构成了完整的解决方案框架[^5]。 ### § 1. 如何自定义 Apache ShenYu 中间件插件? 2. 在生产环境中应该怎样规划 Apache ShenYu 的高可用集群架构? 3. 是否可以将现有的 Zuul/Nginx 应用迁移到 Apache ShenYu?如果可行的话具体步骤有哪些? 4. 对比其他同类开源产品如 Kong 或 Traefik , Apache ShenYu 存在哪些独特优势? 5. 当前版本是否存在已知的安全漏洞或者稳定性风险需要注意的地方吗 ?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值