网关项目为什么要使用微服务

1、解决 API 问题

采用微服务架构的系统本身是由很多的独立服务单元组合起来的。而客户端要调用系统,则必须通过系统提供的各种对外开放的 API 来实现。

比如在一套电商系统上,关于订单相关的 API ,放在组成订单服务的服务单元上;风控服务的 API ,放在组成风控服务的服务单元上。这些 API 如果全部分散到各个服务单元上,供客户端调用,客户端可能一次操作就可能会调用许多服务的 API,需要远程访问好几次甚至十几次服务器。

引入网关,就相当于在客户端和微服务之间加了一层隔离。通常,网关本身会和各个服务单元处于同一个机房,这样,客户端做业务操作的时候,只需要访问一次网关。然后剩下的事情,再由网关分别访问同在一个机房的不同的服务,再把拿到的数据统一在网关封装好,返回给客户端就好。

2、解决边缘功能集成的问题

像限流、降级、熔断这些系统保障策略,最合适的地方应该是有一个集中的请求入口点,当系统出现问题的时候,直接就在这个入口点做相应的操作即可。

  • 限流,就直接在这个入口点限制后续请求。
  • 降级,就直接在这个入口点判断请求想要访问的服务或者页面,直接报错返回。
  • 熔断,就直接在这个入口点,断开所有访问特定服务的请求连接,然后再把后继对特定服务的访问,也全部拦在门外。

网关恰好就承担了这么个统一请求入口的角色,集成了各种的边缘功能

3、解耦了客户端和后端微服务,服务聚合

  • 解耦:服务聚合封装了应用的内部结构,客户端直接和网关通信,而不必关注特定的服务。当对应某个服务的接口发生了改变,客户端不需要调整,在网关进行调整即可
  • 针对性优化:可以对每种客户端提供特定的优化API,例如:某个系统有PC和手机端,都有订单详情页面,但是手机端需要的信息要比PC端少很多,此时可以通过网关针对PC和手机端提供不同的API。对于手机端可以提供一个简化的API接口,提高访问性能。
  • 简化客户端逻辑:原来需要客户端发送多个请求才能完成的功能,可以通过一个请求来完成,降低了客户端的开发复杂度。
  • 性能优化:客户端发送的请求是公共网络请求,聚合服务后,公共网络请求变成了内部网络请求,性能相对提高了一些。

网关的功能

主要功能

微服务网关作为微服务后端服务的统一入口,它可以统筹管理后端服务,主要分为数据平面控制平面

数据平面的主要功能是接入用户的HTTP请求和微服务被拆分后的聚合。使用微服务网关统一对外暴露后端服务的API和契约,路由和过滤功能正是网关的核心能力模块。另外,微服务网关可以实现拦截机制和专注跨横切面的功能,包括协议转换、安全认证、熔断限流、灰度发布、日志管理、流量监控等。

控制平面的主要功能是对后端服务做统一的管控和配置管理。例如,可以控制网关的弹性伸缩;可以统一下发配置;可以对网关服务添加标签;可以在微服务网关上通过配置Swagger功能统一将后端服务的API契约暴露给使用方,完成文档服务,提高工作效率和降低沟通成本。

路由功能

路由是微服务网关的核心能力。通过路由,网关可以将请求转发到目标微服务。在微服务架构中,网关可以结合注册中心的动态服务发现,实现对后端服务的发现。而对于调用方,只需要知道网关对外暴露的服务API,就可以透明地访问后端微服务。

同时考虑到,网关是整个系统的入口,一旦网关停止服务,则整个系统都无法对外提供服务。所以网关不能够频繁的启停,故路由模块需要能够动态的配置规则。

负载均衡

API网关结合负载均衡技术,利用服务发现工具,通过轮询、指定权重、IP地址哈希等机制实现下游服务的负载均衡。

知识补充

一般负载均衡算法有:

  • 随机算法:从多个服务中,随机选择一个服务来处理请求。此算法的问题是,实际无法做到负载均衡,极端情况下可能会导致所有请求都由同一个服务进行处理。且对于有状态的服务,对状态的管理会比较麻烦。
  • 加权随机:同随机算法,不同之处是每个服务的权重不同。比如有的服务器性能较好,则可以提高权重,能够处理较多的请求;有的服务器性能较差,则可以降低权重,处理较少的请求。
  • 轮询算法:对服务进行排序,将请求按顺序发送给对应的服务来处理。假设有两个服务A,B,第一个请求由A处理,第二个请求则由B处理,第三个请求还由A处理,以次类推。对于有状态的服务,轮询算法对状态处理也比较麻烦。
  • 加权轮询:同轮询算法,不同之处是每个服务的权重不同。比如上面的例子,A,B权重2:1,则第一个请求A处理,第二个请求还是A处理,第三个请求B处理,第四个请求A处理,以次类推。
  • 最小连接算法:根据服务的连接数来判断请求由哪个服务来处理,选择当前连接数最少的服务来处理请求。此算法需要维护每个服务的连接数,比较复杂,不推荐使用。
  • 源地址hash:根据请求地址取hash,然后对服务数量取模,由对应的服务来处理对应的请求。此算法可以保证相同用户的请求由同一个服务来处理,可以保障服务端状态。

对于微服务场景来说,优先选择源地址hash:

  • 第一,不需要处理随机、轮询这种算法需要处理的服务端Session共享的问题
  • 第二,实现简单
  • 第三,考虑服务的变动不会太频繁,前期用户量也不会很大,使用源地址hash的性价比最高

安全认证

一般而言,无论对内网还是外网的接口都需要做用户身份认证,而用户认证在一些规模较大的系统中都会采用统一的单点登录系统,如果每个微服务都要对接单点登录系统,那么显然比较浪费资源且开发效率低。API网关是统一管理安全性的绝佳场所,可以将认证的部分抽取到网关层,微服务系统无须关注认证的逻辑,只关注自身业务即可。常见的安全性技术(如密钥交换、客户端认证与报文加解密等)都可以在API网关中实现。

黑白名单

微服务网关可以使用系统黑名单,过滤HTTP请求特征,拦截异常客户端的请求,例如DDoS攻击等侵蚀带宽或资源迫使服务中断等行为,可以在网关层面进行拦截过滤。比较常见的拦截策略是根据IP地址增加黑名单。在存在鉴权管理的路由服务中,可以通过设置白名单跳过鉴权管理而直接访问后端服务资源。(白名单优先与黑名单)

限流/熔断/升降级

在某些场景下需要控制客户端的访问次数和访问频率,一些高并发系统有时还会有限流的需求。在网关上可以配置一个阈值,当请求数超过阈值时就直接返回错误而不继续访问后台服务。当出现流量洪峰或者后端服务出现延迟或故障时,网关能够主动进行熔断,保护后端服务,防止雪崩效应发生,并保持前端用户体验良好。

熔断

当一个服务对外无响应或者响应时间很长时,此种情况下可能会导致请求的大量积压,继而影响整个系统对外提供服务。熔断可以避免此类问题的发生。

当一个服务对外无响应或者响应时间过长时,对该服务进行熔断操作。即对该服务的请求立即返回特定的结果,避免请求积压。等一段时间后,恢复服务对外提供服务。如果服务还是无法对外服务,则再次触发熔断。

服务升降级

上面的流量控制和熔断都是相对比较「公平」的方法,主要是为了保证系统的可用性。在系统过载的情况下,无差别的对待所有的服务/接口。

不过对于一个系统来说,有些服务是核心服务而有些服务是非核心服务,对于核心服务来说,即使在系统过载的情况下也不能拒绝对外服务,否则这个系统实际就失去了它原有的价值。这个时候就需要非核心业务为核心业务让路,即在系统过载的时候,非核心服务让出系统资源,即服务降级,保障核心服务能稳定的对外提供服务。待系统负载正常后,再恢复非核心服务。

详细补充

流量控制

一般的流量控制模式有:

  • 控制并发,即限制 并发的总数量(比如数据库连接池、线程池)
  • 控制速率,即限制 并发访问的速率(如nginx的limitconn模块,用来限制瞬时并发连接数)
  • 控制 单位时间窗口内的请求数量(如Guava的RateLimiter、nginx的limitreq模块,限制每秒的平均速率)
  • 控制 远程接口调用速率
  • 控制 MQ的消费速率
  • 根据 网络连接数、网络流量、CPU或内存负载 等来限流。

对于微服务场景来说,控制速率是比较合适的流量控制方案。通常情况下,使用令牌桶算法来实现访问速率的控制,常用的令牌桶算法有两种:

  • 漏桶算法:水(请求)先进入到漏桶里,漏桶以一定的速度出水,当水流入速度过大会直接溢出。可以看出漏桶算法能强行限制数据的传输速率,但是某些情况下,系统可能需要允许某种程度的突发访问量,此时可以使用令牌桶算法。
  • 令牌桶算法:系统会以一个恒定的速度向桶里放入令牌。如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。令牌桶算法通过发放令牌,根据令牌的rate频率做请求频率限制,容量限制等。

流量控制算法在确定后也是基本不需要变化的,所以对于热部署的需求不是必要的。

另外流量控制可以前置,放到接入层来处理,一般的网络接入服务,如nginx是支持流量控制的。如果前期对流量控制没有太多的定制化需求,可以考虑基于nginx来进行处理。

熔断

服务熔断的实现思路:

  • 调用失败次数累积达到了阈值(或一定比例)则启动熔断机制
  • 此时对调用直接返回错误。待达到设置的时间后(这个时间一般设置成平均故障处理时间,也就是MTTR),进入半熔断状态
  • 此时允许定量的服务请求,如果调用都成功(或一定比例)则认为恢复了,关闭熔断;否则认为还没好,继续熔断

考虑到有较成熟的开源项目,推荐直接使用开源项目来处理。

服务升降级

一种服务升降级的方案可以基于阻塞队列来实现:

  • 网关接收到请求后,进入定长的阻塞队列
  • 消费线程从消费队列中获取请求来进行处理
  • 当生产速率大于消费速率,会导致队列中请求不断增加,当请求数量超过设定的阈值时,根据配置的服务升降级规则判定当前请求是否属于可降级的服务,如果属于可降级的服务,则根据配置的降级逻辑对该请求进行处理(比如直接拒绝);如果请求属于不可降级的服务,则依然添加到请求队列中

考虑到有较成熟的开源项目,推荐直接使用开源项目来处理。

流量统计,服务管控

网关可以统计后端服务的请求次数,并且可以实时地更新当前的流量健康状态,可以查看后端服务的流量状态及是否有熔断发生。

文档中心

网关结合Swagger,将后端的微服务暴露给网关,网关作为统一的入口给接口的使用方提供查看后端服务的API规范,不需要知道每一个后端微服务的Swagger地址,这样网关起到了对后端API聚合的效果。

日志审计

微服务网关可以作为统一的日志记录和收集器,进行统一监控,对服务URL粒度的日志请求信息和响应信息进行拦截。

资料参考:资料一 资料二

微服务网关(一)微服务的选择以及网关的功能相关推荐

  1. 微服务架构中配置中心的选择

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:r6d.cn/XsTR 目前公司内部微服务架构基础设 ...

  2. 可通过http获取远端服务信息_微服务基础——厉害了!API网关

    微服务刚刚诞生的时候,人们将服务进行拆分,实现服务之间的松耦合,并且每个服务有专门的团队维护,然后客户端直接和各个子服务进行交互.比如,订单,商品,会员服务. 那么这种客户端直接和后端服务交互的方式会 ...

  3. .NET微服务体系结构中为什么使用Ocelot实现API网关

    为什么要使用API网关而不是直接通信? 在微服务架构中,客户端应用程序通常需要使用来自多个微服务的功能.如果直接执行该消费,则客户端需要处理多个微服务端点以进行呼叫.当应用程序发展并引入新的微服务或更 ...

  4. 微服务架构-服务注册中心和服务网关(6.8) (转载)

    原文链接:微服务架构-服务注册中心和服务网关(6.8) 这篇文章还是基于SpringCloud开源框架体系来谈下对Eureka服务注册中心和Zuul服务网关在使用上的一些理解和说明.在使用微服务架构进 ...

  5. c++突破网关屏蔽_通过API网关实现微服务管控-限流,熔断和降级

    今天准备谈下基于API网关来实现微服务治理管控中的服务限流,熔断和降级方面的内容.在前面谈微服务架构的时候也谈到过类似通过Hystrix,Sentinel来是服务限流熔断.包括也不断地在谈去中心化架构 ...

  6. API 网关和微服务介绍

    文章目录 API 网关 壹 - 相关简介 一.RESTful 框架 二.微服务 三.API网关 网关和代理 优缺点 贰 - Spring Cloud 框架下的 API 网关实现 Eureka:服务发现 ...

  7. 万字长文解析:分布式架构、SOA、微服务架构、API网关、ESB服务总线架构之间的关联及演进

    1架构演进 架构十五年:改变的是形态,不变的是目的 业务驱动架构形态变化 过去十几年,随着互联网发展以及业务的多样化,系统的架构也在不断发生变化,总体上来说大体经历了从单体应用架构-垂直应用架构-分布 ...

  8. 马蜂窝如何利用 APISIX 网关实现微服务架构升级

    作者:董红帅,马蜂窝微服务体系建设以及基础服务能力建设专家. 马蜂窝作为旅行社交平台,是数据驱动的新型旅行电商.基于十余年的内容积累,马蜂窝通过 AI 技术与大数据算法,将个性化旅行信息与来自全球各地 ...

  9. 微服务网关鉴权:gateway使用、网关限流使用、用户密码加密、JWT鉴权

    点击上方"芋道源码",选择"设为星标" 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | ...

  10. API 网关在微服务中的应用

    目录 一.什么是 API 网关? 二.微服务架构对 API 网关的需求 三.API 网关在微服务架构中的工作 四.API网关的实现--问题和解决方案 可扩展性和性能 反应式编程模型 服务调用 服务发现 ...

最新文章

  1. Kotlin语法(基础)
  2. ExecutorService为创建的线程池ExecutorService pool = Executors.newFixedThreadPool(POOL_SIZE)
  3. python里面的之前打过的记忆信息-python中的if __name__ == 'main'
  4. nodeJS之crypto加密
  5. 日志 查看匹配内容的前后几行
  6. shell--printf
  7. 1亿以内素数的个数_神奇的素数
  8. Linux系统删掉多个文件
  9. 线程间通信 1全局变量2当前主对话框指针3发消息方式4 AfxBeginThread的返回值(为CWinThread类型的指针)5AfxGetApp...
  10. bzoj 1878: [SDOI2009]HH的项链 ——树状数组+ 差分
  11. mina的HTTP性能测试
  12. Webbench学习笔记二:getopt_long函数和build_request函数
  13. 开源字体lato fonts
  14. 蓝桥杯 C语言 试题 历届试题 格子刷油漆
  15. 轻松处理PHP开发中微信emoji表情mysql存储的问题
  16. AutoSAR Layered Software Architecture 分层软件体系架构(初级)
  17. 大数据和人工智能到底是什么关系
  18. 进阶必学之微服务架构下分布式事务解决方案,你不知道的58同城
  19. ppp服务器连通状态 失败移动,某局点MSR路由器PPPOE拨号IPCP阶段协商失败处理案例...
  20. 谷歌tts android手机自带引擎,自动下载android TTS引擎

热门文章

  1. 负指数分布的性质_负指数分布.ppt
  2. python2.0迅雷下载_【Tomato DualWan】迅雷离线下载完美教程
  3. 【字符编码】Unicode字符集与字符编码方式
  4. Cordova+Vue实现Android APP开发
  5. 第一章-网络安全行业
  6. 打卡小程序源码,微信小程序源码下载
  7. Ubuntu configuration-1 安装常用软件
  8. 在CentOS8.3上安装Vlmcsd-1113搭建Kms服务
  9. Windows下Postman安装以及汉化
  10. linux weblogic 安装报错,安装weblogic linux