Apache shenyu,Java 微服务网关的首选

news2024/11/25 12:00:02

微服务网关的产生背景

当我们系统复杂度越来越高,团队协作效率越来越低时,我们通常会想到通过"拆分"来应对,这是典型的"化繁为简,分而治之"的思想。在落地过程中,我们通常会引入"SOA"或者"微服务"架构手段,如下图所示:
image.png

技术更新日新月异,站在当下去看,“微服务”、“API网关”、“云原生”、“service mesh”…这些早已不是什么新鲜概念。但只有完整经历过架构演进,才能倒出其中缘由,因为架构演进并非一蹴而就的。

时光回到2014年,很多公司在忙着对遗留系统做"前后端分离"和"服务化拆分",不管是追潮流,还是真解决问题,反正很多公司都在这么干。架构大概是这个样子的:
image.png
简单描述一下,这里的Web Server通常是我们熟悉的Nginx,它承担了2个职责。第一,作为反向代理和七层负载均衡器,负责将浏览器或者APP端的请求转发到指定的后端服务中。第二,它也作为前端静态站的Web容器。
这个架构有很多问题,典型的问题如下:

  1. 端上直接请求后端服务,强耦合,如果后端服务做字段修改了很可能会影响到端上
  2. 客户端需要多次请求服务,完成一个页面的渲染
  3. 很多通用的逻辑没有收敛,比如:用户身份验证,所以你可能在服务上面看到各种Filter、切面

为了解决上面这些问题,所以很多公司又引入了一个中间层。这也再次印证了那句话–在计算机系统的世界里,没有问题是不能通过引入"第三者"解决的。架构如下:
image.png

这一层中间层,用现在流行的叫法叫做"BFF"。有些公司可能会是前端同学通过Node.js来实现,也有些是后端同学来实现的。当然,由于我主导的很多系统都经历过单体(前后端不分离)、前后端分离、网站应用垂直拆分、无线化、开放平台、SOA服务化(服务下沉)等演进历程。在SOA改造的过程中,本质上我们是通过服务下沉的方式,把一些共享的能力做接口抽象和复用,自然也有保留一套或者多套比较薄的Web应用做中间层,去接收前端和APP端的请求,做一些字段裁剪、接口响应内容的拼接等等。所以,我并没有踩过上面的坑。因为每一步演进都是为了解决真问题,所以也很自然。那个时候我没有关注什么"微服务"、"BFF"之类的概念,只不过解法和套路都是类似的。

但是呢。因为团队越来越大,业务越来越多,这种"中间层"应用也越来越多,大概成了这个样子:
image.png

在这些中间层应用里面,同样还是存在一些重复的逻辑没有收敛,典型的如下:

  1. 请求身份验证,鉴权等
  2. 切面的日志打印,QPS和耗时统计等
  3. 请求的限流、熔断等

既然要解决这些问题,把一些非业务属性且公共的逻辑剥离出来,那很自然的会想到"在BFF的前面再加一层"。这也就是我们今天要介绍的"API网关",或者叫"微服务网关"。
image.png
当然,这个图里面省去了最前面的DNS/CDN/GSLB,LVS/HAProxy/Nginx等网络接入和负载均衡等细节。
简单总结一下网关的职责:

  • 请求流量的路由转发、负载均衡
  • 安全验证(身份认证、请求鉴权等)
  • 限流、熔断
  • 日志、指标度量等
  • 协议适配
  • 请求缓存

微服务网关的生态

Java社区的微服务网关

在很长的一段时间里,Java社区的微服务网关主要由Spring Cloud生态来提供,所以选择也不多。
image.png

这两者,可以满足一般中小型公司的业务场景和需求,但是他们存在一些共同的问题:

  1. 缺少动态配置和动态更新能力,需要整合配置中心做二次开发
  2. 缺少可视化的操作和维护界面。无论是从体验还是从效率的角度来看,可视化都非常重要
  3. 缺少限流、降级,日志、监控等完整的方案,需要各种整合和二次开发
  4. 缺少协议转换的能力,后端服务如果是直接通过RPC协议暴露的则无法被前端访问

Nginx/OpenResty体系的网关

Nginx算是网关吗?回答这个问题之前我们先仔细想想,Nginx的职责和功能和我们上面说的网关好像是有一些重叠的。例如:请求转发、负载均衡、限流(借助模块)、安全认证等等。基于Nginx/Openresty生态衍生出来的,比较具有代表意义的主要有老牌的Kong,以及近两年比较火的APISIX这两款。详细对比如下:
image.png

从广义上来讲,Nginx/Openresty也是网关,这个并没有权威的定义。通常,我们可以把网关又细分为:
流量网关,顾名思义就是控制流量进入集群的网关。
业务网关,更加贴合业务服务的,也就是我们说的微服务网关。
当然,这两者并没有绝对的界限。所以,通常我们在实际应用场景中都是搭配使用的。

云原生网关

进入云原生时代之后,Kubernetes已经成为了云原生应用底座的事实标准。而我们要想应用暴露给外部访问,首先绕不开的就是Ingress 控制器。image.png
上面这张图比较老,大概是2021年前后的。Ingress和云原生API GATEWAY这个市场的玩家特别多,还包括Service Mesh数据面事实标准Envoy推出的Envoy Gateway**,**最近比较火的阿里云基于Envoy改造的Higress,以及淘系基于Tengine改造的Tengine-Ingress等等。
image.png

为什么推荐你直接使用Apache shenyu

Apache shenyu的特性包含:

  • 请求代理:支持Apache Dubbo,Spring Cloud,gRPC,Motan,SOFA,TARS,WebSocket,MQTT等协议的转换
  • 安全性:签名,OAuth 2.0,JWT插件,WAF插件
  • API治理:请求、响应、参数映射、限流熔断、流量灰度、接口文档
  • 可观测性:跟踪、指标、日志记录插件
  • 仪表板:动态流量控制,可视化操作
  • 高性能:基于Netty,纯异步非阻塞模式
  • 高扩展:插件机制,热插拔,SPI按需动态加载
  • 热更新:数据实时同步,无需重启集群
  • 集群:NGINX、Docker、Kubernetes
  • 语言:提供.NET,Python,Go,Java客户端用于API注册
  • 开箱即用:功能丰富稳定,开箱即用,简单添加引用就能接入,几乎没有业务侵入性和接入成本
  • 生态友好:目前已集成常见的中间件,包括服务框架、限流熔断、服务发现、配置中心等。目前也在积极拥抱云原生
  • 社区活跃:Apache顶级项目,目前社区有来自全球贡献者超过300名,github star超过8K,据观察几乎每天都有代码提交更新和PR合并动作。社区活跃程度**是选择开源软件的首要考虑项 **

更多信息,请参考Apache shenyu网站和github主页:
https://github.com/apache/shenyu** ,**https://shenyu.apache.org/zh/docs/index

如果你们公司系统是Java体系的,对功能、性能、扩展性等方面又比较有追求,但又没有自研能力和时间,那我推荐你直接使用Apache shenyu 来做微服务网关,几乎满足绝大部分公司对网关的诉求。

为什么我不推荐你单独使用云原生网关?

这些云原生网关确实都很优秀,有很多吸引人的特性,甚至时不时有"取代传统微服务网关"的声音。但是,优秀的未必就适合你,简单总结有如下原因:

  1. 云原生已经普及了好几年,大部分公司的应用系统也都逐渐跑在了Kubernetes之上。但是,大部分公司的应用还是基于Dubbo/Spring Cloud + ZK/Nacos/Consul这种传统的微服务架构,并非天生就是基于Kubernetes的Service体系构建的,也不是直接基于Service Mesh体系来构建的。所以,云原生网关目前对你来说还是属于那种看起来或者听起来很美好,独立使用又发挥不出它的全部价值来。
  2. 这些网关普遍对Java开发人员并不友好。比如,Nginx和Openresty体系,很多时候借助Nginx模块(C代码)和Lua脚本来实现扩展的,这对使用者来说是有一定门槛的。Envoy体系是基于C++来实现的。当然,为了解决这些痛点问题,最新的这些云原生网关厂商也在积极拥抱WASM生态,试图降低开发者扩展的门槛,不过WASM目前对Java的支持并不友好。所以,无论是想开发插件扩展,还是想进行深度的二次开发定制,门槛都不低,这也会让你十分难受。
  3. 太新的技术,生态可能还不够完善,各方面成熟度还有待验证,不推荐轻易在生产直接使用
  4. 取代微服务网关,这有点言之过早。目前我更推荐搭配使用,各司其职。10多年前Nginx流行的时候很多人绝对LVS要完了,但到现在IPVS也还在内核中。Spring Cloud刚开源的时候业内很多人也在唱衰Dubbo,Service Mesh出现的时候也被认为是颠覆性的二代微服务架构。

总结

本文先从微服务网关的诞生背景出发,带读者重新温习了一下近些年互联网公司中普遍的架构演进的过程。然后重点介绍了传统的微服务网关,传统的流量网关,以及面向云原生的Ingress控制器和API网关。
最后,重点介绍了一下Apache shenyu的特性,以及为什么我不推荐你单独使用那些云原生网关。当然,水平有限,也纯属一家之言,也欢迎读者在留言区交流和留言讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1024114.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uqrcode+uni-app 微信小程序生成二维码

使用微信小程序需要弹出动态二维码的需求,从插件市场选了一个下载次数较多的组件引入到项目中uqrcode,使用步骤如下: 1、从插件市场下载 插件地址:https://ext.dcloud.net.cn/plugin?id1287,若你是跟我一样是用uni-…

用PHP异步协程控制python爬虫脚本,实现多协程分布式爬取

背景 公司需要爬取指定网站的产品数据。但是个人对python的多进程和协程不是特别熟悉。所以,想通过php异步协程,发起爬取url请求控制python爬虫脚本,达到分布式爬取的效果。 准备 1.准备一个mongodb数据库用于存放爬取数据2.引入flask包&a…

Cesium 生成点位坐标

文章目录 需求分析1. 点击坐标点实现2. 输入坐标实现 需求 用 Cesium 生成点位坐标,并明显标识 分析 以下是我的两种实现方式 第一种是坐标点击实现 第二种是输入坐标实现 1. 点击坐标点实现 //点位坐标getLocation() {this.hoverIndex 0;let that this;this.view…

【FAQ】安防视频监控平台EasyNVR无法控制云台,该如何解决?

TSINGSEE青犀视频安防监控平台EasyNVR可支持设备通过RTSP/Onvif协议接入,并能对接入的视频流进行处理与多端分发,包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等多种格式。在智慧安防等视频监控场景中,EasyNVR可提供视频实时监控直播、云端…

网络代理工具软件Proxyman mac中文版功能特点

Proxyman mac是一款网络代理工具软件,适用于Mac和iOS平台。它可以帮助开发人员、测试人员和网络管理员监控和调试网络流量。 Proxyman mac软件功能和特点 流量捕获和监控:Proxyman可以捕获并显示设备上的所有网络流量,包括HTTP、HTTps和WebSo…

Android之MediaCodec::PostAndAwaitResponse消息原理(四十三)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

vscode自动添加文件和函数注释

自动添加注释 Doxygen Documentation Generator配置配置选项介绍配置文件头注释配置函数头注释 Doxygen Documentation Generator 此插件是vscode自动注释添加的插件,首先需要在vscode中查找并安装插件。如下图所示,插件在未安装的情况下会显示蓝色的In…

go-redis 框架基本使用

文章目录 redis使用场景下载框架和连接redis1. 安装go-redis2. 连接redis 字符串操作有序集合操作流水线事务1. 普通事务2. Watch redis使用场景 缓存系统,减轻主数据库(MySQL)的压力。计数场景,比如微博、抖音中的关注数和粉丝数…

【zotero】解决换新电脑后PDF打不开

关于zoteroPDF无法打开,并且提示:它可能已被移动或删除到 Zotero 之外,或者一台计算机上的链接附件基本目录可能设置不正确。 第一步:下载zutilo第二步:zutilo获取路径第三步 修改路径最后:新旧路径对比 第…

笔记1.6:计算机网络发展历史

1961-1972:早期分组交换原理的提出与应用 1972-1980:网络互连,大量新型、私有网络的涌现 1980-1990:新型网络协议与网络的激增 1999、2000‘s:商业化、Web、新应用 2005- ? :

ChatGPT AIGC 完成各省份销售动态可视化分析

像这样的动态可视化由人工智能ChatGPT AIGC结合前端可视化技术就可以实现。 Prompt:请使用HTML,JS,Echarts 做一个可视化分析的案例,地图可视化,数据可以随机生成,请写出完整的代码 完整代码复制如下: <!DOCTYPE html> <html> <head><meta char…

汽油辛烷值的测定 马达法

声明 本文是学习GB-T 503-2016 汽油辛烷值的测定 马达法. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 8 试剂和标准物 8.1 气缸夹套冷却液 若实验室所处海拔的水沸点为100℃1.5℃(212 F3F), 应使用水作为气缸夹套冷却液。当 实验室海拔高度不确定…

Android 滑动事件消费监控,Debug 环境下通用思路

Android Debug 环境下滑动事件消费监控通用思路 背景 Android 开发中&#xff0c;经常会遇到滑动事件冲突。在一些简单的场景下&#xff0c;我们如果能够知道是那个 View 拦截了事件&#xff0c;那我们能够很容易得解决。解决方法通常就是内部拦截法或者外部拦截法。ViewPage…

「深度学习之优化算法」(十九)蚁狮算法

1. 蚁狮算法简介 (以下描述,均不是学术用语,仅供大家快乐的阅读)    蚁狮是一种昆虫,城里长大的我没有见过这玩意儿,请教了农村长大小的伙伴,依然没见过,这玩意儿可能在我们生活的地方分布较少。 (图片及介绍来自百度百科)    蚁狮算法(Ant Lion Optimization…

自己动手写数据库:关系代数和查询树执行效率的推导

上几节我们完成了 sql 解释器的实现。通过解析 sql 语句&#xff0c;我们能知道 sql 语句想做什么&#xff0c;接下来就需要执行 sql 语句的意图&#xff0c;也就是从给定表中抽取所所需要的数据。要执行 sql 语句&#xff0c;我们需要了解所谓的“关系代数”&#xff0c;所谓代…

py基础语法

输出&#xff1a; print("wbshpnshp")输入&#xff1a; 1.raw_input() str raw_input("请输入&#xff1a;") print "你输入的内容是: ", str2.input(), input 可以接收一个Python表达式作为输入&#xff0c;并将运算结果返回。 str input(…

【C++面向对象侯捷】3.构造函数

文章目录 class 的声明inline&#xff08;内联&#xff09;函数access level&#xff08;访问级别&#xff09;构造函数构造函数可以有多个- 重载&#xff01; class 的声明 inline&#xff08;内联&#xff09;函数 access level&#xff08;访问级别&#xff09; 构造函数 构…

Flutter的基础知识、核心概念以及一些实际开发技巧

Flutter的基础知识、核心概念以及一些实际开发技巧 前言深入探讨Flutter应用程序开发一、什么是Flutter&#xff1f;Dart编程语言Widget组件模型 二、Flutter的核心概念MaterialApp和ScaffoldWidget生命周期布局和排列状态管理 三、实际开发技巧使用Hot Reload适应不同屏幕尺寸…

OpenHarmony AI框架开发指导

一、概述 1、功能简介 AI 业务子系统是 OpenHarmony 提供原生的分布式 AI 能力的子系统。AI 业务子系统提供了统一的 AI 引擎框架&#xff0c;实现算法能力快速插件化集成。 AI 引擎框架主要包含插件管理、模块管理和通信管理模块&#xff0c;完成对 AI 算法能力的生命周期管理…

用katalon解决接口/自动化测试拦路虎--参数化

不管是做接口测试还是做自动化测试&#xff0c;参数化肯定是一个绕不过去的坎。 因为我们要考虑到多个接口都使用相同参数的问题。所以&#xff0c;本文将讲述一下katalon是如何进行参数化的。 全局变量 右侧菜单栏中打开profile&#xff0c;点击default&#xff0c;打开之后…