文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

微服务下的网关如何选择

2024-12-02 23:27

关注

[[417297]]

在电商系统中,查看商品详情页,这个商品详情页包含商品的详情,价格,库存,评论等,这些数据对于后端来说位于不同的微服务系统之中,后台的系统是这样来拆分服务的:

我们不做任何处理的时候,调用的时候是这样:

该处的缺点就是前端需要调用多次服务才能拿到我们想要的数据,为了解决这个问题我们可以做一层中间的聚合层,聚合层也就是我们通常所说的BFF(Back-end for Front-end),BFF可以认为是一种适配服务,将后端的微服务进行适配(主要包括聚合裁剪和格式适配等逻辑),实现上没太大限制,能做请求转发和数据转化即可,升级以后框架是这样的,之前我们系统处于这个阶段:

多个聚合层有很多跨横切面的代码是重复的,比如安全认证,日志监控,限流熔断等,随着时间的发展代码变得不可维护;

随着访问量、业务的增加,两个BFF层也满足不了我们的业务,需要抽象更多的BFF和采用集群部署的方式。

接下来我们再次升级我们架构,如下图:

这里我们引入的我们本章的主角网关,由于网关的加入我们可以将所有的跨横切面的代码通通抽象到网关层,这样我们BFF层只需要关注服务适配的逻辑,另外也解决掉了之前业务单点、多节点的等问题,这个时候你可能又想,网关的部署也是单点了,这个时候你可以考虑在网关前挂一层NG或者F5,如果随着业务发展网关管理的服务越来越多,也可以将网关按照业务域进行整体的拆分。

到这里你一定了解到了为什么需要网关,写到这里我突然想到某个伟人说的一句话,没有什么是加一个中间层解决不了的,如果有,就加两个……,BFF也好、网关也好都是我们的中间层。

网关选型

目前市面上根据技术栈实现的不同大概有如下一些网关:

接下来我们就简单了解下以上5个网关:

Nginx:Nginx由内核和模块组成,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件与客户端请求进行URL匹配,用于启动不同的模块去完成相应的工作。

 

Nginx在启动后,会有一个Master进程和多个Worker进程,Master进程和Worker进程之间是通过进程间通信进行交互的,如图所示。Worker工作进程的阻塞点是在像select()、epoll_wait()等这样的I/O多路复用函数调用处,以等待发生数据可读/写事件。Nginx采用了异步非阻塞的方式来处理请求,也就是说,Nginx是可以同时处理成千上万个请求的。

还可以将Lua嵌入到Nginx中,从而可以使用Lua来编写脚本,这样就可以使用Lua编写应用脚本,部署到Nginx中运行,即Nginx变成了一个Web容器;这样开发人员就可以使用Lua语言开发高性能Web应用了。在开发的时候使用OpenResty来搭建开发环境,OpenResty将Nginx核心、LuaJIT、许多有用的Lua库和Nginx第三方模块打包在一起;这样只需要安装OpenResty,不需要了解Nginx核心和写复杂的C/C++模块就可以,只需要使用Lua语言进行Web应用开发了。

Kong:Kong是一款基于OpenResty(Nginx + Lua模块)编写的高可用、易扩展的,由Mashape公司开源的API Gateway项目。Kong是基于NGINX和Apache Cassandra或PostgreSQL构建的,能提供易于使用的RESTful API来操作和配置API管理系统,所以它可以水平扩展多个Kong服务器,通过前置的负载均衡配置把请求均匀地分发到各个Server,来应对大批量的网络请求。

Kong主要有三个组件:

Kong采用插件机制进行功能定制,插件集(可以是0或N个)在API请求响应循环的生命周期中被执行。插件使用Lua编写,目前已有几个基础功能:HTTP基本认证、密钥认证、CORS(Cross-Origin Resource Sharing,跨域资源共享)、TCP、UDP、文件日志、API请求限流、请求转发以及Nginx监控。

Kong网关具有以下的特性:

Zuul的核心是一系列的filters,Zuul的核心是一系列的过滤器,这些过滤器可以完成以下功能:

  1. 身份认证与安全:识别每个资源的验证要求,并拒绝那些与要求不符的请求。
  2. 审查与监控:与边缘位置追踪有意义的数据和统计结果,从而带来精确的生产视图。
  3. 动态路由:动态地将请求路由到不同的后端集群。
  4. 压力测试:逐渐增加指向集群的流量,以了解性能。
  5. 负载分配:为每一种负载类型分配对应容量,并弃用超出限定值的请求。
  6. 静态响应处理:在边缘位置直接建立部分响应,从而避免其转发到内部集群。
  7. 多区域弹性:跨越AWS Region进行请求路由,旨在实现ELB(Elastic Load Balancing,弹性负载均衡)使用的多样化,以及让系统的边缘更贴近系统的使用者。

Zuul目前有两个大的版本:Zuul1和Zuul2。

Zuul1是基于Servlet框架构建,如图所示,采用的是阻塞和多线程方式,即一个线程处理一次连接请求,这种方式在内部延迟严重、设备故障较多情况下会引起存活的连接增多和线程增加的情况发生。

Netflix发布的Zuul2有重大的更新,它运行在异步和无阻塞框架上,每个CPU核一个线程,处理所有的请求和响应,请求和响应的生命周期是通过事件和回调来处理的,这种方式减少了线程数量,因此开销较小。

Spring Cloud GetWay:Spring Cloud Gateway是Spring Cloud的一个全新的API网关项目,目的是为了替换掉Zuul1。Gateway可以与Spring Cloud Discovery Client(如Eureka)、Ribbon、Hystrix等组件配合使用,实现路由转发、负载均衡、熔断等功能,并且Gateway还内置了限流过滤器,实现了限流的功能。

Gateway基于Spring 5、Spring Boot 2和Reactor构建,使用Netty作为运行时环境,比较完美的支持异步非阻塞编程。Netty使用非阻塞的IO,线程处理模型建立在主从Reactors多线程模型上。其中Boss Group轮询到新连接后与Client建立连接,生成NioSocketChannel,将channel绑定到Worker;Worker Group轮询并处理Read、Write事件。

Soul:Soul是一个异步的,高性能的,跨语言的,响应式的API网关。参考了Kong,Spring-Cloud-Gateway等优秀的网关后,站在巨人的肩膀上,Soul由此诞生!

Soul特征:

  1. 支持各种语言,无缝集成Dubbo,Spring Cloud。
  2. 丰富的插件支持,鉴权,限流,熔断,防火墙等等。
  3. 网关多种规则动态配置,支持各种策略配置。
  4. 插件热插拔,易扩展
  5. 支持集群部署,支持A/B Test

总结一下:

 

来源:大魔王先生的博客内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯