java后台常用开发框架学习

网关(API Gateway)与ESB之争

2021-02-22  本文已影响0人  磐不渝

本文节选自本人参与编写的《金融企业数字化中台》一书,感兴趣的朋友请自行查找。


金融企业数字化中台.png

要ESB还是要网关???

在互联网技术的引领下,微服务架构得以流行,对于服务集成相关工作,首当其冲就是由网关(API Gateway )负责。乍一看貌似没有ESB什么事儿,实则不然,金融企业IT建设起步早、规模大,数以百计的业务系统在运行,而且金融企业IT架构本身就是分布式的架构,也完全没有必要全部使用微服务相关技术栈全面改造,因此提全面微服务化那就是纸上谈兵。我们必须承认ESB在金融企业应用系统间的服务枢纽地位牢不可破,仍将持续发挥着重要的作用。是ESB曾经接过了EAI的枪,把系统间通过EAI Hub 和Agent数据集成的方式,转向了面向服务的标准化集成方式。金融企业内部的核心系统、管理系统、渠道类系统之间仍存在这技术和协议的差异,正是因为在SOA时代实施了ESB,系统间服务集成才得以统一成基于HTTP+XML协议的Web Service标准,变得标准化、规范化和可治理。

但我们通过这段从数据到服务集成的历史,更能够认识到企业和用户多年来不断变化和发展的需求。在已有业务系统之间服务打通仍是ESB的核心任务。面对新一代数字化转型中的业务的需求,需要能够围绕一个简单,灵活的标准协议对所有新应用进行连接,相对而言Web Service协议略显沉重,ESB由于其集中式枢纽的地位,快速响应变更对于它来说也不是很合适。轻量,快速响应变化且可配置的敏捷集成执行能力对于数字化企业至关重要。互联网类的业务率先开始采用微服务的技术栈建设,那么这就是API Gateway 网关的用武之地了,网关需要精心设计为数字业务转型加速,需要让应用集成更简单。网关使用了更轻量级的HTTP协议和RESTful 风格的API,可以更方便的打通移动端、物联网设备、云服务等等多渠道的应用。

因此我们的结论是,在数字化转型时代,在金融企业中 ESB 与API Gateway是共存的,都是IT系统之间的服务集成平台。ESB作为系统之间的服务集成的枢纽,网关则在微服务架构体系的业务领域内部进行系统之间集成通信。不论是ESB还是网关,作为服务集成平台的建设来说,重点应该关注的内容包含:身份验证、权限管控、服务路由能力增强等方面。复杂的服务组装、数据、协议转换工作通常需要编码开发,灵活度低,容易产生故障,不建议在服务集成平台中实施,这类工作建议交给负责交易流应用实施的平台负责。下面我们首先从身份验证说起。

服务集成平台应该负责身份验证

服务集成平台作为业务系统的API入口,当其面向外网的访问者时服务集成平台还是内外网的分界,访问令牌验证理应由服务集成平台负责,不应该将令牌验证的事情交给服务提供者,这样既能避免未经验证的请求进入内网,又能够简化服务提供端的代码,服务提供端无需处理不同类型客户端的验证。

身份验证方案分析

服务集成平台验证访问令牌有两种方案:服务集成平台委托认证服务验证、服务集成平台直接验证,说明如下:

网关访问IAM校验令牌.png

上图为网关作为服务集成平台时,委托IAM进行身份令牌校验的示意图,说明如下:

  1. 客户端成功认证后,使用UUID类型的访问令牌调用服务集成平台上的服务
  2. 由于UUID类型令牌不包含客户端的信息,服务集成平台需要委托认证服务校验令牌
  3. 令牌检查合法后,将请求路由到服务提供者
  4. 应用中也无法解析令牌,需要根据UUID令牌到认证服务中获取用户信息
网关直接校验令牌.png

上图为网关作为服务集成平台时,自身负责令牌校验的示意图,说明如下:

  1. 客户端成功认证后,使用JWT令牌调用服务集成平台上的服务
  2. 服务集成平台自己直接解密JWT令牌进行校验
  3. 令牌检查合法后,将请求路由到服务提供者
  4. 应用受到请求后,如果需要更多权限信息,如果可以根据Token去权限管理服务获取权限信息(非必须步骤,需要时添加)。

上述两方案中,方案一的令牌是无业务含义的身份标识字符串,每次收到请求服务集成平台都去认证服务器认证,对认证服务的性能压力较大。方案二中IAM颁发的令牌中包含部分客户端或用户信息,使用JWT加密,认证服务将验证方式或SDK提供给了负责认证的服务集成平台。对于认证服务器来说,减少了每次请求令牌认证带来的通信次数,负担变轻了。

推荐采用方案二实现令牌检查,需要注意的是方案二中的JWT令牌中仅包含必要的信息即可,不要放太多的角色权限信息。后续功能中需要额外的信息时,可以根据令牌再去认证服务中获取。如果令牌中存放了很多的权限数据,一旦后台的授权数据发生变化,令牌中的权限数据与实际认证服务的权限会存在不一致的问题,只能强制用户下线重新登录。

JWT令牌是防篡改的,但并不加密,如需要存储到浏览器存储中,建议采用JWT+JWE方式进行令牌加密。令牌中存放必要少量数据即可,避免滥用。多数服务器通常会对Http header、cookie长度做限制。

系统内部应用之间服务建议直通,无需经过服务集成平台

服务集成平台应该由独立团队负责运维管理,否则对于单个系统来说多维护一组服务集成服务过于繁琐。API变更发布、内部联调验证还得跨团队协调实在不可行。推荐系统内直通不经过服务集成平台,而跨系统访问必须走服务集成平台。要做到这一点,应用也需要识别请求来源,进行客户端认证,这种认证方案没必要太复杂,应用只应该允许信任的服务集成平台和系统内部应用程序访问其服务,不允许系统外部请求绕过服务集成平台直接调用,因此,需要在服务集成平台和系统内部应用之间这个小范围内建立信任,常见方案有两种:

方案一优点是实现简单,缺点是安全级别略低,常见的企业架构中,服务集成平台和业务系统会是不同团队甚至不同的厂商负责开发维护,内部令牌共享给了其他团队负责的服务集成平台,存在一定的风险。方案二相比方案一略复杂一点,安全性更高,系统内互通用系统专属保密令牌,系统和服务集成平台认证使用了服务集成平台提供的安全令牌检查。两种方案可根据实际需求选择。

服务集成平台应该对API进行权限管控

我们先来看三个问题:

  1. 通过认证的API客户端能够访问服务集成平台开放的所有API吗?
  2. 通过认证的用户能够调用所有API吗?
  3. 通过认证的用户允许调用修改订单的接口,那么他能修改所有人的订单吗?

很显然绝大多数场景下上述三个问题答案都是"不能"。在绝大多数业务场景中除了对访问者的身份认证之外,我们还需要再进一步控制权限。

API Key与身份认证结合管控

如果访问者是API客户端时,API调用的权限需由服务集成平台进行控制。建议采用“消费者先订阅一组API,订阅成功后才允许访问”的授权模式,服务集成平台应该仅允许API客户端访问其订阅过的API 。 具体实现方法就是绝大多数服务集成平台都会提供的基于API Key控制API访问的方式。需要注意的是,仅使用API key的访问控制是不够的。API Key是在服务集成平台订阅API时生成的一串唯一编号,并不具备识别客户端身份的能力。就好比以前买火车票是不实名的,谁拿到火车票,都可以乘坐对应车次。火车票实名制之后,首先需要核验身份证,核验通过后才能购票乘车。如果证票不符,则不允许乘车。

将客户端认证和API Key配合进行访问认证和权限校验才是个更安全的方案。

API 权限控制.png

上图为网关作为服务集成平台时,访问令牌结合API Key的认证鉴权示意图,说明如下:

用户权限服务集成平台管不管?

用户访问的功能权限或数据权限不建议交给服务集成平台管控,原因是服务集成平台仅能支持基于API Path授权,而实际需要控制的用户权限有很多,如菜单、功能、数据等。如果由服务集成平台控制用户权限,管少了不满足需求,管多了就要耦合太多应用数据。跨团队直接沟通协调、问题定位等分工责任也难界定。

因此推荐用户权限由业务应用自行管控。每个业务系统内部如果需要控制用户权限,可以将系统内部的权限在统一权限管理服务中配置。应用从权限中心获取数据进行用户权限控制。如没有权限中心,也可以由应用自身维护权限数据。对于权限管理是业务系统自治还是集中管控,一般根据企业自身的需求特点决定即可。

服务集成平台应提供更强大的请求路由能力

服务集成平台要能够融入到微服务生态中

建设服务集成平台要考虑的就是能够融入微服务生态中。与微服务基础服务中的注册中心、配置中心、监控中心、日志中心等基础组件集成,能够大大加强服务集成平台的服务治理、路由、运维等能力。

服务集成平台要支持应用分组路由(版本控制、灰度发布)

基于可靠性、性能方面考虑,通常一个服务提供者应用会以集群形式对外提供服务。随着快速响业务应变化的需求越来越多,应用通常会进行多版本并行迭代快速交付。比如说,某个应用在生产系统同时运行了两个集群,也就是说同样一个AppId 对应的多个进程实例,实际上再注册中心中划分为两个组,一组为之前上线运行的稳定版,另一组为新上线的版本。这种场景下,就要求服务集成平台能够支持对同一个AppId进行分组路由,不同组的应用API对应的版本不同。这个场景就是我们常说的通过服务集成平台进行API的版本控制,服务集成平台支持了应用分组路由的能力,也就意味着支持了应用灰度发布

网关服务路由示意.png
服务集成平台要支持动态负载均衡

一个服务提供者应用集群中会存在多个进程实例,这些进程实例会与注册中心通讯,报告自身的健康状况。而服务集成平台则须支持通过注册中心获取应用的实例列表信息,用以在服务路由过程中的负载均衡调用。借助了注册中心的能力,集群内的应用实例增加或减少,服务集成平台均可在段时间内获悉,因此这种模式下,服务集成平台对应用的动态负载均衡也能够很好的支持。

对于负载均衡策略服务集成平台应该支持常见的几种,如:轮循、随机、哈希、一致性哈希、权重比例等,还需要提供良好的扩展能力用以针对企业应用的特点进行扩展。

服务集成平台要具备熔断、降级、限流能力

服务熔断、降级、限流等概念均是从可用性和可靠性出发,为了防止系统崩溃而采用的一些保护性手段。对于服务消费端的体验是类似的,都是部分服务暂时不可用。不同的是这三者的触发时机有所不同。分别说明如下:

转载本文需注明出处:网关(API Gateway)与ESB之争

上一篇下一篇

猜你喜欢

热点阅读