微服务网关(一)微服务的选择以及网关的功能
网关项目为什么要使用微服务
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粒度的日志请求信息和响应信息进行拦截。
资料参考:资料一 资料二
微服务网关(一)微服务的选择以及网关的功能相关推荐
- 微服务架构中配置中心的选择
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:r6d.cn/XsTR 目前公司内部微服务架构基础设 ...
- 可通过http获取远端服务信息_微服务基础——厉害了!API网关
微服务刚刚诞生的时候,人们将服务进行拆分,实现服务之间的松耦合,并且每个服务有专门的团队维护,然后客户端直接和各个子服务进行交互.比如,订单,商品,会员服务. 那么这种客户端直接和后端服务交互的方式会 ...
- .NET微服务体系结构中为什么使用Ocelot实现API网关
为什么要使用API网关而不是直接通信? 在微服务架构中,客户端应用程序通常需要使用来自多个微服务的功能.如果直接执行该消费,则客户端需要处理多个微服务端点以进行呼叫.当应用程序发展并引入新的微服务或更 ...
- 微服务架构-服务注册中心和服务网关(6.8) (转载)
原文链接:微服务架构-服务注册中心和服务网关(6.8) 这篇文章还是基于SpringCloud开源框架体系来谈下对Eureka服务注册中心和Zuul服务网关在使用上的一些理解和说明.在使用微服务架构进 ...
- c++突破网关屏蔽_通过API网关实现微服务管控-限流,熔断和降级
今天准备谈下基于API网关来实现微服务治理管控中的服务限流,熔断和降级方面的内容.在前面谈微服务架构的时候也谈到过类似通过Hystrix,Sentinel来是服务限流熔断.包括也不断地在谈去中心化架构 ...
- API 网关和微服务介绍
文章目录 API 网关 壹 - 相关简介 一.RESTful 框架 二.微服务 三.API网关 网关和代理 优缺点 贰 - Spring Cloud 框架下的 API 网关实现 Eureka:服务发现 ...
- 万字长文解析:分布式架构、SOA、微服务架构、API网关、ESB服务总线架构之间的关联及演进
1架构演进 架构十五年:改变的是形态,不变的是目的 业务驱动架构形态变化 过去十几年,随着互联网发展以及业务的多样化,系统的架构也在不断发生变化,总体上来说大体经历了从单体应用架构-垂直应用架构-分布 ...
- 马蜂窝如何利用 APISIX 网关实现微服务架构升级
作者:董红帅,马蜂窝微服务体系建设以及基础服务能力建设专家. 马蜂窝作为旅行社交平台,是数据驱动的新型旅行电商.基于十余年的内容积累,马蜂窝通过 AI 技术与大数据算法,将个性化旅行信息与来自全球各地 ...
- 微服务网关鉴权:gateway使用、网关限流使用、用户密码加密、JWT鉴权
点击上方"芋道源码",选择"设为星标" 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | ...
- API 网关在微服务中的应用
目录 一.什么是 API 网关? 二.微服务架构对 API 网关的需求 三.API 网关在微服务架构中的工作 四.API网关的实现--问题和解决方案 可扩展性和性能 反应式编程模型 服务调用 服务发现 ...
最新文章
- Kotlin语法(基础)
- ExecutorService为创建的线程池ExecutorService pool = Executors.newFixedThreadPool(POOL_SIZE)
- python里面的之前打过的记忆信息-python中的if __name__ == 'main'
- nodeJS之crypto加密
- 日志 查看匹配内容的前后几行
- shell--printf
- 1亿以内素数的个数_神奇的素数
- Linux系统删掉多个文件
- 线程间通信 1全局变量2当前主对话框指针3发消息方式4 AfxBeginThread的返回值(为CWinThread类型的指针)5AfxGetApp...
- bzoj 1878: [SDOI2009]HH的项链 ——树状数组+ 差分
- mina的HTTP性能测试
- Webbench学习笔记二:getopt_long函数和build_request函数
- 开源字体lato fonts
- 蓝桥杯 C语言 试题 历届试题 格子刷油漆
- 轻松处理PHP开发中微信emoji表情mysql存储的问题
- AutoSAR Layered Software Architecture 分层软件体系架构(初级)
- 大数据和人工智能到底是什么关系
- 进阶必学之微服务架构下分布式事务解决方案,你不知道的58同城
- ppp服务器连通状态 失败移动,某局点MSR路由器PPPOE拨号IPCP阶段协商失败处理案例...
- 谷歌tts android手机自带引擎,自动下载android TTS引擎
热门文章
- 负指数分布的性质_负指数分布.ppt
- python2.0迅雷下载_【Tomato DualWan】迅雷离线下载完美教程
- 【字符编码】Unicode字符集与字符编码方式
- Cordova+Vue实现Android APP开发
- 第一章-网络安全行业
- 打卡小程序源码,微信小程序源码下载
- Ubuntu configuration-1 安装常用软件
- 在CentOS8.3上安装Vlmcsd-1113搭建Kms服务
- Windows下Postman安装以及汉化
- linux weblogic 安装报错,安装weblogic linux