专栏名称: macrozheng
专注Java技术分享,解析优质开源项目。涵盖SpringBoot、SpringCloud、Docker、K8S等实用技术,作者Github开源项目mall(50K+Star)。
目录
相关文章推荐
安天集团  ·  安天网络行为检测能力升级通告(20241222) ·  3 天前  
一亩三分地Warald  ·  颁布禁飞令!全美多地现神秘无人机,引发恐慌! ·  3 天前  
蒋涛CSDN  ·  微软今年购买485,000颗英伟达的Hopp ... ·  5 天前  
一亩三分地Warald  ·  全球行业第一巨头,裁员10,000人! ·  5 天前  
一亩三分地Warald  ·  全球行业第一巨头,裁员10,000人! ·  5 天前  
广西电力交易中心  ·  交易中心数字化转型成果 荣获中国信息协会优秀案例 ·  6 天前  
广西电力交易中心  ·  交易中心数字化转型成果 荣获中国信息协会优秀案例 ·  6 天前  
51好读  ›  专栏  ›  macrozheng

网关系统就该这么设计(万能通用),稳的一批!

macrozheng  · 公众号  · 互联网安全 科技自媒体  · 2024-12-24 10:32

主要观点总结

文章介绍了Apache ShenYu这款可视化的网关系统,无需写代码即可使用,具有多种代理协议和认证方式,支持API治理和可视化管理等功能。文章详细阐述了ShenYu的安装和使用方法,以mall电商实战项目为例,介绍了http代理和限流功能的实现。此外,文章还介绍了ShenYu的插件生态和一些常用插件的功能。

关键观点总结

关键观点1: ShenYu网关系统的特点

无需写代码,设计优秀,功能强大,支持多种代理协议和认证方式,API治理和可视化管理等功能。

关键观点2: ShenYu的安装和使用

在Docker环境下使用ShenYu需要运行shenyu-admin和shenyu-bootstrap两个容器。通过配置插件实现http代理和限流功能。

关键观点3: ShenYu在mall电商项目中的应用

通过Divide插件实现http代理,通过RateLimiter插件实现限流功能。丰富的插件生态,可以实现http请求处理、流量治理、熔断限流、安全性、监控、缓存等功能。


正文

Boot+Cloud项目学习:macrozheng.com

提到网关系统,大家第一个想到的肯定是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/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上基本都可以实现可视化管理,感兴趣的小伙伴可以尝试下!

项目地址

https://github.com/apache/shenyu


Github上标星11K的微服务实战项目mall-swarm,全套 视频教程(2024最新版) 来了!全套教程约26小时,共59期,如果你想学习目前最新的微服务技术栈,同时提高自己微服务项目的开发能力的话,不妨了解下,下面是项目的整体架构图,感兴趣的小伙伴可以点击链接 mall-swarm视频教程 加入学习。

整套 视频教程 的内容还是非常完善的,涵盖Spring Cloud核心组件、微服务项目实战、Kubernetes容器化部署等内容,你也可以点击链接 mall-swarm视频教程 了解更多内容。

推荐阅读