提到网关系统,大家第一个想到的肯定是Gateway或Zuul这些Spring Cloud给我们提供的组件,不过这些网关使用时都需要写代码。今天给大家分享一款可视化的网关系统Apache ShenYu,无需写代码即可使用,设计优秀,功能强大!
ShenYu简介
Apache ShenYu是一款异步的、高性能的、跨语言的、响应式的API网关,目前在Github上已有8.5k+Star
。
它具有如下特性:
- 支持多种代理协议:HTTP、Dubbo,Spring Cloud,gRPC,WebSocket,MQTT等
- 支持多种认证方式:Sign、OAuth2、JWT、BasicAuth、WAF等
- API治理:支持请求、响应、参数映射、负载均衡、熔断限流等功能
- 可视化管理:支持动态流量控制,权限管理、插件管理等功能
- 插件生态丰富:插件支持热插拔,动态加载
- 客户端:支持Java、Go、Python等客户端注册
下面是ShenYu可视化管理的功能的效果图,大家可以看下:
安装
在Docker环境下使用ShenYu需要同时运行ShenYu Admin和ShenYu Bootstrap两个容器。
- 首先下载
shenyu-admin
镜像,shenyu-admin
相当于是一个API网关的可视化管理功能;
docker pull apache/shenyu-admin:latest
- 接下来运行
shenyu-admin
容器;
docker run -p 9095:9095 --name shenyu-admin \
-d apache/shenyu-admin:latest
- 然后下载
shenyu-bootstrap
镜像;
docker pull apache/shenyu-bootstrap
- 接下来运行
shenyu-bootstrap
容器;
docker run -p 9195:9195 --name shenyu-bootstrap \
-e "shenyu.local.enabled=true" \
--env SHENYU_SYNC_WEBSOCKET_URLS=ws://192.168.3.101:9095/websocket \
-d apache/shenyu-bootstrap
- 两个容器都运行成功后,就可以访问
shenyu-admin
的可视化管理页面了,默认账号密码(admin:123456),访问地址:http://192.168.3.101:9095
使用
接下来就以我的mall电商实战项目为例,来讲解下ShenYu的http代理和限流功能。
mall
这里简单介绍下mall项目,mall项目是一套基于SpringBoot3
+ Vue 的电商系统(Github标星60K),后端支持多模块和2024最新微服务架构
,采用Docker和K8S部署。包括前台商城项目和后台管理系统,能支持完整的订单流程!涵盖商品、订单、购物车、权限、优惠券、会员、支付等功能!
- Boot项目:https://github.com/macrozheng/mall
- Cloud项目:https://github.com/macrozheng/mall-swarm
- 教程网站:https://www.macrozheng.com
项目演示:
准备
目前我们有两个基于SpringBoot的API服务和一个静态服务运行在服务器上,我们要把它们改成通过ShenYu网关统一访问。
服务名称 | 说明 | 原地址 | 网关访问地址 |
---|---|---|---|
mall-admin | mall项目后台管理系统API服务 | http://192.168.3.101:8080 | http://192.168.3.101:9195/mall-admin/ |
mall-portal | mall项目前台商城系统API服务 | http://192.168.3.101:8085 | http://192.168.3.101:9195/mall-portal/ |
mall-web | mall后台管理系统前端项目 | http://192.168.3.101/admin/ | http://192.168.3.101:9195/mall-web/admin/ |
http代理
- 实现http代理,我们需要用到Divide插件,在
插件列表->Proxy->Divide
功能中先添加选择器,这里以mall-admin
为例,首先是基本配置;
- 然后添加服务发现配置,类型选择
local
,下游服务url为192.168.3.101:8080
,如果你有多个服务添加的话可以实现负载均衡;
- 然后需要进行规则的添加,由于我们在选择器里已经添加了
/mall-admin/**
前缀,这里的匹配模式添加/**
即可;
- 由于网关会原封不动地把路径转发给下游服务,所以我们还需要配置下地址重写,去除url里面的
/mall-admin
部分;
# 通过网关访问地址
http://192.168.3.101:9195/mall-admin/swagger-ui/
# 网关转发地址(实际无法访问)
http://192.168.3.101:8080/mall-admin/swagger-ui/
# 正确转发地址
http://192.168.3.101:8080/swagger-ui/
- 地址重写我们需要用到
Rewrite
插件,我们需要先在基础配置->插件管理
中启用该插件;
- 然后在
插件列表->HttpProcess->Rewrite
中添加选择器;
- 然后再添加规则,将uri中的
^/mall-portal/
部分替换为/
;
- 之后我们就可以通过网关正常访问
mall-admin
服务的API文档了,访问地址:http://192.168.3.101:9195/mall-admin/swagger-ui/
- 对于
mall-portal
和mall-web
的http代理也按照上面的配置即可;
- 配置完成后可以正常访问
mall-portal
服务的API文档,访问地址:http://192.168.3.101:9195/mall-portal/swagger-ui/
- 然后是mall后台管理系统的前端项目,访问地址:http://192.168.3.101:9195/mall-web/admin/
限流功能
有时候如果我们想要对某个接口进行限流,可以通过RateLimiter
插件来实现。
- 我们需要在
基础管理->插件管理
中启用该功能,RateLimiter
的使用需要依赖Redis,请先运行好Redis服务;
- 然后在
插件列表->FaultTolerance->RateLimiter
中添加好选择器,这里我们对mall-portal
中的所有API都进行了限流;
- 之后添加限流规则,这里我们采用了Redis令牌桶算法进行限流;
- 具体参数说明可以参考下图;
- 然后我们快速访问
mall-portal
中的某个接口,会提示你已经被限流了,接口地址:http://192.168.3.101:9195/mall-portal/home/content
插件
Apache ShenYu的插件生态非常丰富,通过插件我们可以实现http请求处理、流量治理、熔断限流、安全性、监控、缓存等功能,下表列举了一些常用的插件,大家可以参考下。
插件 | 名称 | 适用场景 |
---|---|---|
Context Path | 上下文路径插件 | 不同的服务可以通过设置不同的上下文路径来做服务的流量治理 |
ModifyResponse | 响应修改插件 | 需要对接口的响应头部参数、响应HTTP状态码或响应体进行修改的场景 |
ParamMapping | 请求参数修改插件 | 添加/删除/替换请求体中固定的参数 |
Rewrite | 请求路径重写插件 | 通过重写请求路径, 可以使用与目标服务不同的uri。 |
流量治理插件 | 包括:Divide、Dubbo、gRPC、SpringCloud、Mqtt、Tcp、Websocket | 处理不同协议的请求,支持流量治理,服务负载均衡,设置接口的超时时间。 |
熔断限流 | 包括:Hystrix、RateLimiter、Resilience4j、Sentinel | 服务不稳定,使用熔断限流插件来熔断保护服务 |
安全性插件 | 包括:Sign、JWT、OAuth2、WAF | 需要在网关统一鉴权 |
Logging | 请求日志记录插件 | 开发时调试或者线上排查问题等情况下,需要在网关侧查看本次请求在转发过程中的相关信息,如请求头、请求参数或响应头、响应体等。 |
Cache | 缓存插件 | 数据不会频繁更新,而且需要大量调用的场景。 |
总结
今天给大家分享了下ShenYu这套网关系统的使用,依赖于丰富的插件生态,它的功能非常强大,设计也很优秀,之前使用Gateway修改代码才能实现的功能,在ShenYu上基本都可以实现可视化管理,感兴趣的小伙伴可以尝试下!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。