Serverless无服务应用架构纵横谈git
1、Serverless是啥github
自从互联网兴起以来,Server就成了网络的核心部件。因此围绕Server的生意圈,也发展得如火如荼。docker
从最先的电信托管,到虚拟机,到如今的Serverless,造成了几大阵容:数据库
一、IaaS(基础设施即服务:Infrastructure as a Service)apache
二、PaaS(平台即服务:Platform as a Service)json
三、SaaS(软件即服务:Software as a Service)flask
IaaS是包硬不包软,面对集成商,PaaS是包硬包软不包工,面对开发者,SaaS是全包,面对消费者。后端
三大阵营都在不断演进中,互相取长补短,甚至模糊了彼此的界限。api
PaaS最新的发展就是:网络
一、BaaS(后端即服务:Backend as a Service)
二、Faas(函数即服务:Functions as a Service)
这两种架构被称为Severless
BaaS与FaaS这两种架构被称为Severless,并不是对开发者而言,是对服务商而言,没有一直运行的定制服务存在,不占用服务商的计算资源。同共享单车有些相似,是计算机分时租赁方式,按次按时计价。
BaaS并不存放客户代码,只提供通用的逻辑,产品的逻辑都须要在富客户端完成。这些通用的逻辑为全部客户共享,于是不浪费服务商的计算资源,也就能够作到按API调用次数计算费用。
之前叫咱们把二层的富客户端都改为三层瘦客户端,如今搞个共享数据库,又叫咱们改为富客户端。横竖赚钱。
而FaaS存放客户代码,当访问时,调入相关资源,开始运行,运行完成后,卸载全部开销。
嘶~~~,听起来耳熟。靠,这不就是PHP吗?!我是否是发现了什么~~
2、Serverless凭啥
看来BaaS和FaaS都是新瓶装旧酒,那么Serverless凭啥流行,又是否是将来?
Facebook 于2013年花费了 8500 万美圆收购了主流的BaaS平台 Parse 。因为 Parse 一直以来未能为 Facebook 提供预期的营收,Facebook 决定一年后将其正式关闭,并将其代码开源。Facebook这不差钱的行为,直接为整个行业蒙上了阴影。能够说直接逼死了某些跟风者。
搭个共享数据库赚钱的想法基本破灭后,行业都纷纷压宝FaaS。那么FaaS的前景如何?
虽然FaaS是BaaS的“升级版”,而且与流行的微服务架构相吻合。可是没法改变它有强制全部程序按PHP方式运行这样一个可怕的设定。而这个无奈的设定所解决的是致使先行者AppEngine举步维艰的病根,那就是大量进程占用服务商过多的资源而不怎么赚钱。因此FaaS这个扭曲版AppEngine对于服务商来讲是一剂良药,可是未必会是行业的将来。
这些年随着Docker平台的发展,启停一个容器的成本已经接近于启停一个进程。将AppEngine平台上的侦听进程都去掉,用一个统一的WebServer来侦听路由,当访问到来时,启动容器,运行,中止容器。这和PHP的作法如出一辙,不过是把PHP.exe换成了Docker容器罢了。同一个思路,换一个环境,立刻从落后变成了先进。能够你想像,FaaS是下降成本的利器,也必定会占有一部分低端市场。
可是,PHP也没有像FaaS同样强制要求全部服务达到函数这个级别,一步到位的确有点匪夷所思。函数也非FaaS最好的包装形式,不如像PHP直接对应到一个文件上。在我看来,现有FaaS平台的行为模式,只适合推广PHP,可以与PHP生态很好地对接,而其它语言则有不可调和的矛盾。
看了一下开源框架Fission的源码,想出一个兼容其它语言的方案,以Python语言为例。
要求Flask程序实现2个接口,原有的程序不加任何修改便可在FaaS框架下运行了,/register接口载入全部Route,并返回全部绑定规则,FaaS框架只须要把Route表合并就能够一次性建立全部Route。没必要要一条一条调用fission function create与fission route add了。Http 请求来时调用/specialize接口,根据endpoint(即函数名)载入代码,实现FaaS功能。把框架接口开放给程序,可以实现最大的兼容现有框架,若是不放心,能够调用/specialize?endpoint=echo&echo=hello,来验证程序是否支持FaaS平台便可。
from flask import Flask, request app = Flask(__name__) userfunc = None @app.route('/register', methods=['POST']) def register(): # 引入全部Routes,并返回全部Rules from .main import main as main_blueprint app.register_blueprint(main_blueprint) return jsonify(app.url_map._rules_by_endpoint) @app.route('/specialize', methods=['POST']) def load(): # 特化载入,只载入单个endpoint body = request.get_json() name = body['endpoint'] global userfunc userfunc = imp.load_source(name) return ""
3、Serverless有啥
Serverless平台通常分为以下三类:
1. 公有云Severless平台:
A. AWS Lambda、B. Microsoft Azure Functions、
C. Google Cloud Functions、D. Webtask、E. Syncano
2. 私有云Severless框架:
A. Fission (Kubernetes)、B. Funktion (Kubernetes)、
C. Kubeless (Kubernetes)、D. Gestalt (DC/OS)、
E. IBM OpenWhisk (Docker)、F. Iron Functions (Docker,Swarm, Kubernetes)
3.Serverless平台的包装框架:
A. Serverless(Node,大多数平台)、B. Apex(Go,AWS)
C. Zappa(Python,AWS)、D. Chalice(Python,AWS)
E. Claudia.js(Node,AWS)F. Gordon (Python,AWS)
4、Serverless干啥
一、AWS Lambda的包装框架Zappa,可使用Flask,Django等框架。功能看下图可知:
Master包含以下组件:
Slave Node(称为Minion)包含以下组件:
Fission简单说来,就是一个Web应用,Go语言编写,使用gorilla框架。不过它的模板引擎替换成了Kubernetes中的Service。使用k8s.io/client-go/kubernetes接口来操控(k8s就是Kubernetes)。