简介: 不是杰伦的那一首歌啦~

部署网站 说好不哭

在接触serverless架构之前,我们如果想实现上线一个Web网站,就要在开发前期经过操作很多冗杂但又必须的步骤,不少小白可谓是快速的从入门到退坑。

编写代码,部署应用,部署数据库,申请域名,申请SSL证书,域名备案,到最终上线起码要几天时间。(在阿里云上申请自助备案,快的管局可能需要一到两周完成全部备案流程)

即使是使用容器化大幅减少运维和编排工作,那也会面临不兼容和不稳定的情况。

如下图,一个你以为很“稳定“的容器,可能会有出乎意料的环境错误

(ps:我这次使用语雀编辑器上传动图gif报错了,所以只能嵌入HTML代码使用外部图床了)

而且,在技术之外,你会发现服务器、域名、证书加起来就是一笔不菲的开销(快来参加阿里云新用户飞天会员活动!),在有了建个人站的打算之后也可能被价格劝退。

Serverless(server +‎ -less),顾名思义——“无服务器”。但它不是真正的不用服务器设施,更贴切的是无传统服务器架构的那些烦恼。我以个人站长的视角,带大家简单的体验下使用阿里云Serverless产品——函数计算FC来开发网站的具体流程。看看通过实操来感受Serverless架构的真实使用体验。

我是如此相信 Serverless

根据主流释义,Serverless不是表示没有服务器,而表示当您在使用 Serverless 时,您无需关心底层资源,也无需登录服务器和优化服务器,只需关注最核心的代码片段,即可跳过复杂的、繁琐的基本工作。核心的代码片段完全由事件或者请求触发,平台根据请求自动平行调整服务资源。Serverless 拥有近乎无限的扩容能力,空闲时,不运行任何资源。代码运行无状态,可以轻易实现快速迭代、极速部署。

它的大致执行流程如下图:

图片来源:https://help.aliyun.com/document_detail/52895.html

所以,Serverless其实是对传统云上架构的革新,开发者只需要编写最核心的代码,比如一个请求过来如何处理和返回对应的数据。其他的软硬件服务器部署相关的事情,都交给云服务商。这节省了大量资源,仅有服务被使用时(比如网站被访问),才会计算资源消耗,大幅度降低了成本。并且具有无限无感扩容的能力,再也不用担心访问量过大服务器宕机。

也许你只是想搭建一个博客,以前可能需要买一年的服务器,起码一年开销几百元。使用阿里云函数计算FC,如果你的网站访问量并不是很高,可能一年只要花费十几块钱,甚至在每个月的免费额度的加持之下你可以几乎不花钱!

部署网站 简单点

我们打开阿里云函数计算FC控制台页面,初次使用你需要开通服务并完成RAM授权,这不用担心,跟着流程下一步即可:https://fcnext.console.aliyun.com/overview

这是使用FC使用的流程图,你可以清晰的看到上线一个Web服务有那些步骤:

首先,我们点击左侧导航栏,进入应用子页面:

选择Flask应用模板案例:

Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权。

应用部署建议使用仓库部署,使用这种方式将会Push 代码到您指定的代码仓库中,然后触发流水线部署;后期更新项目时,可以直接将代码Push 到远程仓库进行安全发布,总体更加灵活可控。

使用这种方式需要绑定仓库账户信息。

除了仓库授权,在这里你还可以设置一些有关部署的基本信息,也可以直接下一步,我就是这样做的。

大概等待15秒,一个Serverless服务就创建部署完成了:

此时,你可以直接在基本信息中访问函数计算提供的域名来访问默认站点:

到这里其实就已经实现了一个网站上线了。

不过先别急,在应用详情页面的最下方,你可以看到这个应用所使用的函数资源并在其中编写函数代码。

代码空间默认有了一个最基本的Flask框架模板,你可以在此基础上进行开发。

如上所述,访问FC提供的域名你会发现,一个基础的Web服务器就在公网环境下部署成功了。不需要买域名和SSL证书,不需要SSH登录服务器部署环境和软件,甚至不需要手动PUSH代码 。

名副其实,无标题党,一分钟部署一个网站。

(别的应用有相似的上线逻辑,在应用中心提供了一些完整的小应用,你可以直接使用)

小实践

学习阿里云函数计算FC使用的相关知识之后,这首歌剩下的时间可以完成个小实践。

实践目标:

实现RSS阅读功能的Web站点

实现步骤:

  • 安装解析工具
  • 写入装饰器和调用函数
  • 写入HTML页面

背景知识:

RSS(Really Simple Syndication,简易信息聚合)

这是一种描述和同步网站内容的格式你可以认为是一种定制个性化推送信息的服务。它能够解决你漫无目的的浏览网页的问题。它不会过时,信息越是过剩,它的意义也越加彰显。让自己关注的信息主动来找自己,且这些信息都是用户自己所需要的,这就是RSS的意义。

feedparser

这是一个Python的Feed解析库,可以处理RSS ,CDF,Atom 。使用它我们可从任何 RSS 或 Atom 订阅源得到标题、链接和文章的条目。

简要过程:

  1. 安装解析工具

这里使用的解析工具是feedparser它的feedparser.parse()函数提供了解析RSS URL的功能,它可以将RSS连接解析为一个字典feed 对应一个字典,每个entry包含一个文章的标题,作者,链接等内容。

使用pip3 install feedparser(或pip install feedparser)安装feedparser:

  1. 根据feedparser文档说明写入必要的装饰器和调用函数,示例文件:

其中,render_template()函数是flask函数,它从模版文件夹templates中呈现给定的模板上下文。我们html文件就要放在模版文件夹templates中,本例html文件为../templates/rss.html

  1. from flask import Flask, render_template
  2. import feedparser
  3.  
  4. app = Flask(__name__)
  5.  
  6. @app.route('/')
  7. def index():
  8. return render_template('index.html')
  9.  
  10. @app.route('/rss', methods=["GET"])
  11. def rss():
  12. feed = feedparser.parse(request.args.get('rssurl'))
  13. return render_template('rss.html', entries=feed.entries)
  14.  
  15. if __name__ == "__main__":
  16. app.run(host="0.0.0.0", port=9000)

  1. 写入HTML页面

根据解析出来的内容编写简单的HTML前端页面,示例文件:../templates/rss.html

  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>RSS</title>
  6. <!--引入外部CSS-->
  7. <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/5.0.2/css/bootstrap.min.css" rel="stylesheet">
  8. <!--引入外部JavaScript-->
  9. <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/5.0.2/js/bootstrap.min.js"></script>
  10. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.slim.min.js"></script>
  11. </head>
  12.  
  13. <body>
  14. <div class="container-fluid">
  15. <div class="row-fluid">
  16. <div class="span12">
  17. <!--导航栏-->
  18. <nav class="navbar navbar-expand-lg navbar-light bg-light">
  19. <div class="container-fluid">
  20. <a class="navbar-brand" href="#">RSS</a>
  21. <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
  22. <span class="navbar-toggler-icon"></span>
  23. </button>
  24. <div class="collapse navbar-collapse" id="navbarSupportedContent">
  25. <ul class="navbar-nav me-auto mb-2 mb-lg-0">
  26. <li class="nav-item">
  27. <a class="nav-link active" aria-current="page" href="#">首页</a>
  28. </li>
  29. </ul>
  30. <form class="d-flex">
  31. <input class="form-control me-2" type="search" placeholder="Search" aria-label="Search">
  32. <button class="btn btn-outline-success" type="submit">搜索</button>
  33. </form>
  34. </div>
  35. </div>
  36. </nav>
  37. <!--内容列表-->
  38. <div class="accordion" id="accordionExample">
  39. {% for entry in entries %}
  40. <div class="accordion-item">
  41. <h2 class="accordion-header" id="heading{{ loop.index }}">
  42. <button class="accordion-button" type="button" data-bs-toggle="collapse" data-bs-target="#collapse{{ loop.index }}" aria-expanded="false" aria-controls="collapse{{ loop.index }}">
  43. {{ entry.title }} | {{ entry.published }}
  44. </button>
  45. </h2>
  46. <div id="collapse{{ loop.index }}" class="accordion-collapse collapse" aria-labelledby="heading{{ loop.index }}" data-bs-parent="#accordionExample">
  47. <div class="accordion-body">
  48. {{ entry.summary | safe }}
  49. </div>
  50. </div>
  51. </div>
  52. {% endfor %}
  53. </div>
  54. </div>
  55. </div>
  56. </div>
  57. </body>
  58. </html>

文件创建完成后点击保存和部署,在应用详情页找到并访问FC给我们分配的域名。

效果:

使用方法:

我们使用GET请求方式request.args.get('rssurl')获取参数,因此在URL后面传入需要解析的RSS订阅地址参数就可以解析源并渲染成相应的阅读样式。

例如: /rss?rssurl=<解析源>

示例:http://<EIP>/rss?rssurl=https://jandan.net/feed

综上,通过Serverless函数计算FC我们只需要依靠feedparser库相应的五行代码就完成了这个小实践。

总结

我们可以真切的感受到,使用Serverless函数计算开发网站与传统架构开发有大不同,它撇去了传统开发中那些冗杂但是又不经常会去修改的配置和流程,让开发者专注于业务逻辑的开发。并且我们可以不用考虑服务器的选型,它做到了真正的弹性和灵活。

未来,我想我会再认真研究一下云原生思想和Serverless函数计算,乘着这股新风实现更加灵活和更复杂的业务应用。

更多

feedparser官网 —— https://pypi.org/project/feedparser/

feedparser文档 ——https://feedparser.readthedocs.io/en/latest/

原文链接:http://click.aliyun.com/m/1000350626/

本文为阿里云原创内容,未经允许不得转载。

一首歌的时间,手把手搭建基于FC的网站的更多相关文章

  1. 【Python+C#】手把手搭建基于Hugging Face模型的离线翻译系统,并通过C#代码进行访问

    前言:目前翻译都是在线的,要在C#开发的程序上做一个可以实时翻译的功能,好像不是那么好做.而且大多数处于局域网内,所以访问在线的api也显得比较尴尬.于是,就有了以下这篇文章,自己搭建一套简单的离线翻 ...

  2. 给我半首歌的时间,给你说明白Immutable List

    先看再点赞,给自己一点思考的时间,微信搜索[沉默王二]关注这个靠才华苟且的程序员.本文 GitHub github.com/itwanger 已收录,里面还有一线大厂整理的面试题,以及我的系列文章. ...

  3. 庐山真面目之十一微服务架构手把手教你搭建基于Jenkins的企业级CI/CD环境

    庐山真面目之十一微服务架构手把手教你搭建基于Jenkins的企业级CI/CD环境 一.介绍 说起微服务架构来,有一个环节是少不了的,那就是CI/CD持续集成的环境.当然,搭建CI/CD环境的工具很多, ...

  4. 手把手搭建一套基于 Sentry 的异常监控系统

    手把手搭建一套基于 Sentry 的异常监控系统 Sentry 开源版 DevOps refs https://github.com/getsentry/sentry sentry-anomaly-m ...

  5. 面向服务体系架构(SOA)和数据仓库(DW)的思考基于 IBM 产品体系搭建基于 SOA 和 DW 的企业基础架构平台

    面向服务体系架构(SOA)和数据仓库(DW)的思考 基于 IBM 产品体系搭建基于 SOA 和 DW 的企业基础架构平台 当前业界对面向服务体系架构(SOA)和数据仓库(Data Warehouse, ...

  6. 搭建基于python +opencv+Beautifulsoup+Neurolab机器学习平台

    搭建基于python +opencv+Beautifulsoup+Neurolab机器学习平台 By 子敬叔叔 最近在学习麦好的<机器学习实践指南案例应用解析第二版>,在安装学习环境的时候 ...

  7. 如何在ASP.NET 5上搭建基于TypeScript的Angular2项目

    一.前言 就在上月,公司的一个同事建议当前的前端全面改用AngularJs进行开发,而我们采用的就是ASP.NET 5项目,原本我的计划是采用TypeScript直接进行Angular2开发.所以借用 ...

  8. [zt]给你的Mp4大换血,精选Touch里3年收集的900多首歌,"经典不忍去的""最新近流行的",与你共享~~

    如果你是音乐爱好者: 这些歌, 请戴上耳机, 调大音量, 一个人听 ,全世界 都是你的!!!!! (一)这些歌很温暖,没有金属味,适合有阳光的午后,很悠闲... [Anaesthesia]Maximi ...

  9. 转:区块链开发(一)搭建基于以太坊go-ethereum的私有链环境

    区块链开发(一)搭建基于以太坊go-ethereum的私有链环境 wo541075754 · 2016-11-07 13:00:03 · 3730 次点击 · 预计阅读时间 3 分钟 · 约1小时前  ...

  10. 从0到1搭建基于Kafka、Flume和Hive的海量数据分析系统(一)数据收集应用

    大数据时代,一大技术特征是对海量数据采集.存储和分析的多组件解决方案.而其中对来自于传感器.APP的SDK和各类互联网应用的原生日志数据的采集存储则是基本中的基本.本系列文章将从0到1,概述一下搭建基 ...

随机推荐

  1. 32位数字电位器AD5228使用及调试总结

    一 概念 什么是数字电位计? 数字电位器(Digital Potentiometer)亦称数控可编程电阻器,是一种代替传统机械电位器(模拟电位器)的新型CMOS数字.模拟混合信号处理的集成电路.数字电 ...

  2. Java基础知识篇01——Java基本介绍

    一.什么是 Java Java 是 Sun Microsystems 于 1995 年首次发布的一种编程语言和计算平台.编程语言还是比较好理解的,什么是计算平台呢? 计算平台是电脑中运行应用程序(软件 ...

  3. JS(对象)

    一 对象 1.1 对象的相关概念(python中的字典) 什么是对象? 在 JavaScript 中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象,例如字符串.数值.数 组.函数等. 对象 ...

  4. kali2.0 metasploit安装

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_40943540/arti ...

  5. go两种遍历chan

    go中对通道chan遍历有两种方式一种是用range另一种为for select. package main import ( "fmt" "strings" ...

  6. Dynamic ReLU:微软推出提点神器,可能是最好的ReLU改进 | ECCV 2020

    论文提出了动态ReLU,能够根据输入动态地调整对应的分段激活函数,与ReLU及其变种对比,仅需额外的少量计算即可带来大幅的性能提升,能无缝嵌入到当前的主流模型中   来源:晓飞的算法工程笔记 公众号 ...

  7. UE427-C++实现摄像机视角的移动,类似开镜效果

    教程 方法 调整相机视野和弹簧臂的长度 //自带的tick函数内 需要使用DeltaTime if (bZoomIn) { ZoomFactor += DeltaTime / 0.5f; } else ...

  8. 谈谈 OI 中的查重

    鉴于最近洛谷的公开赛出现的重题引起的纠纷,我打算整理一下此类问题的危害和做法. 也许有时候无意的重题不会被处罚,但我想也应该尽量避免来换取选手的更好体验. Part 0 什么是重题 原题大致可分为完全 ...

  9. C++设计模式 - 装饰器(Decorator)

    单一职责模式: 在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任. 典型模式 Decorator Bridge ...

  10. 17 JavaScript 中的call和apply

    17 JavaScript 中的call和apply 对于咱们逆向工程师而言. 并不需要深入的理解call和apply的本质作用. 只需要知道这玩意执行起来的逻辑顺序是什么即可 在运行时. 正常的js ...