微服务是目前互联网公司最流行的架构,其生态、设计方法、开发框架、基础设施管理工具等,可以快速帮助企业顺利实施微服务架构。然而,微服架构就完美了吗?
微服务仍面临着哪些挑战?
1. 微服务相关基础设施成本仍很高。
微服务的开发引入治理组件,增加了开发的难度,以容器为基础的微服务基础设施在弹性等方面仍有不足,而微服务增加带来的基础设施成本也是微服务实施的新挑战。
2.微服务的粒度仍然比较粗。
当前微服务划分主要遵循单一职责的原则,通常会将一个子业务抽象成一个微服务,例如:用户服务,支付服务,订单服务等。但是,同一个子业务的不同接口,QPS差距较大,对扩展的诉求完全不同,变更频率也可能不同。进一步拆分可以带来扩展性等便利,但整个微服务的数量也会提升一个量级,给基础设施的管理带来负担。
3.微服务开发仍有较高门槛。
如图所示,Java微服务开发的软件栈要求开发者掌握以下技能。
Java微服务开发技术栈
从复杂的SpringMVC演进到SpringBoot,框架更加轻量化。但在其他方面(并发处理等)并没有什么改变,同时在微服务治理、分布式事务等方面的开发难度反而增加了。
4.微服务基础设施管理、高可用和弹性仍然很难保证。
容器和Kubernetes工具的使用,提升了应用部署及基础设施运维自动化的能力,但保证基础设施高可用、可扩展对运维人员的能力要求很高。服务上云后,基础设施团队可以不用再关心服务器、交换机等硬件的运维,但仍然需要关心虚拟机的维护,如安全补丁、基础镜像的更新升级、扩容等。
基础设施团队依然需要管理虚拟机
运维人员需要借助云侧的工具来保证基础设施的高可用,难度仍然存在,而且很依赖运维人员的能力。
5.基础设施的成本依然较高。
微服务会增加基础设施的成本。每个微服务都要考虑冗余,保证高可用。随着微服务数量的增加,基础设施的数量会呈现指数级增长,但云服务的基础设施收费方式没有改变,依然采用按照资源大小及以小时为单位(或包年)计费的方式。是否存在一种新的基础设施服务,能按照“用多少付多少”的方式收费,从而降低基础设施成本?
微服务面临的这些新问题,是否有解决方案呢?
或许,Serverless是潜在方案之一。
什么是Serverless?
2012年,时任Iron.io的副总裁Ken提出了Serverless的概念,他认为未来的软件和应用都应该是Serverless的,而不应该云计算兴起了,世界仍然围绕着服务器运转。
2014年,AWS推出Lambda函数计算服务,提供简化的编程模型及函数的运行环境全托管。2015年,AWS推出API Gateway(全托管的网关服务),正式将Serverless这个概念推广开来。
AWS Serverless全景图
Google在2011年收购了Firebase,2016年将其作为mBaaS(移动后端即服务)的Serverless解决方案推出。
Google Serverless全景图
国内,华为也不甘落后,结合多年在Serverless领域的技术积累,推出了Serverless行业解决方案,2021年,云函数、云数据库等核心构建类服务已面向全球HMS生态的开发者开放。
HUAWEI AppGallery Connect Serverless全景图
那么,Serverless到底是什么呢?
维基百科是这么说的:
(1)云服务商按需分配计算机资源,开发者无须运维这些资源,不用关心容器、虚拟机或物理服务器的容量规划、配置、管理、维护、操作和扩展;
(2)Serverless计算无状态,可在短时间内完成计算,其结果保存在外部存储中;
(3)当不使用某个应用时,不向其分配计算资源;
(4)计费基于应用消耗的实际资源来度量;
Serverless并不意味着不需要服务器来托管和运行代码,也不意味着不再需要运维工程师。Serverless是指开发者不再需要将时间和资源花费在服务器调配、维护、更新、扩展和容量规划上,这些任务都由Serverless平台处理,开发者只需要专注于编写应用程序的业务逻辑,运维工程师能够将精力放在业务运维上。
目前,Serverless服务主要分为FaaS和BaaS:
(1)函数即服务(Function as a Service,FaaS):开发者实现的服务器端应用逻辑(微服务甚至粒度更小的服务)以事件驱动的方式运行在无状态的临时容器中,这些容器和计算资源完全由云提供商管理。开发者只需关心和维护业务层面的正常运行,其他部分如运行时、容器、操作系统、硬件等,都由云提供商来解决。
FaaS与IaaS、PaaS的区别
(2)后端即服务(Backend as a Service,BaaS):基于API的三方服务,用来取代应用程序中功能的核心子集。由于这些API是作为自动扩展和透明运行的服务提供的,因此从开发者和运维工程师的角度来看似乎是无服务器的。非计算类的全托管服务,如消息队列等中间件、NoSQL数据库服务、身份验证服务等,都可以认为是BaaS服务。
Serverless有哪些关键技术呢?
下图是典型的Serverless系统架构,从中可以看到一些Serverless的常用概念。
典型的Serverless架构
(1)事件源(Event Sources):事件的生产者,可能是HTTP请求、消息队列的事件等,通过同步或异步的方式去触发函数;
(2)触发器(Trigger):函数的REST呈现,通常是RESTful URL。当事件源将事件推/拉到触发器时,FaaS平台会查找触发器和函数的映射关系,从而启动该函数实例,以响应被推/拉到触发器的事件;
(3)FaaS控制器(FaaS Controller):FaaS平台的核心组件,管理函数的生命周期、扩容和缩容等。可以将函数实例缩容为0,同时在收到对函数的请求时迅速启动新的函数实例;
(4)函数实例(Function Instance):执行函数的环境,包含函数代码、函数运行环境(如JRE、Node.js)、上下文信息(如函数运行的配置,通常以环境变量注入)。一个函数实例可以同时处理1个或N个事件(取决于平台的具体实现)。函数实例通常内置可观测性,将日志和监控信息上报到对应的日志和监控服务中;
(5)函数编程模型(Programming Model):通常表现为函数的编码规范,如签名、入口的方法名等。函数的编程模型一般会提供同步/异步/异常处理机制,开发者只需要处理输入(事件、上下文),并返回结果即可;
(6)BaaS平台:函数通常是无状态的,其状态一般存储在BaaS服务中,如NoSQL数据库等。函数可以基于REST API或BaaS服务提供的SDK来访问BaaS服务,而不用关心这些服务的扩容和缩容问题;
(7)函数编程模型:提供友好的编程模型,使开发者可以聚焦于业务逻辑,为开发者屏蔽编码中最困难的部分,如并发编程等。同时,需要原生支持函数的编排,尽量减少开发者的学习成本;
(8)快速扩容:传统的基础设施通常都是从1到n扩容的,而Serverless平台需要支持从0到n扩容,以更快的扩容速度应对流量的变化,Serverless平台可达到秒级甚至毫秒级的扩容速度;
(9)快速启动:函数被请求时才会创建实例,该准备过程会消耗较长的时间,影响函数的启动性能。同理,对于新到达的并发请求,会产生并发的冷启动问题。Serverless平台需要降低冷启动时延,以满足应用对性能的诉求;
(10)高效连接:函数需要将状态或数据存放在后端BaaS服务中,而对接这些服务往往需要繁杂的API,Serverless平台的函数实例生命周期通常较短,对于如RDS数据库等后端服务无法保持长连接,为此,Serverless平台需要为函数提供完备、高效、可靠的BaaS服务连接/访问接口;
(11)安全隔离:Serverless是逻辑多租的服务,租户的函数代码可能运行在同一台服务器上,所以,通常Serverless平台会采用安全容器的方式,引入轻量级虚拟化技术来保证隔离性,但这同时会引入额外的性能(启动)和资源开销等问题。