当先锋百科网

首页 1 2 3 4 5 6 7

微服务架构是当下比较流行的一种架构风格,它是一种以业务功能组织的服务集合,可以持续交付、快速部署、更好的可扩展性和容错能力,而且还使组织更容易去尝试新技术栈。微服务具有几个关键特征:

  • 高度可维护和可测试性

  • 与其他服务松散耦合

  • 且可独立部署

  • 能够由一个小团队开发

 

现在很多公司企业想将自己的单体应用架构迁移到微服务架构,在这个问题上,Martin Fowler提出了3个前提,而Phil Calcado对其进行了扩展如下:

  • 快速配置计算资源

  • 基本监控

  • 快速部署

  • 易于配置存储

  • 易于访问网关

  • 认证、授权

  • 标准化的 RPC

 

今天我们主要讲讲易于访问的网关,也就是 API 网关。

 

 

为什么需要 API 网关

假设我们要使用微服务架构构建一个电商平台,以下可能是一些潜在的服务:

  • 购物车服务

  • 订单服务

  • 商品服务

  • 评论服务

  • 库存服务

等等,客户端应该怎么访问这些服务呢?原来单体应用的情况我们都知道,都在一个服务器上部署,直接访问IP+端口+服务前缀即可,现在微服务架构下,每个服务都可以独立部署,并且是由不同的开发团队开发的,难道我们要这样访问吗?

理论上每个服务都有端点可以访问,但是客户端就需要记录所有服务的端点,发起5次请求,现在还是5个服务,如果之后扩展多了呢?对客户端来说就是一个灾难,随之带来的就是安全性问题、扩展性问题等,所以这种客户端直接与每个服务交互是不可取的,通常,更好的方式是使用 API 网关。

API 网关是客户端访问服务的统一入口,API 网关封装了后端服务,还提供了一些更高级的功能,例如:身份验证、监控、负载均衡、缓存、多协议支持、限流、熔断等等,API 网关还可以针对不同的客户端定制不同粒度的 API,上面例子中修改架构后如下:

 

API 网关的优缺点

 

API 网关的好处是显而易见的,封装了应用程序的内部结构,为不同客户端提供不同粒度的 API,同时网关自身也提供了一些高级功能,也减少了客户端与应用程序之间的往返次数,使客户端代码更优雅。

同时使用网关也存在一些缺点,增加了一个新的组件,增加了整个应用架构的复杂度,一个通俗的道理,你做的越多你犯错的风险也越高,网关不可用很可能导致整个应用架构崩溃,当然现在有各种各样的方案,能防止网关崩溃,它也可能存在瓶颈风险。

使用网关有利有弊,我个人而言,利肯定是大于弊的,我们尽可能的将弊端降到最低。

 

 

API 网关一些实现

使用一个组件时,尤其是这种比较流行的架构,组件肯定存在开源的,我们不必自己去从零开始去实现一个网关,自己开发一个网关的工作量是相当可观的,现在比较流行的开源 API 网关如下所示:

 

Kong

Kong是一个在 Nginx 中运行的Lua应用程序,并且可以通过lua-nginx模块实现,Kong不是用这个模块编译Nginx,而是与 OpenResty 一起发布,OpenResty已经包含了 lua-nginx-module, OpenResty 不是 Nginx 的分支,而是一组扩展其功能的模块。

 

它的核心是实现数据库抽象,路由和插件管理,插件可以存在于单独的代码库中,并且可以在几行代码中注入到请求生命周期的任何位置。

 

Traefik

Traefik 是一个现代 HTTP 反向代理和负载均衡器,可以轻松部署微服务,Traeffik 可以与您现有的组件(Docker、Swarm,Kubernetes,Marathon,Consul,Etcd,…)集成,并自动动态配置。

 

Ambassador

Ambassador 是一个开源的微服务 API 网关,建立在 Envoy 代理之上,为用户的多个团队快速发布,监控和更新提供支持,支持处理 Kubernetes ingress controller 和负载均衡等功能,可以与 Istio 无缝集成。

 

Tyk

Tyk是一个开源的、轻量级的、快速可伸缩的 API 网关,支持配额和速度限制,支持认证和数据分析,支持多用户多组织,提供全 RESTful API。基于 go 编写。

 

Zuul

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

 

 

API 网关实现对比

 

 

Kong

Traefik

Ambassador

Tyk

Zuul

基本

主要用途

企业级API管理

微服务网关

微服务网关

微服务网关

微服务网关

学习曲线

适中

simple

simple

适中

simple

成本

开源/企业版

开源

开源/pro

开源/企业版

开源

社区star

20742

21194

1719

4299

7186

配置

配置语言

Admin Rest api, Text file(nginx.conf 等)

TOML

YAML(kubernetes annotation)

Tyk REST API

REST API,YAML静态配置

配置端点类型

命令式

声明式

声明式

命令式

命令式

拖拽配置

yes

no

no

no

no

管理模式

configurable

decentralised, self-service

decentralised, self-service

decentralised, self-service

decentralised, self-service

部署

kubernetes

适中(k8s yaml,helm chart)

easy

easy

适中(k8s yaml,helm chart)

适中(k8s yaml,helm chart)

Cloud IAAS

high

easy

N/A

easy

easy

Private Data Center

high

easy

N/A

easy

easy

部署模式

金丝雀(企业版)

金丝雀

金丝雀,shadow

金丝雀

金丝雀

state

postgres,cassandra

kubernetes

kubernetes

redis

内存文件

可扩展性

扩展功能

插件

自己实现

插件

插件

自己实现

扩展方法

水平

水平

水平

水平

水平

功能

服务发现

动态

动态

动态

动态

动态

协议

http,https,websocket

http,https,grpc,websocket

http,https,grpc,websocket

http,https,grpc,websocket

http,https

基于

kong+nginx

traefik

envoy

tyk

zuul    

ssl 终止

yes

yes

yes

yes

no

websocket

yes

yes

yes

yes

no

routing

host,path,method

host,path

host,path,header

host,path

 

限流

yes

no

yes

yes

需要开发

熔断

yes

yes

no

yes

需要其他组件

重试

yes

yes

no

yes

yes

健康检查

yes

no

no

yes

yes

负载均衡算法

轮询,哈希

轮询,加权轮询

加权轮询

轮询

轮询,随机,加权轮询,自定义

权限

Basic Auth, HMAC, JWT, Key, LDAP, OAuth 2.0, PASETO, plus paid Kong Enterprise options like OpenID Connect

basic

yes

HMAC,JWT,Mutual TLS,OpenID Connect,基本身份验证,LDAP,社交OAuth(例如GPlus,Twitter,Github)和传统基本身份验证提供程序

开发实现

tracing

yes

yes

yes

yes

需要其他组件

istio集成

no

no

yes

no

no

dashboard

yes

yes

grafana,Prometheus

yes

no

 

 

总结

 

由上述对比表格中可以看出:从开源社区活跃度来看,无疑是Kong和Traefik较好;从成熟度来看,较好的是Kong、Tyk、Traefik;从性能角度来看,Kong要比其他几个领先一些;从架构优势的扩展性来看,Kong、Tyk有丰富的插件,Ambassador也有插件但不多,而Zuul是完全需要自研,但Zuul由于与Spring Cloud深度集成,使用度也很高,近年来Istio服务网格的流行,Ambassador因为能够和Istio无缝集成也是相当大的优势。

 

具体使用选择还是需要依据具体的业务场景,我们在参考链接中收集了一些性能对比,大家可以做下参考。

 

参考链接

  • https://www.bbva.com/en/api-gateways-kong-vs-tyk/ kong vs tyk

  • https://stackshare.io/stackups/kong-vs-traefik kong vs traefik

  • https://blog.getambassador.io/envoy-vs-nginx-vs-haproxy-why-the-open-source-ambassador-api-gateway-chose-envoy-23826aed79ef envoy vs nginx

  • https://engineering.opsgenie.com/comparing-api-gateway-performances-nginx-vs-zuul-vs-spring-cloud-gateway-vs-linkerd-b2cc59c65369 nginx vs zuul