如何用Serverless构建博客系统

620 阅读9分钟
本期腾讯云大学大咖分享课程邀请到腾讯云高级工程师陈嘉欣教我们如何用Serverless构建博客系统。课程分为四个部分:
  1. 建立博客
  2. 自动发布上线
  3. 智能标签分析
  4. 在线搜索

怎样建一个基于云函数的博客

目前来说博客主要有两种。一种是博客网站,比如说是CSDN、博客园、简书和QQ空间。QQ空间其实也是个博客系统。另一种就是个人构建的博客网站。我们这里主要是讲第二种。就是也就是个人的博客网站。
从个人的博客网站这个角度讲。从技术角度其实也是可以分为两种:动态博客和静态博客。


动态博客有更长的历史,最著名的框架莫过于wordpress了,动态博客由于存在着数据库,所以能实现更多的功能,而静态博客相对来说出现得晚很多,我是从基于ruby 的 jekyll开始接触静态博客的,很大程度上是github当年开始提供github.io作为页面托管服务,使得静态博客有了很大的发展。为什么静态博客不需要数据库呢,因为静态博客都基于文章及其原信息,就能生成整个站点的所有页面,每篇博文都是单独的HTML文件,所以静态博客安全性是比较高的。然后它的性能也更好,想起来知道我没有后台,我直接就能访问了。也不用去做解析。他的发布会比动态不会更频繁。因为每一次更新博文就相当于一次发布不同意动态博客,更新篇博文需数据库里面多加了一条。另外,静态博客没有后台,所以它的功能会做的比较简单。也因此他最终生成的只是一堆静态的文件,所以只要发布到可以有静态服务的地方就可以访问,所以说非常方便托管的不同的平台上面。
这两种博客各有优势。那我们其实可不可以把他们的优势混合在一起提供更好的博客服务呢。实际上。静态博客, 包括评论功能、搜索功能其实都不是太好实现,需要借助了一些外部平台进行功能的扩展。那么云函数SCF也可以作为一个外部平台给博客提供需要的服务。不同的是云函数可以同时作为内部平台和外部平台。给静态博客跟动态内容进行服务。将静态博客跟云函数的动态服务结合起来,构成SCF博客。



整个博客结构混合之后整个结构会变成如图所示,低层的博客服务由静态博客框架hexo提供,后面我会大概介绍一下hexo。再往上是API层,可以读取到hexo生成的页面提供到UI,也能自己集成一些服务,最后提供到给用户使用。

Hexo是基于nodeJS进行开发,生成速度快,同时支持比较丰富的markdown语法,同时hexo最吸引人的一点是,有很多很好看的主题,而且无论是自己开发主题还是对原有的代码进行修改都比较友好,最后就是生成部署方式简便,这个就是静态博客都做得比较好的地方了。

整个博客项目已开源到github。blog下面就是博客相关的代码及文件,都是hexo初始生成的,lib下面是一些功能方法,cos_config.js,api目录是额外封装的扩展博客功能的代码,而scf_public.js目录就是SCF中入口函数的代码了,而template.yaml在后续的章节中会介绍到。

自动发布上线


上面讲解了如何在本地构建一个标准的hexo博客怎么建立,接下来就要进入到SCF的部分了,首先会讲一下对程序要更友好的CLI界面如何使用云函数。然后,如何使用云函数结合apigw提供简单的静态服务器功能,这里不会用到koa或者express等框架,只提供最基础的功能并不需要复杂的框架,只要了解原理,配合云服务,就是几十行代码的小任务。
  • SCF CLI
SCF CLI是腾讯云云函数(Serverless Cloud Function,SCF)产品的命令行工具。通过SCF命令行工具,您可以方便的实现函数打包、部署、本地调试,也可以方便的生成云函数的项目并基于demo项目进一步的开发。SCF CLI通过一个函数模板配置文件,完成函数及相关周边资源的描述,并基于配置文件实现本地代码及配置部署到云端的过程。

目前CLI工具支持的命令,可以看到,包括初始化,发布,本地调试,远程调用等功能都支持,这里我们先使用最简单的发布功能,CLI工具的安装及初始化教程可以在SCF的概览页找到。
  • SCF CLI —— template.yml详解
Deploy 命令整体依赖template.yml文件提供的信息,其中,最外层是resource包着,下面是函数要发布到的namespace,所有用户都会默认有一个名为default的namespace,type目前都是统一的值,描述namespace的资源类型,下面就是函数了,publishCosBlog 的 type也是描述资源类型,再下一层properties是参数,就是这个函数相关的参数,handler xxx ,runtime xxx,codeUri xxx,最后events是函数对应的触发器,这里配置了一个API触发器,什么叫触发器呢,其实顾名思义,就是触发函数的trigger,一个函数什么时候运行,总得有事件去触发它,目前云函数支持定时触发,COS触发,CMQ触发,Ckafka触发和APIgw触发等等,这里配置的就是一个APIgw触发器。也就是说,可以通过访问一个API触发函数的运行。

  • 静态服务器 —— API触发器
通过上面的template.yml生成的一个触发器。


整个发布流程为:首先写好需要写的文章,进行智能标签生成,然后生成博客的所有页面,最后利用SCF CLI进行发布。


不同类型的文件需要有不同的类型头。其中会有html文件,js文件,css文件,也会有图片,字体等等,有些是字符串编码,有些是二进制编码。这里就把博客会用到的内容写了一下,具体还有更多,可以参考代码库中的实现。实际上做的事情就是通过读取文件的扩展名,然后对其进行编码的设定

智能标签分析

为了更便于搜索,我们经常会再博客中添加标签,可是每篇文章都要自己想标签添加,总是件不太方便的事情,这里就给其添加一下智能分析标签,也就是前面发布步骤中也提到过的一个步骤。下面介绍下会用到的工具Jieba 分词。Jieba 分词库是目前做的最好的开源分词库。NodeJieba是“结巴”中文分词的 Node.js 版本实现, 由CppJieba提供底层分词算法实现, 是兼具高性能和易用性两者的 Node.js 中文分词组件。
分析添加标签逻辑比较简单,有以下几个关键点
  • hexo-front-matter:分析编辑Hexo博文元数据的工具
  • 判断无TAG情况:既可以手动添加TAG,也可以自动生成tag
  • 用jieba的生成TAG:利用jieba的关键词提取功能,配上参数控制TAG的关键程度以及TAG数量

在线内部搜索

把博客放到SCF上,也就是SCF能访问到博客的所有数据,可以做到很多单纯静态博客做不到的事情,比如内部搜索。用SCF提供API服务是云函数的看家本领,只要稍作处理,就能同时兼顾静态服务和API服务了,全文搜索功能,在文本量不是很大的情况下直接搜索就可以了,如果文本量大了就需要ES等工具辅助了,最后是如何把API跟功能结合起来,就需要修改到hexo的脚本了。
  • API服务 —— 添加路由自动解析
这里关注一下queryString,api通常都会用queryString来承载api的参数,这里我们也可以用到这个参数
  • API服务 —— 添加路由自动解析
回忆一下开始放的那个结构图,api下面是一个个文件,我们根据query参数找到对应的文件,然后把param参数传到文件中的方法,那就相当于实现了自动注册接口并自动处理自定义参数的功能了。

  • API服务 —— 回包处理
API的返回就相对简单了,注意设置好charset就行了

  • 提供全文搜索能力 ——hexo 脚本改造
如果代码很简单,建议您编写脚本,您只需要把 JavaScript 文件放到 scripts 文件夹,在启动时就会自动载入。
如果代码较复杂,或是想要发布到 NPM 上,建议编写插件。首先,在 node_modules 文件夹中建立文件夹,文件夹名称开头必须为 hexo-,如此一来 Hexo 才会在启动时载入否则 Hexo 将会忽略它。
  1. 拦截搜索事件
  2. 通过API获取搜索结果
  3. 把搜索结果转化为dom放回到用户的面前


SCF云函数还能为博客提供评论功能、静态部分自动发布、动静分离。更多细节可学习完整课程。


问卷

为了给广大开发者提供最实用、最热门前沿、最干货的视频教程,请让我们听到你的需要,感谢您的时间!点击填写 问卷


腾讯云大学是腾讯云旗下面向云生态用户的一站式学习成长平台。腾讯云大学大咖分享每周邀请内部技术大咖,为你提供免费、专业、行业最新技术动态分享。