聊一聊我最近使用的uniCloud是个什么玩意

麦洛 等级 1125 0 0

聊一聊我最近使用的uniCloud是个什么玩意

什么是Serverless

在介绍什么是Serverless的时候,希望通过回答一些问题帮助大家了解什么是Serverless。一个最好的问题就是——Serverless是不是就是FaaS

"功能即服务"(或称为 FaaS)是一种在无状态容器中运行的事件驱动型计算执行模型,这些功能将利用服务来管理服务器端逻辑和状态

下面是维基百科对“Serverless”的中文和英文的解释:

聊一聊我最近使用的uniCloud是个什么玩意

聊一聊我最近使用的uniCloud是个什么玩意

中文解释为Serverless就是FaaS;英文解释就比较丰富了,它把Serverless分成Runtime和Databases,FaaS相当于是Runtime类别的产品,所以这方面的误解还是挺多的。

现在市面上的一些Serverless服务,比如腾讯云和阿里云:

腾讯云 Serverless服务:

聊一聊我最近使用的uniCloud是个什么玩意

阿里云Serverless服务:

聊一聊我最近使用的uniCloud是个什么玩意

到这里就可以发现FaaSServerless有些区别了,整体来看FaaS服务,是Serverless计算服务的一部分。

目前来讲,提供无需关注底层基础设施的服务可以称为Serverless那么无需关注底层基础设施可以怎么理解呢?

首先是我们不去维护这下面的底层基础设施;其次是不关心它的资源的扩展情况,就像DB,我们知道它是可能运行在K8S集群上,也知道它有内存有CPU有磁盘,但我们并不需要关心这些资源的情况。

什么是uniCloud

uniCloud 是 DCloud 联合阿里云、腾讯云,为开发者提供的基于 serverless 模式和 js 编程的云开发平台。

到底是怎么一回事?听我给你简单说一下

对架构演进有了解的同学都知道,很早之前一般是单体架构,前后端代码写在一起,一般一个人单甩一个项目。后来随着技术的演进,工种演化为前端开发人员和后端开发人员,前后端分离架构应运而生。

近几年,随着云计算的流行,国外有人就提出了Serverless思想。既然后端这么重,那我直接不要你了,我js编程直接搞定。前端收集到的数据不用往后端传,直接js操作入库,前端要展示数据,直接js查询数据库获取数据。听起来都很牛逼!

uniCloud就是这样的一个平台,如何实现我们上面所说的操作,就需要谈一谈uniCloud的基本概念。

更多介绍,可以看这里什么是uniCloud - uni-app官网 (dcloud.io)

uniCloud的基本概念

服务空间

一个服务空间对应一整套独立的云开发资源,包括数据库、存储空间、云函数等资源。服务空间之间彼此隔离。

每个服务空间都有一个全局唯一的space ID,至于在云服务器怎么隔离的,我们就不需要关注了

目前阿里云和腾讯云都是免费开通,腾讯云有些功能已经收费,不用多想,未来一定收费。

聊一聊我最近使用的uniCloud是个什么玩意

云数据

uniCloud同时支持阿里云和腾讯云,它们的数据库大体相同,有细微差异。阿里云的数据库是mongoDB4.0,腾讯云则使用自研的文档型数据库(兼容mongoDB 4.0版本)。uniCloud基本抹平了不同云厂商的差异,有差异的部分会在文档中单独标注。所以熟悉mongoDB的同学就很容易上手了!

那么如何操作数据库?

  • 云函数操作数据库是较为传统的开发方式,使用nodejs写云函数、使用传统的MongoDB的API操作云数据库。
  • 客户端访问云数据库,称为clientDB。这种开发方式可大幅提升开发效率,避免开发者开发服务器代码,并且支持更易用的jql语法操作数据库,是更为推荐的开发方式。clientDB有单独一套权限和字段值控制系统,无需单独数据库安全。其实就是把MongoDB的API封装了一层,待会给大家演示

聊一聊我最近使用的uniCloud是个什么玩意

云函数

云函数是运行在云端的 JavaScript 代码,和普通的Node.js开发一样,熟悉Node.js的开发者可以直接上手。

就是这一部分直接代替了后端,让不熟悉后端的前端人员直接可以上手,降低了学习了成本。那后端人员干嘛去?如果真有那么一天,可能会去搞云计算开发吧,只是对业务的关注度会降低吧!

uniCloud的开发模式

通过上面的介绍,我们大致了解了什么是uniCloud,接下来我们通过一些代码片段来直观的看一看在前端如何直接和数据库交互。

//首先我们要获取db对象,用它来操作云数据库
const db = uniCloud.database();

新增数据

//数据对象
formData: {
    "colony_house_name": "",
        "colony_house_area": "",
            "describe": ""
}

db.collection('table_name').add(formdata).then((res) => {
    uni.showToast({
        icon: 'none',
        title: '新增成功'
    })
    // 处理数据

}).catch((err) => {
    uni.showModal({
        content: err.message || '请求服务失败',
        showCancel: false
    })
}).finally(() => {
    uni.hideLoading()
})

修改数据

                db.collection(dbCollectionName).doc("5f79fdb337d16d0001899566").update(formdata).then((res) => {
                    uni.showToast({
                        icon: 'none',
                        title: '修改成功'
                    })
                    // 处理数据

                }).catch((err) => {
                    uni.showModal({
                        content: err.message || '请求服务失败',
                        showCancel: false
                    })
                }).finally(() => {
                    uni.hideLoading()
                })

删除数据

const db = uniCloud.database();
db.collection("table1").doc("5f79fdb337d16d0001899566").remove()

查询数据

单表查询

  db.collection('list')
    .where('name == "hello-uni-app"')
    .get()
    .then((res)=>{
      // res 为数据库查询结果
    }).catch((err)=>{
      // err.message 错误信息
      // err.code 错误码
    })

联表查询

table_name_a是主表,table_name_b是副表,关联查询时候,需要将主表放到第一位。需要在主表的主键字段增加映射关系,就是下面的foreignKey,表示这个字段映射到table_name_b表的_id字段

"plant_breed_classify_code": {
            "bsonType": "string",
            "description": "养殖类型编码",
            "trim": "both",
            "foreignKey": "table_name_b._id" // 使用foreignKey表示,此字段关联s-plant-breed-classify表的_id。
        },
            db.collection('table_name_a,table_name_b')
                .where({
                    create_by:userId
                })
                .field('plant_breed_classify_code{classify_name}')
                .groupBy('plant_breed_classify_code')
                .groupField('count(*) as total')
                .get()
                .then((res) => {
                    const data = res.result.data;
                    if (data) {
                        //处理数据
                    }
                }).catch((err) => {
                    uni.showModal({
                        content: err.message || '请求服务失败',
                        showCancel: false
                    })
                }).finally(() => {
                    uni.hideLoading()
                })

uniCloud的优缺点

结合我最近使用的情况,来谈谈我认为的uniCloud的优缺点

优点

  • 简化了传统开发模式,提高了轻应用的开发效率
  • 一定程度上降低了企业的人工成本,后端可以少招人....
  • 降低了前端人员学习压力,实现某一部分的全栈梦
  • 由于目前serverless处于免费阶段,可以为企业剩下服务器和运维方面的成本

缺点

  • 官方文档太乱,案例太少,不利于快速上手
  • 多表关联查询场景下不理想,尤其你正在开发一个统计页面
  • 云数据目前不支持删除数据,需要api调用才可以
  • 假如你习惯了关系型数据库,习惯了navicat,你会发现在这里搞数据会非常别扭
  • 没有类似MySQL的分析器,不太容易发现你的查询语句哪里出错

总结

通过最近使用uniCloud的情况来说,如果你是一个前端人员,还是挺爽的。相对于以往的小程序需要接入后台项目,后台项目又需要和微信服务器交互模式来说,uniCloud算是一次质的飞跃。免费代表着还在推广阶段,所以很多功能需要完善,当然天下没有免费的午餐,收费时代早晚会到来,别被套牢就行。

收藏
评论区

相关推荐

基于mysqldump聊一聊MySQL的备份和恢复
前言 Hi,大家好,我是麦洛,今天我们聊聊MySQL的备份和恢复,在下面文章中,你会了解到MySQL常见的备份类型,以及基于mysqldump命令在日常开发中如何做
聊聊前端面试
前言面试造飞机,入职拧螺丝。裸面是不可能裸面的,这辈子都不可能再裸面的了!因为它会严重打击你的自信心,面试官能把你虐到怀疑人生。作为一个工作了将近 3 年前端er,来简单聊聊自己面试所做的一些准备。PS. 最终拿到了虎牙直播、有赞、金蝶、晓教育前端小组长、明源云的 Offer,经过对比,目前在深信服,哈哈,意不意外,惊不惊喜???热身篇 确
聊聊dubbo协议
协议协议通俗易懂地解释就是通信双方需要遵循的约定。我们了解的常见的网络传输协议有tcp、udp、http等。再到我们常用的基础组件,一般来说client端与server端也有相应的协议,如redis、mysql、zookeeper等都是各自约定的私有协议,同样今天标题中的dubbo协议也是一种私有协议,他们都是应用层协议,基于tcp或udp设计。
聊聊dubbo协议2
在中介绍了attachments在consumer和provider间的传递情况,有个疑问没有给出答案。为什么2.7.x版本的dubbo不支持provider端向consumer端回传隐式参数呢?今天的续集将揭晓答案。 抓包确定是provider没发还是consumer丢掉 以下测试基于dubbo 2.7.6版本在provider端加入下面的代码
聊聊golang的DDD项目结构
序本文主要研究一下golang的DDD项目结构interfacesfoodappserver/interfacesinterfaces git:(master) tree.|____fileupload| |____fileformat.go| |____fileupload.go|____food_handler.go|__
沉寂了一周,我开发了一个聊天室
前言最近一周没有发文章了,我在这里向大家说一声抱歉。今天,我们来从零开始开发一款聊天室。好,我们现在就开始。了解WebSocket开发聊天室,我们需要用到WebSocket这个网络通信协议,那么为什么会用到它呢?我们首先来引用阮一峰大佬的一篇文章一段话: 初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协
聊聊js中的数组
前言Hello,大家好,我是Symbol卢,由于年前公司的业务比较紧,也有一段时间没有更新文章了(有几篇文章还没结搞),于是就是在大年初一和初二这两天写了这篇关于js数组的水文。由于内容比较多,打算分成两期进行分享(此文为第一期),如果文章中有不恰当的地方,也欢迎各位大佬(前辈)多多指教,(本人菜的抠脚,文中称为笔者),好了废话不多说,咱们直接进入正文关于数
聊一聊我最近使用的uniCloud是个什么玩意
什么是Serverless在介绍什么是Serverless的时候,希望通过回答一些问题帮助大家了解什么是Serverless。一个最好的问题就是——Serverless是不是就是FaaS? "功能即服务"(或称为 FaaS)是一种在无状态容器中运行的事件驱动型计算执行模型,这些功能将利用服务来管理服务器端逻辑和状态下面是维基百科对“Serverless”的中
聊聊软件工程的“内卷”
软件工程的开发曲线极度类似 emacs 的学习曲线。这确实令人尴尬,哭笑不得,又很是郁闷。(心中一万只……) 内卷是如何产生的? 过程式的编程方法是导致内卷的原罪过程式的方法要求我们必须一步一步走遍软件工程的每个角落,才能看出整个工程的一点点影子。而工程规模越大,代码量越多,逻辑过程就越复杂,内卷就越严重,使人陷入其中难以自拔。 逻辑过程就是“内卷”所以,内
聊聊t-io和netty的差异
引言tio和netty的差异,这是个被大量问及的问题,在此,作为tio作者,列一些差异化的东西tio的最大优势API设计易懂,尽量避免引入自创概念——最大限度降低学习成本接管了大量业务资源的绑定与自动解绑,开发人员只需要无脑地调用API即可完成绑定与解绑功能,这个处理如果丢给业务开发人员是极其复杂易错的: 多线程环境下的集合管理都是要同步安全的,同步的设计既
ES6 系列之我们来聊聊装饰器
_摘要:_ ## Decorator 装饰器主要用于: 1. 装饰类 2. 装饰方法或属性 ### 装饰类 \`\`\`js [@annotation](https://my.oschina.net/annotation) class MyClass { } function annotation(target) { target.annotated = t
Java反射进阶—聊聊反射的几个问题
![](https://oscimg.oschina.net/oscnet/b1273181-ac5f-42ad-8cba-53a8f6cd5ce4.png) 点击上方蓝字关注我,每天一见,给你力量 ![](https://oscimg.oschina.net/oscnet/e9e322d9-a3a1-4b96-a367-e9121f673c4b.png
Java面试凉经总结篇:和大家聊聊我是怎么没的?
前言: --- 前几篇文章为大家分享了一些朋友的面试成功经历,有的读者就单独私聊我问了,就没有一些面试失败的经历吗? 答案当然是:有的,接下来就为大家分享下几位**面试失败者的经历**,希望能**帮助大家避避坑**。 同时也祝他们能够在接下来的面试中吸取经验,斩获Offer,废话不多说,正题走起! ![在这里插入图片描述](https://img-b
10月了,聊聊我今年参加秋招的真实感受
现在已经10月了,都说金九银十,这个说法到现在应该也不对了,在互联网行业,可能都是金七金八,铁九铜十,在现在的秋招的模式下,一般很多公司已经在7月就大规模的展开提前批的招聘了,而且,很多的offer基本上都是在7月和8月发出的,所以,一般来说,到了9月10月的时候,剩下的offer其实已经不多了,这里给大家如果还没有参加秋招的提个醒,互联网找工作,一定得提早
DevOps和它的朋友们——聊聊其他 “Ops”(一)
DevOps不仅仅是将敏捷开发概念与IT运维相结合,还简化了在云环境中开发和部署应用程序的过程,从而使开发生命周期大大缩短。这就是DevOps作为一种开发方法流行的原因。 即使在今天,DevOps仍然是大多数优化管道的核心。持续交付变成了规范,而不是要实现的目标。应用的开发是迭代的,新的更新被推送到云端,用zero down代替部分或整个环境。因为