微服务架构是当下比较流行的一种架构风格,它是一种以业务功能组织的服务集合,能够持续交付、快速部署、更好的可扩展性和容错能力,并且还使组织更容易去尝试新技术栈。微服务具备几个关键特征:nginx
如今不少公司企业想将本身的单体应用架构迁移到微服务架构,在这个问题上,Martin Fowler提出了3个前提,而Phil Calcado对其进行了扩展以下:spring
今天咱们主要讲讲易于访问的网关,也就是 API 网关。数据库
假设咱们要使用微服务架构构建一个电商平台,如下多是一些潜在的服务:后端
等等,客户端应该怎么访问这些服务呢?原来单体应用的状况咱们都知道,都在一个服务器上部署,直接访问IP+端口+服务前缀便可,如今微服务架构下,每一个服务均可以独立部署,而且是由不一样的开发团队开发的,难道咱们要这样访问吗?api
理论上每一个服务都有端点能够访问,可是客户端就须要记录全部服务的端点,发起5次请求,如今仍是5个服务,若是以后扩展多了呢?对客户端来讲就是一个灾难,随之带来的就是安全性问题、扩展性问题等,因此这种客户端直接与每一个服务交互是不可取的,一般,更好的方式是使用 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 路由和服务端的负载均衡器。
由上述对比表格中能够看出:从开源社区活跃度来看,无疑是Kong和Traefik较好;从成熟度来看,较好的是Kong、Tyk、Traefik;从性能角度来看,Kong要比其余几个领先一些;从架构优点的扩展性来看,Kong、Tyk有丰富的插件,Ambassador也有插件但很少,而Zuul是彻底须要自研,但Zuul因为与Spring Cloud深度集成,使用度也很高,近年来Istio服务网格的流行,Ambassador由于可以和Istio无缝集成也是至关大的优点。
具体使用选择仍是须要依据具体的业务场景,咱们在参考连接中收集了一些性能对比,你们能够作下参考。
参考连接