对于微服务网关或API网关,实际在前面讲微服务架构的文章中都谈到过。你可以将其理解为一个轻量的SOA服务总线。大型分布式系统中,为了保护内部服务而设计的一道屏障,可以提供高性能、高可用的 API托管服务,从而帮助服务的开发者便捷地对外提供服务,而不用考虑安全控制、流量控制、审计日志等问题,统一在网关层将安全认证,流量控制,审计日志,黑白名单等实现。网关的下一层,是内部服务,内部服务只需开发和关注具体业务相关的实现。网关可以提供API发布、管理、维护等主要功能。开发者只需要简单的配置操作即可把自己开发的服务发布出去,同时置于网关的保护之下。
首先我们看下GitHub上对Kong微服务网关的一些介绍
当我们决定对应用进行微服务改造时,应用客户端如何与微服务交互的问题也随之而来,毕竟服务数量的增加会直接导致部署授权、负载均衡、通信管理、分析和改变的难度增加。
面对以上问题,API GATEWAY是一个不错的解决方案,其所提供的访问限制、安全、流量控制、分析监控、日志、请求转发、合成和协议转换功能,可以解放开发者去把精力集中在具体逻辑的代码,而不是把时间花费在考虑如何解决应用和其他微服务链接的问题上。
在众多API GATEWAY框架中,Mashape开源的高性能高可用API网关和API服务管理层——KONG(基于NGINX)特点尤为突出,它可以通过插件扩展已有功能,这些插件(使用 lua 编写)在API请求响应循环的生命周期中被执行。于此同时,KONG本身提供包括HTTP基本认证、密钥认证、CORS、TCP、UDP、文件日志、API请求限流、请求转发及NGINX监控等基本功能。目前,Kong在Mashape管理了超过15,000个API,为200,000开发者提供了每月数十亿的请求支持。
我们来看下Kong API网关提供的一些基本功能:
API注册和服务代理
对于原始的API接口进行注册,并提供服务代理能力,即不同的API接口注册到网关后,网关可以提供一个统一的访问地址和接口。这和ESB总线的代理服务道理是一致的,在服务注册到API网关后,所有的内部服务对外界都是透明的,外部的服务访问必须要通过API网关进行。
该部分对应到Kong API网关的服务注册和Routing部分的功能和能力上。
负载均衡
由于Kong API网关本身底层也是基于Ngnix的,因此对应负载均衡的能力实际上是通过底层的Nginix来完成的。要在Kong上面实现负载均衡和API注册代理实际上需要分开为两个步骤进行。即首先是要配置负载均衡能力,建立upstream组,并添加多个Target,其次才是进行API注册。
http://www.cnblogs.com/chenjinxi/p/8744117.html
AUTHENTICATION实现
通过OAuth 2.0 Authentication插件实现user端口的用户访问限制。其具体步骤如下:
注册Oauth2插件, 配置参考
添加Consumer及Consumer对应的credentials
申请accesstoken并访问,如果不带token访问将被拒绝
安全和访问控制
支持最基本的基于IP的安全访问控制和黑白名单设置。即为相应的端口添加IP Restriction插件扩展,并设置白名单(只有名单内的IP可以访问API)。这和我们当前ESB的基于IP的访问控制和授权是一个道理。但是我们的ESB更加灵活,多了业务系统这一层,即可以直接对业务系统这层统一进行授权。
如果没有授权,在进行访问的时候将返回 Your IP address is not allowed的访问错误。
流量控制-Traffic Control
流量控制在当前Kong网关上,从GitHub上的参考来看,主要是实现了可以基于单位时间内的访问次数进行流量控制,如果超过了这个访问次数,则直接提示流控约束且无法访问的提示。当前的流量控制,暂时不支持基于数据量的流控。
当前的流控暂时没有看到微服务网关常用的熔断操作,即服务并发或服务响应时间大过某个临界值的时候,直接对服务进行熔断和下线操作。
日志Logging实现
通过File-log插件实现对于每次访问日志的获取,需要注意为日志文件写权限,日志格式参考Log Format。具体包括两个步骤。
1. 为端口添加File-log插件,并设置为日志文件路径设为:/tmp/file.log
2. 添加日志插件后,每次访问都会被记录
从用户手册来看,当前的 日志LOGGING是没有提供日志查询的前端功能界面的,如果需要的话还需要自己开发对应的日志查询功能。这个日志功能和我们当前的ESB总线的日志Log完全是类似的。但是我们ESB这块的能力更加强,包括后续的服务运行日志的统计分析和报表查看等。
初步来看,当前我们的ESB主要是缺少了负载均衡层的能力,缺少了对 OAuth 2.0 Authentication的集成,而这两块实现起来并不困难。同时我们也看到,完全可以采用SpringCLoud框架体系里面的Zuul来实现微服务网关能力,同时将Zuul开发的API接口再次注册到ESB总线上面。对于Zuul微服务网关本身提供 OAuth 2.0集成和负载均衡能力完全是没有任何问题的。