阿里妹导读:FaaS—Function as a service,函数即服务。它是2014年由于亚马逊的AWS Lambda的兴起,而被大家广泛认知。FaaS能力是NBF中的一项非常重要的能力,NBF是一个非典型的FaaS架构,但是具备了典型的FaaS能力。文章将详细介绍NBF的FaaS容器架构、服务发布、服务路由和强大的Serverless能力以及NBF-FaaS在阿里大促期间的实践心得。
Event Sources Function 事件驱动的集合;
Function Instances 提供服务的Function或微服务;
FaaS Controller 管理Function的控制服务,比如典型的API Gateway或者BFF(Backend For Front)等;
Platform Services Function依赖的平台服务,如权限管理 API、对象存储服务等。
服务发布:把Function/Bundle快速发布成服务的能力。
服务路由:服务多态,降级和Mock的路由能力。
服务管理:基于SPI和Bundle的版本管理和服务启停能力。
服务运维:服务的Serverless能力,混部能力,灰度能力和容灾降级能力等 。
a. 容器与Bundle通信:容器提供了import机制,通过这种方式Bundle就可以使用容器能力,比如Spring的context托管,比如AOP能力
<imported> <packages> <package>org.springframework</package> <package>org.apache.commons.logging</package> <package>org.aopalliance</package> <package>org.aspectj</package> </packages></imported>
b. Bundle隔离:NBF容器会为每个Bundle建立独立沙箱,从加载机制上保证了Bundle代码级别隔离,避免Bundle之间的类和资源冲突。
c. Bundle之间通信:NBF容器持有BundleContext的全局管理器,支持Bundle把需要提供给其他Bundle使用的Context放到全局管理器中,从而实现了Bundle之间的通信。
依据路由表加载Bundle ;
通过NBF Framework加载和启动Bundle ;
通过NBF Framework加载和启动服务发布的Plugin 。
@AutowiredServiceA serviceA;serviceA.invoke(params);
(2)Broker SPI调用方式:
@AutowiredBundleBroker bundleBroker;bundleBroker.get(ServiceA.class).invoke(params);
@DynamicInjectServiceA serviceA;serviceA.invoke(params);
4.3.1.1 BundleProxy
BundleProxy可以简单理解成是对Bundle运行的代理机制,比如Bundle的主动熔断和被动降级这些能力都是通过BundleProxy实现的,因为这些特性对于每个运行Bundle都是统一的机制。
4.3.1.2 服务发现
服务发现主要职责怎么找到需要调用的服务,怎么生成调用服务的URI,拿HSF的服务寻址策略来对比,整个机制就简单了 HSF的寻址URI: Proxy://IP:port/service/version/method 对于Broker服务发现 IP和port对应的容器本身的网络信息,这些可以通过APPName或者Armory分组以及未来serverless后的GroupId来获取 serviceName,version这些数据就是第三层Broker数据层提供的spi和bundle元数据信息 有了这些基本信息以后,我们就可以生成NBF服务发现的URI了。
4.3.1.3 路由计算
在介绍路由计算之前,先介绍下先前提到@DynamicInject支持的几种方式:默认模式,规则模式和动态模式。
(1)默认模式: 默认模式就是服务调用不需要指定任何路由参数,这种调用方式适合单Bundle实现的SPI,Bundle实现就是默认实现
@DynamicInjectprivate ConfigReadService configReadService;ResultDO<List<ConfigDTO>> result = configReadService.queryConfig(new ConfigQuery);
(2)规则模式: 规则模式支持三种方式指定路由参数:Id(业务身份),Expression(正则表达式),Rule(规则表达式)。
// 指定bundleId方式, type默认为ID// 指定正则方式// 指定Rule方式
(3)动态模式: 动态模式指的是编码时无法确定调用参数的场景,路由参数需要调用时传入。
@DynamicInjectprivate DynamicInvoker<ConfigReadService> configReadServiceDynamic;
ResultDO<List<ConfigDTO>> result;// 动态传入bundleIdresult = configReadServiceDynamic.getService(bundleId).queryConfig(new ConfigQuery);
// 动态传入规则参数Map<String, Object> params = new HashMap<>();params.put("merchant", merchant);result = configReadServiceDynamic.getService(params).queryConfig(new ConfigQuery);
4.1.3.4 熔断降级
熔断降级包括两个核心能力:被动降级和主动熔断。
4.1.3.5 流量管控
流量管控提供了一种软负载的能力,支持设置Bundle和降级Bundle之间的流量配比,我们仍以Bundle:供应链-批发服务-盒马实现为例,以图为证:
你可能还喜欢
点击下方图片即可阅读
关注「阿里技术」
把握前沿技术脉搏