网关系统就该这么设计(万能通用)

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/video/

项目演示:

图片

准备

目前我们有两个基于SpringBoot的API服务和一个静态服务运行在服务器上,我们要把它们改成通过ShenYu网关统一访问。

服务名称说明原地址网关访问地址
mall-adminmall项目后台管理系统API服务http://192.168.3.101:8080http://192.168.3.101:9195/mall-admin/
mall-portalmall项目前台商城系统API服务http://192.168.3.101:8085http://192.168.3.101:9195/mall-portal/
mall-webmall后台管理系统前端项目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-portalmall-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上基本都可以实现可视化管理,感兴趣的小伙伴可以尝试下!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值