微服务下的网关如何选择

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 微服务下的网关如何选择

一、前言


自从换了工作以后,将近5个月没有写博客了,这段时间经历一个身份的转变,从一个核心开发转变为了一个项目的Leader,这种感觉说不上来的,虽说是有些感悟,但是更多的是一些困惑,但是有一点是明确的,站的高度或者角度不同,有些思考是不一样的,有这种身份转换的,大家可以做一些交流,嘿嘿!开启我们的正题,最近项目要从第三方外包的手中转成自有化的形式,我们准备采用微服务的形式去做这件事。之前也想写这个系列的话题,整好趁着这次的改造来完成这个微服务序列的文章,首先我们来介绍下网关这个组件。


二、为什么出现网关


微服务的架构体系中,可以简单的看做是一个大应用拆分为多个小应用,小应用可以自成体系,可以拥有自己的数据库、框架甚至于语言等等,各个小应用一般通过Rest接口的形式被第三方、H5或者APP去调用。这个时候必然会存在一种情况,某些页面需要多个服务组合才能得到用户需要的信息。举个栗子:

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

商品服务:负责提供商品的标题,描述,规格等。

营销服务:负责对产品进行定价,价格策略计算,促销价等。

库存服务:负责产品库存。

评价服务:负责用户对商品的评论,回复等。

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

1005447-20201117201538358-1971667891.png

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

1005447-20201118122004415-76346477.png


升级以后的框架解决了多次调用的问题,但是这里地方会存在如下几个问题:

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

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

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

1005447-20201118122054286-353746345.png

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

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


三、网关选型


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

1005447-20201119085952544-857940333.png

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

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

1005447-20201119085253541-1266751344.png

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,来应对大批量的网络请求。

1005447-20201119100901764-1049336596.png

Kong主要有三个组件:

  1. Kong Server :基于Nginx的服务器,用来接收API请求。
  2. Apache Cassandra/PostgreSQL :用来存储操作数据。
  3. Kong dashboard:官方推荐UI管理工具,当然,也可以使用 restfull 方式 管理admin api。

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

285763-20181011092854980-763726063.png

Kong网关具有以下的特性:

  1. 可扩展性: 通过简单地添加更多的服务器,可以轻松地进行横向扩展,这意味着您的平台可以在一个较低负载的情况下处理任何请求;
  2. 模块化: 可以通过添加新的插件进行扩展,这些插件可以通过RESTful Admin API轻松配置;
  3. 在任何基础架构上运行: Kong网关可以在任何地方都能运行。您可以在云或内部网络环境中部署Kong,包括单个或多个数据中心设置,以及public,private 或invite-only APIs。

Netfilx Zuul:Zuul 是 Netflix 开源的微服务网关组件,它可以和 Eureka、Ribbon、Hystrix 等组件配合使用。社区活跃,融合于 SpringCloud 完整生态,是构建微服务体系前置网关服务的最佳选型Zuul的核心是一系列的filters,


1859315a65bf06a988443f9767c2a5c.png


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

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

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

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

e34231efc179f96dbcaa73b08f58b4b.png


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


15418b8b8af351192d96e6e979ce38a.png


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

1005447-20201119150147134-270324284.png

  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由此诞生!

1005447-20201119151125790-247294038.png

Soul特征:

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

总结一下:

  1. 性能
    Nginx+Lua形式必然是高于Java语言实现的网关的,Java技术栈里面Zuul1.0是基于Servlet实现的,剩下都是基于webflux实现,性能是高于基于Servlet实现的。在性能方面我觉得选择网关可能不算那么重要,多加几台机器就可以搞定。
  2. 可维护性和扩展性
    Nginx+Lua这个组合掌握的人不算多,如果团队有大神,大佬们就随意了,当没看到这段话,对于一般团队来说的话,选择自己团队擅长的语言更重要,所以我选择了Java技术栈下的网关。Java技术栈下的3种网关,对于Zuul和Spring Cloud Getway需要或多或少要搞一些集成和配置页面来维护,但是对于Soul我就无脑看看文章,需要哪个搬哪个好了,尤其是可以无脑对接Dubbo美滋滋,此外Soul2.0以后版本可以摆脱ZK,在我心里再无诟病,我就喜欢无脑操作。
  3. 高可用
    对于网关高可用基本都是统一的策略都是采用多机器部署的方式,前面挂一个负载,对于而外需要用的一些组件大家注意一下。
相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
2月前
|
Cloud Native API
微服务引擎 MSE 及云原生 API 网关 2024 年 9 月产品动态
微服务引擎 MSE 及云原生 API 网关 2024 年 9 月产品动态。
|
2月前
|
缓存 监控 API
探索微服务架构中的API网关模式
【10月更文挑战第5天】随着微服务架构的兴起,企业纷纷采用这一模式构建复杂应用。在这种架构下,应用被拆分成若干小型、独立的服务,每个服务围绕特定业务功能构建并通过HTTP协议协作。随着服务数量增加,统一管理这些服务间的交互变得至关重要。API网关作为微服务架构的关键组件,承担起路由请求、聚合数据、处理认证与授权等功能。本文通过一个在线零售平台的具体案例,探讨API网关的优势及其实现细节,展示其在简化客户端集成、提升安全性和性能方面的关键作用。
82 2
|
2月前
|
存储 缓存 监控
探索微服务架构中的API网关模式
【10月更文挑战第1天】探索微服务架构中的API网关模式
98 2
|
3月前
|
监控 负载均衡 安全
微服务(五)-服务网关zuul(一)
微服务(五)-服务网关zuul(一)
|
8天前
|
NoSQL 前端开发 测试技术
👀探秘微服务:从零开启网关 SSO 服务搭建之旅
单点登录(Single Sign-On,简称SSO)是一种认证机制,它允许用户只需一次登录就可以访问多个应用程序或系统。本文结合网关和SaToken快速搭建可用的Session管理服务。
49 8
|
17天前
|
Cloud Native API 微服务
微服务引擎 MSE 及云原生 API 网关 2024 年 11 月产品动态
微服务引擎 MSE 及云原生 API 网关 2024 年 11 月产品动态。
|
18天前
|
运维 Cloud Native 应用服务中间件
阿里云微服务引擎 MSE 及 云原生 API 网关 2024 年 11 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要
|
23天前
|
设计模式 负载均衡 监控
探索微服务架构下的API网关设计
在微服务的大潮中,API网关如同一座桥梁,连接着服务的提供者与消费者。本文将深入探讨API网关的核心功能、设计原则及实现策略,旨在为读者揭示如何构建一个高效、可靠的API网关。通过分析API网关在微服务架构中的作用和挑战,我们将了解到,一个优秀的API网关不仅要处理服务路由、负载均衡、认证授权等基础问题,还需考虑如何提升系统的可扩展性、安全性和可维护性。文章最后将提供实用的代码示例,帮助读者更好地理解和应用API网关的设计概念。
54 8
|
1月前
|
负载均衡 监控 API
dotnet微服务之API网关Ocelot
Ocelot 是一个基于 .NET 的 API 网关,适用于微服务架构。本文介绍了如何创建一个 Web API 项目并使用 Ocelot 进行 API 请求路由、负载均衡等。通过配置 `ocelot.json` 和修改 `Program.cs`,实现对 `GoodApi` 和 `OrderApi` 两个项目的路由管理。最终,通过访问 `https://localhost:7122/good/Hello` 和 `https://localhost:7122/order/Hello` 验证配置成功。
34 1
dotnet微服务之API网关Ocelot
|
1月前
|
缓存 负载均衡 JavaScript
探索微服务架构下的API网关模式
【10月更文挑战第37天】在微服务架构的海洋中,API网关犹如一座灯塔,指引着服务的航向。它不仅是客户端请求的集散地,更是后端微服务的守门人。本文将深入探讨API网关的设计哲学、核心功能以及它在微服务生态中扮演的角色,同时通过实际代码示例,揭示如何实现一个高效、可靠的API网关。