分类 Bmob后端云 下的文章

Bmob FaaS 或“函数即服务” 介绍(2)

上一篇讲过Bmob在国内最早做这个的企业之一,当时还完全未有借鉴,所以与目前腾讯与阿里云有所不同。

他们(腾讯与阿里云)2家的服务设置与使用都非常相似,从2017年同时推出公测起都是奔着亚马逊的Lambda 的功能来的,只是2家函数代码互不兼容,展现形式一致。

1. 阿里云界面

image.png

image.png

2. 腾讯云界面

image.png

image.png

腾讯云.png

阿里云.png

3. 共同点

  1. 函数入口
  2. 函数内存
  3. 超时时间

    可以看出这几点都是相同的,由此看出他们的技术架构都来自同一套类似的东西然后对其定制加入自家云内部接口函数

我们的云逻辑发展历程

发展历程.png

第一阶段:多台机器负载一个云逻辑环境

特点第一阶段第二阶段第三阶段第四阶段
说明1. 无启动时间,开箱即用
2. 架构相对简单,易扩展,维护方便
1. 无启动时间,开箱即用
2. 函数按照用户分文件夹
3.热点代码写入内存,读取速度快
1.根据业务规则划分服务器区快,例如id 1-100的用户在服务器一组(解决了一个人影响所有人,不过还是会影响他所在的服务区域)1.完全隔离,资源独立
问题1.函数多的时候磁盘读取慢1.由于执行环境没隔离,高并发用户会影响低请求用户逻辑1.隔离有限,还是会出现个别时候一个函数影响其他1.基础成本高
2.开发成本高
3.需要预备一些硬件资源
特点1.简单快捷,云函数支持有限1.云函数支持数是第一方案的N倍1.不再一个函数影响所有1.独立运行无限扩展

自主创新走了一些弯路,在第二阶段升级到第三阶段的时候,我们直接走了第四阶段通过kubernetes+docker容器技术来实现集群编排,通过Go来暴露接口给前端应用灵活购买云函数, 续费,用户自主升级配置、github代码拉取等等。

最终由于云函数是免费功能,大部分用户只是少量使用云函数。Serverless本身最求小而美的低成本策略,高额基础成本、维护成本导致当时这块功能全部弃用,重新进入第二阶段,经过优化走出了第三阶段这条技术线路。

得益于一些游戏应用厂家对云函数有更高的要求,我们推出了第四阶段与阿里腾讯今年推出的方案有些类似,用户独立环境,只要有需求,无限资源扩展。根据实验以单秒API并发来控制实例个数。

云函数是如何工作的?

image.png

云函数分为三种调用形式

  1. SDK调用
  2. API调用
  3. 相互调用
  4. 定时调用

架构上要实现灵活扩展扩展云函数,需要一套具有动态路由器来管理函数、容器、超时、动态扩展、功能接口等,我们使用的是OpenRestyOpenResty在优酷、淘宝、360等中大型互联网企业都有应用。

在云函数这块,不久的将来我们将推出Java版本云函数,为开发者的需求,我们也在不断创新,推进中国移动互联网软件开发效率。希望未来软件开发服务端真如Amazon.com首席技术官Werner Vogels所说:"没有服务器比不管理服务器更容易管理"。

Bmob后端云 公众号邀请返利开发

APP里有个注册页面,希望互相转发微信,邀请返利。 为了方便传播,注册页面单独用H5页面实现。 为了提高邀请用户质量,提高邀请用户的有效性,我们强制要求微信里面打开才能注册。所以基于公众号开发。 为了快速开发,这里使用Bmob云Serverless 里的Faas服务与文件CDN存储服务。

1.准备材料

  1. 公众号
  2. Bmob云Serverless
  3. 如果想用自己域名,备案好的域名

2.设置公众号

一、设置AppSecret值

开发者ID(AppID)

开发者密码(AppSecret)

二、设置白名单

IP白名单
image.png

三、设置授权域名

接口权限,登陆,找到网页授权域名

四、设置调试微信开发者

开发者工具-》web开发者工具 【这个跟小程序一样的工具】,添加微信到开发者,最多可以绑定50个
image.png

3.开发过程

一、注册Bmob账号

二、创建一个应用

image.png

三、点击进入云函数

编写微信获取用户昵称代码
image.png

四、新建云函数

云函数getOpenId 获取用户openid,拿到openid调用getUserInfo获取用户信息云函数

function onRequest (request, response, modules) {

  var code = request.body.code ? request.body.code : '011jOWiN0vmFa42ynziN0B6bjN0jOWir'

  //获取数据库对象
  var db = modules.oData;
  var functions = modules.oFunctions;

  //http请求方式: GET
  var appid = '';
  var secret = '';
  var url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' + appid + '&secret=' + secret + '&code=' + code + '&grant_type=authorization_code';
  //获取Http模块
  var http = modules.oHttp;

  //发起Get请求
  http(url, function (error, res, body) {
    if (!error && res.statusCode == 200) {
      //写入数据库
      var resultObject = JSON.parse(body);
      //如果返回错误则打印
      if (resultObject.errcode) {
        response.send(resultObject);
      }

      functions.run({
        "name": "getUserInfo",
        "data": { "openid": resultObject.openid, "access_token": resultObject.access_token }
      }, function (err, data) {
        //回调函数
        
     
        response.send(data);
      });

    }
  });

}                                                                                    

getUserInfo云函数

function onRequest (request, response, modules) {
  var db = modules.oData;
  var openid = request.body.openid || 'ol2Ey0tePs0fdFdVRZKqzu50_83c';
  var access_token = request.body.access_token || 'xxxx';

  getUserInfoMp(openid, access_token);

  function getUserInfoMp (openid, access_token) {
    var http = modules.oHttp;
    http('https://api.weixin.qq.com/sns/userinfo?access_token=' + access_token + '&openid=' + openid + '&lang=zh_CN', function (error, res, body) {
      if (!error && res.statusCode == 200) {
        var at = JSON.parse(body);
        response.send(body);

      }
      response.send(body);
    
  });
}
}                                                                                    

五.运行流程介绍

image.png

用户打开一个url,这个url打开后会提示用户是否授权,同意后跳转到自己的网址,并带上code。

(URL地址)https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxbafdda995607cc&redirect_uri=https%3a%2f%2fgoldenage.xxxxx.com%2f&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect

redirect_uri参数关键:指定统一授权后打开的网址,接下来就1步,通过code拿到openid。上面函数getOpenId就可以拿到openid,如果需要昵称头像,可以调用第二个云函数getUserInfo

https://mp.weixin.qq.com/wiki?action=doc&id=mp1421140842&t=0.35600785609885244#3)

六.如何调用

image.png

https://cloud.bmob.cn/19b475f87c366db2/getOpenId
方法:post
参数:code: 微信code
返回:
{"openid":"ol2Ey0tePs0fdFdVRZKqzu50_83c","nickname":"magic","sex":1,"language":"zh_CN","city":"广州","province":"广东","country":"中国","headimgurl":"http:\/\/thirdwx.qlogo.cn\/mmopen\/vi_32\/DYAIOgq83epySXbnQqg4MialjffKNKbxj42prvL2aIaIFbs3pj7svlT4gbQeQPbricZNBGYWfv1zcOo86fjwc99Q\/132","privilege":[]}}

总结:

相比自己服务器开发优势,成本低,速度快。 基于Serverless,的Faas 只需要一个函数,即可实现用户openid功能。如果熟悉,整个微信开发不需要10分钟。这里有个用户点击授权的页面是HTML的,这个HTML我们可以用CDN云存储,把静态html页面保存到文件里面,支持绑定自己域名,让用户访问。 整个开发,不需要购买服务器,ip,环境,微信设置好,一个函数,暴露接口就可以实现。

前端网页调用效果截图:
image.png

小程序显示H5网页教程

介绍

小程序里显示Html代码,目前插件(wxParse 解析html)解析支持不太好,有时候格式还是达不到预想的效果。 小程序里的HTML语法有台奇葩, 最好的解决方案是直接在里面显示HTML页面,使用小程序的web-view组件。

之前由于需要验证原因,很多人把Bmob的素材页面填写到微信的业务域名,提示:

小程序设置web-view业务域名,解决“不支持打开非业务域名,请重新配置”

这个提示的根本原因,是没有成功设置业务域名。次次开放业务域名设置。大家可以上传静态HTML文件到自己应用。

设置业务域名前要做的准备

1.备案的域名 (如果有自己备案的域名,可以提交工单绑定自己域名,没有Bmob后端可以开通一个应用私人域名)

2.FTP 上传工具(这里大家通过Bmob后台素材生成HTML,或自己编写的代码工具都可以)当然FTP会更方便管理这些文件。

设置教程

1.登陆微信小程序控制台,进入设置-》开发设置-》业务域名(这里注意,目前只有企业资质也有这个设置)

image.png

2.点击设置,注意这里需要管理员扫描

下载这个效验文件到电脑,目前格式是txt。传入到自己私人域名

image.png

3.上传到自己应用文件域名下

image.png

4.检查是否正确

上传成功后,点击保存。完成设置

显示HTML

示例代码

<!-- wxml -->
<!-- 指向微信公众平台首页的web-view -->
<web-view src="https://mp.weixin.qq.com/"></web-view>

https://mp.weixin.qq.com/ 是你的HTML地址。

数据库查询标题,列表也点击开这个URL。 例如Bmob的图文素材表,都会有个HTML,大家可以把这个地址填入web-view 这样就完美的解决了小程序显示HTML代码错乱问题。