API网关在微服务中的应用

做者:老顾算法

转载请声明出处!api

前言

如今的互联网产品技术架构,若是没有上微服务架构,都感受被同行鄙视,太low了。在微服务架构中,不一样的微服务有不一样的请求地址,各个微服务之间经过互相调用完成用户请求。客户端要完成用户请求,须要调用不少微服务接口。跨域

好比:缓存

用户查看一个商品详情页,详情页包含了商品基本信息,商品价格,库存信息,评论信息,促销活动信息等,而这些信息是不一样的微服务提供的;如:库存服务,促销服务,评论系统等。安全

用户要查看商品详情页,须要让客户端调用多个微服务,且客户端直接与各个微服务通讯,会有如下的问题:服务器

一、客户端屡次请求不一样的微服务,增长了客户端的复杂度。网络

二、屡次网络请求,耗时增长。架构

三、微服务的请求地址不一样,很容易引发跨域问题。负载均衡

四、客户端请求微服务须要保证安全认证,但每一个服务都要进行认证。框架

五、未来的项目重构,微服务的变化,如:把多个服务合并一个服务,或一个服务拆分多个服务;这样会致使客户端请求须要重构

六、限流、降级、监控等需求,会致使实现复杂,每一个服务都要实现,重复代码。

遇到这些问题,咱们怎么去解决呢?咱们只要增长一个API网关。

什么是API网关?

API网关是一个服务器,是系统的惟一入口。从面向对象设计的角度看,它与外观模式相似。API网关封装了系统内部架构,为每一个客户端提供一个API入口

API拥有一些职责,如身份验证、监控、负载均衡、缓存、流控。API网关方式的核心要点是,全部客户端和消费端都经过统一的网关接入微服务,在网关层处理全部的非业务功能。

简洁图:

生产图:

网关优势

经过上图中API网关作为系通通一入口,实现了对各个微服务间的整合,同时又作到了对客户端友好,屏蔽系统的复杂性和差别性。对比以前无API网关模式,API网关具备几个比较重要的优势:

一、网关能够和微服务注册中心链接,动态增长微服务应用,进行服务扩容

二、网关对于没法访问的服务,作到自动熔断

三、网关能够方便实现蓝绿部署、金丝雀发布

四、网关可处理微服务公共需求,简化微服务职责

五、网关可帮助客户端实现负载均衡

下面老顾就用图解的方式进行说明

接口优化

咱们发现各个微服务的接口返回体是不同的,在以前没有网关的时候,客户端获取商品id为1的商品信息时,须要分别请求商品信息服务、价格服务、库存服务等,才能得到完整的商品信息。客户端自行进行数据组装处理。有了网关这个屡次接口请求就彻底的交给网关进行处理,客户端只要请求/good/1一个接口就好了,网关会请求多个微服务,把多个微服务返回的值进行合并,一次性返回完整的信息。简化了客户端请求接口的复杂性。

注意:有些业务数据,不必定要同步返回给客户端,也许异步会更好,根据用户体验,业务需求而定。如:促销价格的话,也许就须要客户端单独去请求了,而不是跟商品基础信息一块儿同步返回。具体要看业务哦!

中心化

一、在实际业务中,不少提供的微服务接口,是须要身份认证的;

二、还有就是对外部的流量控制,防止流量过大,把总体系统搞崩溃;须要预估系统可以支撑的流量。

三、访问日志,监控分析

以上的需求,每一个微服务都须要,且跟具体业务无关;这种相似的需求,交给网关处理,再适合不过了。由网关统一处理,由于网关是入口,统一处理更加可控,简洁。让微服务接口作业务相关的事情上面。这就是中心化的思想,集中处理

负载均衡

在实际的部署应用中,当应用系统面临大量访问,负载太高时,一般咱们会增长服务数量来进行横向扩展,使用集群来提升系统的处理能力。此时多个服务经过某种负载算法分摊了系统的压力,咱们将这种多节点分摊压力的行为称为负载均衡

网关为入口,由网关与微服务进行交互,因此网关必需要实现负载均衡的功能;网关会获取微服务注册中内心面的服务链接地址,再配合一些算法选择其中一个服务地址,进行处理业务。这个属于客户端侧的负载均衡,由调用方去实现负载均衡逻辑。

主流注册中心Eureka、Zookeeper等; 负载均衡的算法通常有随机,轮询,权重,负载等。

服务熔断

在现实生产环境中,会常常遇到某个服务忽然中止了工做,而后返回了大量的错误。这个时间API网关能够实现断路器(circuit breakers)的能力,也就是说超过了指定的阈值,API网关就会中止发送请求到那些失败的服务。

这样就给了咱们时间来分析日志,实现修复以及发包更新。一般当你发现一个模块下的某个实例失败后,这时候这个模块依然还会接收流量,而后这个有问题的模块还调用了其余的模块,这样就会发生级联故障,或者叫雪崩

断路器经过简单的断开流量的方式,这样就不会有新的请求到达那些有问题的实例,这时候咱们就有相对充分的时间来修复和解决问题

灰度发布

又称金丝雀发布,起源是,矿井工人发现,金丝雀对瓦斯气体很敏感,矿工会在下井以前,先放一只金丝雀到井中,若是金丝雀不叫了,就表明瓦斯浓度高。

看看灰度发布逻辑

在灰度发布开始后,先启动一个新版本应用,可是并不直接将流量切过来,而是测试人员对新版本进行线上测试,启动的这个新版本应用,就是咱们的金丝雀。若是没有问题,那么能够将少许的用户流量导入到新版本上,而后再对新版本作运行状态观察,收集各类运行时数据,若是此时对新旧版本作各类数据对比,就是所谓的 A/B测试。

新版本没什么问题,那么逐步扩大范围、流量,把全部用户都迁移到新版本上面来

这种发布,经过网关就能够很好的实现,网关经过流控模块,进行控制分流。

现有网关框架

一、Tyk:Tyk是一个开放源码的API网关,它是快速、可扩展和现代的。Tyk提供了一个API管理平台,其中包括API网关、API分析、开发人员门户和API管理面板。Trk 是一个基于Go实现的网关服务。

二、Kong:Kong是一个可扩展的开放源码API Layer(也称为API网关或API中间件)。Kong 在任何RESTful API的前面运行,经过插件扩展,它提供了超越核心平台的额外功能和服务。

三、Orange:和Kong相似也是基于OpenResty的一个API网关程序,是由国人开发的。

四、Netflix zuul:Zuul是一种提供动态路由、监视、弹性、安全性等功能的边缘服务。Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器。

五、Spring Cloud Gateway:Spring Cloud Gateway是基于Spring 框架5.0版本和Spring Boot 2.0的版本构建,提供路由等功能。

六、apiaxle:Nodejs 实现的一个 API 网关。

七、api-umbrella:Ruby 实现的一个 API 网关。

总结

今天老顾有关网关的功能,就介绍到这里;网关是个很是核心组件,小伙伴们要多多了解,实战哦。

你的赞和关注是我继续创做的动力~

相关文章
相关标签/搜索