serverless架构

目录

体验阿里云Serverless

Serverless是什么

运行时Runtime

BaaS化

FaaS冷启动

总结

自己动手搭建Serverless

安装istio

 安装knative


体验阿里云Serverless

前面的文章《进化的架构》讲了单体、SOA、微服务、云原生等架构,并针对云原生动手搭建了k8s集群。这里接着讲一讲serverless架构。在云原生时代,我们借助k8s、自动化工具实现了devops,较少关注运维。但是serverless可以让我们做到不关注运维,当然绝对意义的不关注是不可能的,只是很少的关注。

可以先去阿里云体验一下serverless开发流程,选择产品——计算——函数计算FC——服务及函数、serverless工作流,如下图所示:

serverless架构_第1张图片

serverless架构_第2张图片

概念解释

  • 服务及函数:‘服务’代表一个具体的服务,‘函数’代表服务中各个功能模块。一个服务可以包含多个函数
  • serverles工作流:使用‘流程定义语言’将多个服务的多个函数编排起来,形成流程,比如付款——购买商品——发邮件——扣减库存——发货...
  • serverles工作流—应用:多个工作流组成一个应用

我们使用官网提供的例子,简单搭建一个应用。打开应用中心,选择旅行订单demo——配置并部署

serverless架构_第3张图片

 等待创建完毕,去服务函数管理界面查看,发现帮我们创建名为fnf-sample-22d1e0-tripOrderProcessingService-A04B5EBE2C6C的服务

serverless架构_第4张图片

点击进去,有六个函数,分别是:创建火车订单、创建酒店订单、取消飞机订单、取消火车订单、创建飞机订单、发送信息。选中一个函数进行编辑或查看,你将能够指定资源、并发度、实例回收时间、触发器,能够查看日志、实例状态、监控等等。

另外,你会发现这些函数的实例数都是0,只有真正执行时(触发器触发、手动执行、工作流调用)才会创建实例,过一段时间后又自动回收。

serverless架构_第5张图片

如何将这六个函数组织起来形成订票流程呢,我们可以写代码编排,也可以使用官方提供的serverless工作流来完成,刚刚的demo已经帮我们生成好了

serverless架构_第6张图片

 进入该流程,选择‘定义’tab,能够看到一个定义好的流程图。如何自定义流程、参数如何传递等等请看官方文档。

serverless架构_第7张图片

Serverless是什么

如上所见,我们编写代码时,完全无需考虑基础设施,没有了服务器、操作系统、网关、网络调用......做到了NoOps(算力、存储、网络可以认为是无限的,但是要考虑自己钱包是否能够承担)。一句话概括,就是服务端无运维,使我们能够专注业务代码编写。具体到上面的例子,我们其实接触了很多概念,比如函数、触发器等(一定要去阿里云上操作一番,很多东西一操作就自然明白其含义了),把它们归纳成为一种实现方式:FaaS。

serverless架构_第8张图片

FaaS在实现上有很多特点,下面一一道来

运行时Runtime

内置运行时是官方提供的,是我们函数运行时的上下文环境。联想一下运行本地函数,加载代码到内存——执行——结束,serverless函数的生命周期与此类似,连同它的runtime一同被创建、运行、销毁。能够看出来这个函数是无状态的,只要函数的入参、参数相同,那么出参一定是固定的。除了内置运行时,还有自定义运行时容器镜像运行时。

serverless架构_第9张图片

BaaS化

既然函数是无状态的,那么我们想要保存数据如何做呢,答案是后端设施BaaS化。后端设施对外提供基于http的api来代替以往的交互方式:客户端启动时维护一个连接池。(后端设施是指数据库、消息队列、日志、存储,等等这一类用于支撑业务逻辑运行,但本身无业务含义的技术组件)

以官网的serverless mysql为例,它提供了http接口来对mysql进行增删改查、事务等操作,并且其提供的特性与serverless的按需付费、无运维是一致的。具体特性参考文档。

serverless架构_第10张图片

FaaS冷启动

我们的函数执行流程如下所示,中间会经过多个步骤,这就是冷启动的概念。这里会涉及到一个重要问题,冷启时间。如果冷启时间过长,会导致第一次调用超时失败。如何避免这个问题呢?

serverless架构_第11张图片

官方提供了以下几个建议

serverless架构_第12张图片

而且根据我们应用的特点,平台允许选择函数模式,是用完既销毁型,还是常驻型。用完既毁型适合对耗时不敏感、冷启时间短的应用。而常驻型与此相反,函数实例的创建销毁由我们手动控制,可以指定预留的实例数量,当实际执行时的压力超过预留实例,会自动启动用完既毁类型的实例,如下图。这样既避免了冷启动的延时,又实现了极高的资源利用率。

serverless架构_第13张图片

 最后补充一点,后端设施BaaS化也是降低冷启时间的有效措施。

总结

通过上面的资料,能够看出serverless的一些优点

  • 按量付费,节约成本
  • NoOps,专注业务开发

但如果你实际体验了一番阿里云serverless,会发现有一些限制

  • 服务编排要使用它特定的流程语言
  • 所有扩展项都是勾选框,如果你要特殊需求,可能要花费一番功夫
  • 代码要按照规定的要求编写
  • 某些组件的价格比较贵

自己动手搭建Serverless

安装istio

《搭建k8s集群》已经搭建好了k8s集群,这里会继续安装istio、knative组件。

# 下载最新版本istio
curl -L https://istio.io/downloadIstio | sh -

# 进入目录
cd istio-xxx/bin
cp istioctl /usr/local/bin/

# 安装
istioctl manifest apply --set profile=demo

# 空间default下的pod在部署时都会注入sidcar
kubectl label ns default istio-injection=enable

# 部署kiali面板
cd istio-xxx/samples/addons/

kiali和Jaeger的服务暴露用的是LoadBalancer,我用的是本地的环境没有公网SLB使用,所以要修改为NodePort模式
vim kiali.yaml

serverless架构_第14张图片

 vim jaeger.yaml

serverless架构_第15张图片

# 安装addons下的所有yaml
kubectl apply -f .
 
# 将istio-ingressgateway改为NodePort方式
kubectl patch service istio-ingressgateway -n istio-system -p '{"spec":{"type":"NodePort"}}'

访问kiali:http://139.224.137.71:32700/

访问Jaeger:http://139.224.137.71:32701/

删除我们之前的应用,重新部署。但是我发现kubectl apply -f xxx它不自动注入,所以只好用命令行手动注入

kubectl apply -f <(istioctl kube-inject -f k8s-test-com.yaml)

 安装knative

请参考以下。官方提供的仓库国内连不上,这篇博客做了一些修改Knative 介绍-谢先斌的博客Knative是一个开源的企业级解决方案,用于在kubernetes平台中构建Serveless和管理事件驱动的应用程序。https://www.xiexianbin.cn/cloud-native/knative/index.html

你可能感兴趣的:(架构,serverless,架构,java,go,kubernetes)