分类 Serverless 下的文章

Bmob FaaS 或“函数即服务” 介绍
函数即服务是一种新的软件基础设施术语,它比容器颗粒更小。

FaaS与Baas很类似,都是为了提高开发效率,解决微服务中所遇到的问题,先对而言Faas灵活度更高。大家一般把 Faas+Baas\=Serverless.

Bmob在国内最早做这个的企业之一,当时还完全未有借鉴,在走这条路的过程中也遇到了许许多多困难。
什么是函数服务有人举了个很好的例子.

来源阿里云社区.png 图侵权删

Serverless是一种基于互联网的技术架构理念,它具有
1、低运营成本;
2、简化设备运维;
3、提升可维护性;
4、简单易用,更快的开发速度;
5、相对小企业可靠性更好好

面临的问题
1.用户无数的Function 如何处理?
2.如何实现弹性部署?
3.如何集成日志、监控等工具?
4.服务问题?
5.安全问题?

第一个问题:用户无数的Function 如何处理?
1.我们可以给每个用户Function建立一个文件夹
2.我们可以每个用户一个容器

第二个问题:如何实现弹性部署?
1.如果要实现这一秒1K QPS,下一秒1W QPS。负载均衡有限的弹性部署中小云厂家是可以做到,并且你有活动还可以手动给你账户定制QPS。
2.如果要实现这一秒1K QPS,下一秒10W QPS、100W QPS,这种目前只能自有机房的厂家玩(像目前腾讯、阿里云都支持,他们今年也都推出了Faas,目前都在公测阶段),费用也不会低。不过流量到这一级别很多企业早已经用自己系统了,至少目前国情是这样。

发展历程.png

第三个问题:如何集成日志、监控等工具?
1.这个主要分2种,一种提供给用户,一种提供内部使用。
2.提供给用户的有函数回调结果日志,定时任务日志。监控QPS流量等。

第四个问题:服务问题?
1.Faas服务问题是个人认为最难解决的问题,由于各个厂家对Faas的封装没有一个统一的标准,大家代码也互不兼容。并且都封装了一些自己内部的函数,由于发展初期用户很难子啊各大网站找到答案,导致部分用户遇到问题需要人工技术支持才能走入正轨,这是Faas普及的一大难点。

第五个问题:安全问题?
1.目前市场做防攻击的上市企业防攻击技术是比较成熟的,只要你攻击很快很准确的监控并定位攻击流量,大多数恶意行为都能被监测隔离,被清洗掉。虽然不能吹嘘的像个别企业说能做到:到达服务器的攻击流量也能很快的被隔离,关进小黑屋,不过换个ip 还是可以的,相比一些中小企业直接暴露ip还是安全很多。

有些人说Baas 厂家提供的云函数、云逻辑之类不能称之为Faas,主要说出2点。

  1. 像亚马逊的Lambda,每 100 万个请求 0.20 美元,他们是按照单个请求计费的
  2. 说Baas的云逻辑没有自动伸缩功能。据我了解虽然没法跟有机房的厂家比,做到类似无限伸缩,不过Bmob、与AV的Faas产品都是可以根据业务定制的。

    有些人说Baas 随着serverless的发展,以后小公司就不需要运维工程师。

  3. 个人觉得这天还早,除非国内各大平台的Faas 都能统一标准。
  4. 这种新型产品,由于需要对外界暴露函数访问域名,目前政策也还不太明朗,如果手动绑定自己域名就加重了使用成本。
对于初创团队或者企业新业务来说使用这种服务是最合适的,因为Serverless能做到快、好、省。不过对于Serverless的普及,个人觉得国内难度还是很大,由于完全由第三方管理目前最大的挑战还是信任与服务问题。不过在国内,已经超过10W+开发者已经接受这种模式。

本教程教你如何免费发布一款自己微信小程序。

微信小程序门槛已经下降到个人了,很多不会写代码的人也想免费上线一款自己的小程序,该如何做到?

他有这些要求:

  1. 无需写代码
  2. 整个发布到上线最好不要超过10分钟
  3. 我要保留整个小程序的源码,以防止下次上线需要。
  4. 项目源码安全无后门、有详细的文档说明
  5. 稳定、安全。
  6. 免费、不花一分钱。

本视频10分钟上线自己微信小程序,一一解决这些问题。

[https://www.zhihu.com/video/939867296253034496](https://www.zhihu.com/video/939867296253034496)

Serverless实战驾校小程序【考题练习】二
介绍
准备工作做完后,今天我们从核心模块,分类与题目练习开始做。由于开发时间比较紧,这里主要写实习思路,与核心代码。

页面一、首页
这里我们主要优先实现功能逻辑,UI后面调整,我们用iview 拖一个大致结构的页面。

这里用了以下组件

{
  "usingComponents": {
    "i-tab-bar": "../../dist/tab-bar/index",
    "i-tab-bar-item": "../../dist/tab-bar-item/index",
    "i-grid": "../../dist/grid/index",
    "i-grid-item": "../../dist/grid-item/index",
    "i-grid-icon": "../../dist/grid-icon/index",
    "i-grid-label": "../../dist/grid-label/index",
    "i-tabs": "../../dist/tabs/index",
    "i-tab": "../../dist/tab/index"
  }
}

页面二、专项练习页面
这个页面,我们从数据库里取出数据,首先建立好数据表,这个表结构昨天有讲。

我们导入一个CSV格式数据到表里

CSV文件内容

bSubjects,title
1,时间题
1,速度题
1,距离题
1,罚款题
1,记分题
1,标志题
1,标线题
1,手势题
1,信号灯
1,灯光题
1,仪表题
1,装置题
1,路况题
1,酒驾题
1,动画题
1,情景题

然后我们取出这里的数据,在小程序里面显示

核心代码

// 库文件
const getQuestionTypeList=()=>{
    return new Promise((resolve, reject) => {
      const query = wx.Bmob.Query('questionType');
      query.find().then(res => {
          console.log(res)
          resolve(res)
      }).catch(err=>{
        console.error(err)
        reject(err)
      })
    });
}

// 页面js文件
wechatApp-questions2/pages/topic/index.js
onLoad(e){
    wx.u.getQuestionTypeList().then(r=>{
      console.log(r,`k`)
      this.setData({
        result:r
      })
    })
  },

  // wxml文件
  <i-panel title="题型列表" hide-top>
    <!-- <view style="padding: 15px;">头部距离为 0 的 Panel</view> -->
    <i-row>
        <i-col wx:for="{{result}}" span="12" i-class="col-class">
            <i-panel bindtap="handleTabClick" data-id="{{item.objectId}}" class="cell-panel-demo" title="">
                <i-cell title="{{item.title}}" value=""> 
                    <i-icon type="enterinto" slot="icon" />
                </i-cell>
            </i-panel>
        </i-col>
    </i-row>
</i-panel>

首页点击到分类,分类点击到题目页面,下一个是题目页面,这个页面是整个项目的核心, 所以的题目都在这个页面进行计算,判断。

页面三、答题页面
这个页面会是最复杂的一个页面, 涉及到,计时,判断、记录历史等等操作。

之前只想到模拟考试,没考虑到这种按照顺序练习, 第二次进入,可以继续之前的题目练习。 这里建个学习表,记录他的顺序练习相关数据,以下是数据表暂定的结构

学习表 learning

| 名称 | 类型 | 描述 | | --------- | ------ | --------------------------------------------------- | | bSubjects | sting | 所属科目 1.科目一 2.科目四 | | bModels | sting | 所属车型 1.小车 2.货车 3.客车 4.摩托车 | | where | string | 查询的条件 {"where":{"name":1},"order":"name"} | | num | string | 学习到第多少道题 | | result | array | 结果 [{" id ":" XXX ', '0'}, {" id ":" XXX ", "1"}] | | type | int | 0,免费版题目 1,付费版题目 | | uid | string | 用户id |

第一步:还是一样,用iview 复制出对应组件

第二步:查询出此类别的题目, 并且默认显示一道题,点击下一题,显示数组下一个元素

第三步:先做单选题,点击选择,判断是否正确, 如果正确,记录到结果对象 [{" id ":" XXX ', '0'}, {" id ":" XXX ", "1"}] ,0代表回答错误,1正确

第四步:点击下一题计算进度条位置,判断当前是否选择了题目,否则提示请选择结果。

目前做到这个一步,明天继续。

大家想学习更多的云服务开发, 可以加入Bmob的交流群:群号:273080081

什么是小程序云开发Serverless ?
之前跟大家介绍过Serverless由Baas+Faas 组成,听着很高深,其实很好理解。可以理解为为你提供了开发过程中后端服务+自定义后端服务。你不需要去管什么后端语言,什么后端数据库,什么后端攻击,什么后端架构,什么后端维护等,只要做好客户端UI,连接上后端就好了。

Bmob 作为国内第一家Serverless服务商,提供移动后端云服务。在这块已经服务了大量APP很多年。

这里解释下之前叫Baas 为啥现在叫Serverless,这是因为大家对Serverless的形式有不一样的认可,一部分人认为Serverless \= Faas+各种服务。 一部分人认为Serverless+Baas。

大家的共同认知都是无服务器计算。未来不再需要去购买任何服务器去提供API,也不需要操作关心任何并发维护等问题。

由于不需要写后端,不需要购买服务器,这块在APP领域,可操作性极高。我们从13年成立,就有大量APP开发者使用我们服务,到今天,已经接近30w开发者,涉及各行各业。 客户服务展现形式也是非常丰富,单片机、智能家居、智能手表、无人售货机柜、商场资讯地图引导柜机,机器人,共享单车、游戏,APP,小程序等等客户。

除了Bmob Serverless外,国内2大云厂商也建立自己Serverless体系

阿里云的Serverless就是 Faas+各种服务(数据库、网关、负载均衡等等)从Faas 里面调用各种服务,通过网关暴露给客户端访问。

腾讯云的Serverless偏向于Baas+Faas 可以看下腾讯云Serverless的相关文章

[http://www.cnblogs.com/qcloud1001/p/9486751.html](http://www.cnblogs.com/qcloud1001/p/9486751.html)

所以这也出现了2个例子:

阿里Serverless开发一个微信红包小程序应用教程

["口令红包"-利用函数计算构建微信小程序的server端 - CSDN博客](https://blog.csdn.net/zhoushuntian/article/details/79289215)腾讯出的小程序云开发一个小程序教程

[Parry:微信小程序开发平台新功能「云开发」快速上手体验](https://zhuanlan.zhihu.com/p/42327375)

在熟悉Faas情况下,阿里的比传统小程序PHP API开发,在运维上与硬件成本上,有着明显优势。

由于大家理念不同,腾讯小程序云,他是直接建立了一套Baas与小程序结合,跟Bmob后端云一样,即使你完全不懂Faas,也能开发大部分常用的小程序。 明显这种方式更简单实用。

为什么是常用的应用可以用Baas做,而不是所有,因为有些特别应用,需要一些特别操作。

例子一:

小程序.png

[http://www.91ud.com/app/15895.html](http://www.91ud.com/app/15895.html)

这个基于Serverless开发的一个例子,是基于Bmob后端云小程序,开发的一个小程序,叫趣猫。他的业务是一个淘宝客的业务,搜索跟推荐分成是他主要的功能, 其中搜索,如果不配合Faas,是没法实现, 因为他的搜索,其实是搜索淘宝客API的数据,整个淘宝推广的商品都可以搜索出来,有token授权,需要Faas访问淘宝API,返回数据给小程序客户端。

例子2:

纸塘

第二个基于Serverless开发的一个例子,小程序纸塘壁纸最近增加了一个功能,壁纸更新提醒通知,当后台有壁纸更新了, 会自动发送一条模板消息给我。这个也是基于Faas,单纯的Baas是没法实现这个功能。 当然,Bmob之前的Baas服务是包含了Faas服务,只是这2年Faas比较炒作的比较火。大家都把他(Faas)单独领了出来,作为Serverless架构的核心。我们则认为Baas与Faas同样重要。

之前我有文章写过,阿里的Faas 推广力度,与体验领先于腾讯的Faas , 由于阿里与腾讯的理解不一样,这次在Serverless领域,个人认为腾讯云一定会超过阿里的Serverless。

阿里云的Serverless就是 Faas+各种服务,不是玩微服务这个领域的人,很多人都不知道阿里的Serverless怎么结合到自己业务上。腾讯云理解为Baas+Faas,Baas有客户端的存在,更容易落地。大家理解的Serverless不一致,做的事情也不一致。

像阿里Faas+各种服务(今天去看阿里官方还不断在给Faas增加可调用的服务,到目前阿里Faas几乎可以操作阿里云的大部分产品,数据库,redis,云存储等等服务),并不断在宣传Faas是如何去调用这些服务。

腾讯云的行动告诉你什么叫Serverless(Baas+Faas),这次推出小程序云,以产品的形式告诉大家他眼中的Serverless服务。

image.png

按照2018年7月份微信小程序官方公布的数据,目前注册开发者以及到达了150W+,这150w的开发者,大部分是一些小的cp厂商,这些小的CP厂商,大有可能接下来新开发的小程序都基于Serverless开发,而整个Serverless 市场,会比目前大很多倍。

Serverless虽然好用,按照阿里的策略,很多人是看不懂无服务函数是干嘛的,为什么我要用它,而不是用云主机。因为设置太复杂了,概念很多,甚至好多人到今天还没搞懂计费原理。

腾讯云的策略,由于有了小程序Baas与客户端打通,大部分情况不用自己去Faas里面写接口,使用非常简单,在Serverless这块领域,很快腾讯云就会超过阿里云,由于很多初级开发者都不会用,很难推广开来,这次小程序云对国内整个行业来说,都是一个很好的教育。算得上是国内推广Serverless行业的又一次里程碑,未来Serverless会像目前云主机一样普及。

到底怎么使用?
有些前端对Serverless与小程序云的关系可能不太能理解,我下面用小程序云来代替Serverless这个词。

前期准备:

  1. 申请公测资格 网址:
  2. 下载bate版开发工具

    控制台操作:

  3. 打开小程序云控制台,在bate版小程序开发工具上传的左侧有个按钮。
  4. 点开后,看到一个类似这样的界面

image.png

  1. 点击数据库,创建一个自己前端想显示的数据结构。例如这里建个team表

image.png

代码操作:
我们把这条数据在小程序内显示? 这里我跟Bmob后端云做个对比

  1. 初始化
    微信
wx.cloud.init({
  env: 'test-x1dzi'
})

Bmob后端云

app.js 引入

var Bmob = require('../dist/Bmob-1.0.1.min.js');
wx.Bmob.initialize("你的Application ID", "你的REST API Key", "你的MasterKey");

2.第二步,查team表,打印出返回的数据

微信

db.collection('team').get().then(res => {
  // res.data 是一个包含集合中有权限访问的所有记录的数据,不超过 20 条
  console.log(res.data)
})

Bmob后端云

//构建team表对象
const query = Bmob.Query("team");
//查询数据
query.find().then(res => {
    //res 集合中所有数据,默认100条
    console.log(res)
});

数据显示出来了,在页面展示就不是问题,可以看到,除了需要引入SDK , 2个在使用上几乎一致。小程序云开发与使用Bmob开发几乎雷同。

文档地址:

[https://bmob.github.io/hydrogen-js-sdk//?id\=安装使用-1](https://bmob.github.io/hydrogen-js-sdk//?id\=安装使用-1)

关于定价:
腾讯云,最低版本

API 3w 天

数据库 1G

存储 5G

目前还不知道腾讯云的最低基础版上线是否收费,如果免费,那就很赞了。按照经验,这个额度大部分小应用都够了。

Bmob小程序云 最低版本(免费)

API 100w 月

数据库 表行 10w

存储 免费20G

流量 每月送20G

这个套餐免费,基本够用,收费套餐,大部分小程序都很难用得完。

目前小程序云还缺乏解决2个问题:

1.关于更好的功能实用性:
目前小程序云暂时比不上,Bmob后端云,像导入导出,生成小程序二维码、解密手机号,运动步数,支付,退款,短信,这些基础Baas服务端封装,小程序云暂时都还没有。然后就是数据安全与稳定性了,目前暂时没看到有任何关于云备份、安全的介绍,应用受到CC、DDOS 等攻击,这个费用是谁来承担,腾讯云之前的业务是客户自己解决,Bmob等 Baas 都是无需用户去承担这个费用的。

2.服务售后
我们都知道Baas 跟业务有深度关系,不像传统的云主机,我只保证云主机不死机就好了。基本卖出去就等着收月租。Baas领域开发者会遇到各种问题,你可以说你平台是标准的,文档都有,那么多技术人员在用,可开发者技术能力,理解能力参差不齐,就很难解决一些问题。 所以在传统的Baas 服务,都很重视问题反馈,像Bmob 就有几十个QQ解答群,加上工单。其他所有的Baas几乎没有哪家没工单服务的,有些工单还收几百块/月,大量工单,技术人员有限,这是没办法的,很多人问的问题,明显是技术基础不过关,对自己业务逻辑理解不够,就使劲提工单,而有些业务与Baas结合问题工单比较难形容,不知道Baas是否可以实现,所以有时候就用上了即时通讯,QQ,微信等来协助开发者解决问题。 所以这也是腾讯小程序云待解决的问题。

总结:
目前小程序云刚出来,还需要完善,对国内Serverless 市场来说,是一次里程碑式的意义。有望让中小企业普及Serverless 技术。

Serverless实战驾校小程序【考题练习】三
介绍
上一节我们讲了,实现了分类、题目显示、进度条显示等功能,这节我们继续完善答题功能。由于开发时间比较紧,这里主要写实习思路,与核心代码。

这一节做顺序练习与模拟考试。都属于答题详细页面功能

这次进度条可以根据答题进度,显示进度。 这个也用了iview的一个插件, 目前样式没调整, 这个后面再说。

这一节主要实现了一些逻辑计算

逻辑一:记录学习题目进度
记录的核心代码,在提交保存的时候调用。当然,也可以在练习离开的时候触发,这里给了个按钮,点击保存即可保存学习记录

const AddLearning = ({ num, result, type = 1 }) => {
  let current = wx.Bmob.User.current()
  return new Promise((resolve, reject) => {
    const query = wx.Bmob.Query('learning');
    query.set('bSubjects', '1')
    query.set('bModels', '1')
    query.set('num', num)
    query.set('result', result)
    query.set('type', type)
    query.set('uid', current.objectId)
    query.save().then(res => {
      resolve(res)
    }).catch(err => {
      console.error(err)
      reject(err)
    })
  });
}

逻辑二:记录题目回答的对错
上面的变量result记录,格式请看上一节数据库格式说明,是题目的对错。这里点击一个选择就记录一次,我在页面data里面增加了一个items变量来保存。

选择答案执行以下代码,今天先实现单选,我们单选与多选,判断事件分开来做,这样便于逻辑管理

// 单选题
  handleFruitChange ({ detail = {}, target = {} }) {
    let questionInfo = this.data.questionInfo
    // 判断单选是否正确
    if (target.dataset.id) {
      console.log('ok')
      questionInfo.isOk = 1
    }

    this.setData({
      questionInfo: questionInfo,
      current: detail.value
    });

    // 单选自动跳到下一题
    this.statistical()

    // 显示第几道题
    this.setThisData(this.data.index)
    this.setData({
      index: this.data.index + 1,
      current: ''
    });
  },

逻辑三:答题相关统计
逻辑二讲了,记录对错,这里有一些统计需要拿出来计算,先做单选题,点击选择,判断是否正确, 如果正确,记录到结果对象 [{" id ":" XXX ', '0'}, {" id ":" XXX ", "1"}] ,0代表回答错误,1正确

例如错题个数、对题个数,页面提示,进度条进一步

statistical () {
    // 统计错题个数
    let questionErr = this.data.questionErr  //错题个数
    let questionOk = this.data.questionOk  //错题个数
    let questionInfo = this.data.questionInfo
    let items = this.data.items
    let arr = { "id": questionInfo.objectId, "o": 0 }

    let t = 'error', m = '回答错误'
    if (questionInfo.isOk === 1) {
      // o 0代表失败,1代表成功
      arr.o = 1
      questionOk = questionOk + 1
      t = 'success'
      m = '回答正确'
    } else {
      // 错误数+1
      questionErr = questionErr + 1

    }
    items.push(arr)

    // 提示
    $Message({
      content: m,
      type: t,
      duration: 2
    });


    //进度条
    let totalW = this.data.index / this.data.total
    totalW = (totalW * 100).toFixed(2);
    totalW = totalW < 1 ? 1 : totalW

    this.setData({
      items: items,
      questionErr: questionErr,
      questionOk: questionOk,
      totalW: totalW,
    });
  },

逻辑四:上一题下一题的实现
页面显示第几个题目,我们用数组的下面来记录,单电机下一题,我们记录回答对错,并且数组下标+1

// 翻页
  handlePageChange ({ detail }) {
    const type = detail.type;

    const current = this.data.current
    if (current == "") {
      console.log('空')
      $Toast({
        content: '请选择答案!',
        type: 'warning'
      });
      return;
    }


    this.statistical()

    if (type === 'next') {
      this.setThisData(this.data.index)
      this.setData({
        index: this.data.index + 1,
        current: ''
      });

    } else if (type === 'prev') {
      this.setData({
        index: this.data.index - 1,
        current: ''

      });
      this.setThisData(this.data.index)
    }
  },

逻辑五:引入模式概念
因为答题页面逻辑非常多,今天写这么多也没写完一般, 除了学习模式,后面还有模拟考试模式,这里不单独使用另外的页面来开发,统一在一个页面。 所以,我们在页面data里加入model变量,代表模式。

/**

​ * 这里有个模式, 练习模式,与模拟考试模式

​ * model 1.练习模式 2.模拟考试考试

​ * 练习模式查询出所有数据练习

​ * 模拟考试 随机100题 计算打分

​ */

总结
今天练习模式里面的单项选择逻辑基本已经做好,明天将实现模拟考试,计算考试成绩等等功能

大家想学习更多的云服务开发, 可以加入Bmob的交流群:群号:273080081