Serverless无服务应用架构纵横谈
Serverless无服务应用架构纵横谈
一、Serverless是啥
自从互联网兴起以来,Server就成了网络的核心部件。所以围绕Server的生意圈,也发展得如火如荼。
从最早的电信托管,到虚拟机,到现在的Serverless,形成了几大阵容:
1、IaaS(基础设施即服务:Infrastructure as a Service)
2、PaaS(平台即服务:Platform as a Service)
3、SaaS(软件即服务:Software as a Service)
IaaS是包硬不包软,面对集成商,PaaS是包硬包软不包工,面对开发者,SaaS是全包,面对消费者。

三大阵营都在不断演进中,互相取长补短,甚至模糊了彼此的界限。
PaaS最新的发展就是:
1、BaaS(后端即服务:Backend as a Service)
2、Faas(函数即服务:Functions as a Service)
这两种架构被称为Severless
BaaS与FaaS这两种架构被称为Severless,并非对开发者而言,是对服务商而言,没有一直运行的定制服务存在,不占用服务商的计算资源。同共享单车有些类似,是计算机分时租赁方式,按次按时计价。
BaaS并不存放客户代码,只提供通用的逻辑,产品的逻辑都需要在富客户端完成。这些通用的逻辑为所有客户共享,因而不浪费服务商的计算资源,也就可以做到按API调用次数计算费用。
以前叫我们把二层的富客户端都改成三层瘦客户端,现在搞个共享数据库,又叫我们改成富客户端。横竖赚钱。

而FaaS存放客户代码,当访问时,调入相关资源,开始运行,运行完成后,卸载所有开销。
嘶~~~,听起来耳熟。靠,这不就是PHP吗?!我是不是发现了什么~~
二、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 ""
三、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)
四、Serverless干啥
1、AWS Lambda的包装框架Zappa,可以使用Flask,Django等框架。功能看下图可知:


Master包含如下组件:
- apiserver:作为kubernetes系统的入口,封装了核心对象的增删改查操作。它维护的REST对象将持久化到etcd。
- etcd:分布式强一致性的key/value存储
- scheduler:负责集群的资源调度,为新建的pod分配机器。
- controller-manager:负责执行各种控制器,目前有两类:
- endpoint-controller:定期关联service和pod(关联信息由endpoint对象维护),保证service到pod的映射总是最新的。
- replication-controller:定期关联replicationController和pod,保证replicationController定义的复制数量与实际运行pod的数量总是一致的。
Slave Node(称为Minion)包含如下组件:
- kubelet:负责管控docker容器,如启动/停止、监控运行状态等。它会定期从etcd获取分配到本机的pod,并根据pod信息启动或停止相应的容器。同时,它也会接收apiserver的HTTP请求,汇报pod的运行状态。
- proxy:负责为pod提供代理。它会定期从etcd获取所有的service,并根据service信息创建代理。当某个客户pod要访问其他pod时,访问请求会经过本机proxy做转发。
- docker:docker容器引擎
Fission简单说来,就是一个Web应用,Go语言编写,使用gorilla框架。不过它的模板引擎替换成了Kubernetes中的Service。使用k8s.io/client-go/kubernetes接口来操控(k8s就是Kubernetes)。
Serverless无服务应用架构纵横谈的更多相关文章
- 理解serverless无服务架构原理(一)
阅读目录 一:什么是serverless无服务? 二:与传统模式架构区别? 三:serverless优缺点? 四:使用serverless的应用场景有哪些? 回到顶部 一:什么是serverless无 ...
- 理解serverless无服务
理解serverless无服务 阅读目录 一:什么是serverless无服务? 二:与传统模式架构区别? 三:serverless优缺点? 四:使用serverless的应用场景有哪些? 回到顶部 ...
- Serverless无服务器架构详解
本文对Serverless架构的基础概念.具体产品.应用场景.工作原理进行详细解析. 基础概念 Serverless: 无服务器架构,即在无需管理服务器等底层资源的情况下完成应用的开发和运行,是云原生 ...
- 《Serverless架构-无服务单页应用开发》读后感
本书的作者是[美]Ben Rady,译者郑赞美.简传挺,书中作者详细的介绍了如何使用html.js以及amazon提供的诸多云服务(Simple Storage Service(S3).Cognito ...
- 无服务架构在IOT的应用场景——使用函数工作流处理DIS数据
在物联网领域,复杂性往往并非在于传感器,真正的复杂性在于各种传感器产生的大量数据,以及对这些数据的处理,所以开发者不得不花费大量的时间去构建和维护后端服务器来处理这样一个庞大的数据流.而在今天这个敏捷 ...
- Serverless的概念&定义-无服务计算详解
过去几年间,Serverless 发展迅猛,与其相伴的还有从小程序.移动端等到前后端一体化的演进与实践,也正因如此,从云计算到前端,众多开发者都极为关注 Serverless到底是什么? 在国内,Se ...
- 无服务计算应用场景探讨及 FaaS 应用实战
作者 | 宋文龙(闻可) 阿里云全球技术服务部高级交付专家 什么是无服务计算 无服务器计算(Serverless Computing)在构建和运行应用时无需管理服务器等基础设施.它描述了一个细粒度的 ...
- SOA(面向服务的架构)
前言:SOA(面向服务的架构)是目前企业应用开发过程中普遍采用的技术,基于MVC WebAPI三层分布式框架开发,以此适用于企业信息系统的业务处理,是本文论述的重点.此外,插件技术的应用,富客户端JQ ...
- 整合SPRING CLOUD云服务架构 - 企业分布式微服务云架构构建
整合SPRING CLOUD云服务架构 - 企业分布式微服务云架构构建 1. 介绍 Commonservice-system是一个大型分布式.微服务.面向企业的JavaEE体系快速研发平台,基于模 ...
随机推荐
- 深入理解final和static关键字
深入理解final和static关键字 参考:http://blog.csdn.net/qq1028951741/article/details/53418852 final关键字 final关键字可 ...
- 最全的命令行(gradle)打包安卓apk
最近研究安卓方面的打包,因为是React Native,不能使用Android studio打包.找了半天资料,发现没有一个全面的.下面,我来讲解自己下打包时自己遇到的各种坑. 1.首先,需要在项目顶 ...
- AJAX中使用post,get接收发送数据的区别
如何发起请求 xhr.send(); 备注: 如果是get方式,send()命令中不用写任何参数 传递的数据可以写在url中,服务器用$_GEET["参数名"]接收 如果是post ...
- Lua 5.3 协程简单示例
Lua 5.3 协程简单示例 来源 http://blog.csdn.net/vermilliontear/article/details/50547852 生产者->过滤器->消费者 模 ...
- Leetcode题解(九)
28.Implement strStr()-------KMP算法(*) 题目 这道题目其实就是实现KMP算法,并且该算法也是比较经典的算法,需要很好的掌握: 贴上几个介绍字符串匹配的算法说明链接 h ...
- struts2常见错误
1.Caught exception while loading file struts-default.xml - [unknown location]解决办法:由于lib包冲突造成的,将两个解析x ...
- JAVAscript学习笔记 jsDOM 第五节 (原创) 参考js使用表
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Python爬虫入门:Urllib库的基本使用
1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的画面,但是其实是由浏览器解释才呈现出来的,实质它 是一段HTML代码,加 JS.CS ...
- Asp.Net MVC 使用 Ajax
Asp.Net MVC 使用 Ajax Ajax 简单来说Ajax是一个无需重新加载整个网页的情况下,可以更新局部页面或数据的技术(异步的发送接收数据,不会干扰当前页面). Ajax工作原理 Ajax ...
- MySql的虚拟机和Xshell5的连接过程
给大家介绍一下虚拟机和Xshell5连接的基本配置1.安装虚拟机,跟着提示一步一步安装即可,注意添加镜像文件,虚拟机就完成了.2.下载一个Xshell5,安装好之后.要修改虚拟机的网卡状态 1) ...