微服务网关实践
一. 为什么需要 网关
微服务下网关(API Gateway)是一个服务器,是系统的唯一入口,是统一管理API的一个网络关口、通道,是整个微服务平台所有请求的唯一入口,所有的客户端和消费端都通过统一的网关接入微服务。从面向对象设计的角度看,它与外观模式类似。API网关封装了系统内部架构,为每个客户端提供一个定制的API。它可能还具有其它职责,如身份验证、监控、负载均衡、缓存、请求分片与管理、静态响应处理。
API网关方式的核心要点是,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。通常,网关也是提供REST/HTTP的访问API。服务端通过API-GW注册和管理服务。
二. API网关的作用
微服务网关可以为微服务云平台提供统一的入口是API网关最主要的用途,除此之外,网关还可承担认证授权、监控、访问控制、路由、负载均衡、缓存、日志、多协议支持、限流限额、转换、映射、过滤、熔断、注册、服务编排、API管理、统计分析等等非业务性的功能。
一个好的API网关,是微服务体系中一个至关重要的基础设施。下面介绍几个API网关的核心功能 。
1) 负载均衡
微服务架构一般都有一个注册中心,后端服务启动时候会将自己的服务地址注册到注册中心,并和注册中心保持心跳,网关用过监听注册中心来进行服务的发现,并根据一定的负载均衡算法(随机、轮询、权重、hash等)将客户端的请求尽量均衡地转发到后端的各个服务中。
2)限流
限流的主要目的是防止类似DDos的恶意攻击导致服务器短时间内收到大量请求而造成的服务瘫痪。因此需要在接口层面做流量的控制,API网关统计一个时间窗口内针对某服务的请求数量,如果超过一定的阈值,则应拒绝继续转发请求到后端服务。时间窗口是滑动窗口,下一个时间窗口到来时,计数器清零。可以使用Redis的单线程模型和高性能的并发性来保证高并发下计数器计数准确。
3)身份认证鉴权
单体应用中,一般用户登录后,服务端会将用户信息存入session中,然后返回给用户(客户端)一个cookie作为登录后调用其他业务接口的凭证。而在微服务架构下,服务被拆分成多个实例,单体应用中的模式就很难试用,于是需要把鉴权的业务从各服务中抽离出来,单独建立一个权限认证服务,利用API网关入口作为切面拦截。网关拦截用户请求,获取请求中附带的用户身份信息,调用认证授权中心的服务,对请求者做身份认证,即确认当前访问者确实是其所声称的身份,检查该用户是否有访问该后台服务的权限。
4)灰度发布
灰度发布是服务发布时比较好的一种升级方式,它可以根据客户端的实际情况(版本、IP端等)进行请求分流,将一小部分测试者的请求切到新版本服务上,万一有问题也能及时定位修复,且不影响线上老版本的使用。
5)路由
网关的核心功能之一是路由转发,所以网关需要获取并维护一张路由表,这个路由表简单可以理解为一个服务名服务地址的映射表,有了这张路由表,网关就可以根据外界请求路径或者HTTP头中的服务信息,将请求转发到对应的后端目标微服务地址。
三. 常见5种微服务开源API网关组件介绍和对比
1) Kong
Kong是一个在 Nginx 中运行的Lua应用程序,并且可以通过lua-nginx-module模块实现的高性能网关API,Kong不是用这个模块编译Nginx,而是与 OpenResty 一起发布,OpenResty已经包含了 lua-nginx-module, OpenResty 不是 Nginx 的分支,而是一组扩展其功能的模块。
它的核心是实现数据库抽象,路由和插件管理,插件可以存在于单独的代码库中,并且可以在几行代码中注入到请求生命周期的任何位置。
Kong 官网:https://konghq.com/kong/
Kong 有三个主要组件:
1、Kong Server :基于nginx的服务器,用来接收 API 请求。
2、Apache Cassandra:用来存储操作数据。
3、Kong dashboard:官方推荐UI管理工具,也可以使用 restfull 方式 管理Admin api。
2) Zuul
Zuul 是一种提供动态路由、监视、弹性、安全性等功能的边缘服务。Zuul 是 Netflix 出品的一个基于 JVM 路由和服务端的负载均衡器。它的特点是可动态发布的过滤器机制, 包含了对请求的路由和过滤两个最主要的功能。
Zuul github地址:https://github.com/Netflix/zuul
Netflix架构体系和Zuul
1. 红绿部署
2. 埋点测试
3. 开发者测试分支
4. 金丝雀测试
5. 粘性金丝雀
6. 降级测试
3)Spring Cloud Gateway
Spring Cloud Gateway构建于 Spring 5+,基于 Spring Boot 2.x 响应式的、非阻塞式的 API。同时,它支持 websockets,和 Spring 框架紧密集成。