• 微服务五种开源API网关实现组件对比


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

    高度可维护和可测试性

    与其他服务松散耦合

    且可独立部署

    能够由一个小团队开发

    现在很多公司企业想将自己的单体应用架构迁移到微服务架构,在这个问题上,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

  • 相关阅读:
    Linux 目录结构
    date命令--修改linux系统时间
    uniq linux下去除重复行命令
    Linux查看程序端口占用情况
    openfire连接登陆优化方案
    hdu 4848 搜索+剪枝 2014西安邀请赛
    经常使用ARM汇编指令
    一维DFT
    C++ lambda 表达式传递的变量默认不可变
    wm命令用法及LCD显示图标大小不正常时解决的方法
  • 原文地址:https://www.cnblogs.com/mxb0611/p/12102897.html
Copyright © 2020-2023  润新知