defwatch(DEshaw)

none

什么是函数?数学考完没多久,我马上想到了自变量,因变量,函数值,也就是y=f(x)。当然,在计算机中,函数function往往是指一个定义好的代码程序。我们可以通过传递参数来调用这个定义好的函数,实现我们需要的功能。那么,今天的函数计算FC是什么呢?

云计算时代,DevOps随着容器化技术和各种工具的发展,对开发和运维做了新的整体规划。完成代码编写后,开发者可以直接提交给各种管道完成测试、开发和部署,无需考虑环境。项目构建微服务,容器完成环境的封装。但通常我们仍然需要投资于业务在线的集群。是私有云还是公有云?是裸机服务器还是云实例ECS?自购还是租赁?

当然DevOps的落地和服务器\集群的运维需要大量的资源和精力。DevOps是一条捷径,但不是唯一的出路。所以功能计算FC的出现带来了无服务器的架构,让开发者在开发部署时不再感受到部署服务的复杂,对服务器也没有影响,让开发者可以真正专注于自己的代码。阿里云无服务器功能极简编程可以专注于业务创新,没有采购和部署成本,具有完整的监控和报警等可观察能力。函数计算是一种事件驱动的完全托管计算服务。真的不需要考虑服务器的运维管理。它只需要完成开发的代码并上传即可。功能计算将通过角色策略规划计算资源,灵活执行功能,最终高效实现部署。优雅!

无服务器会有哪些适用场景?是人吗?还是生产?所以这次我将部署两个不同的应用程序来评估Serverless。

I .通知系统和Webhook,Trigger触发器和聊天机器人。系统中涉及到很多推送功能,比如e-mail、SMS和Webhook。当然,Webhook的能力不仅仅是信息通知,这里的通知功能必须需要基础设施,也就是支持其运行的服务器。如果这些功能都是通过无服务器直接操作的话,我们就不需要支付一台服务器的运维费用,省去了很多工作和费用。同样,我们可以使用无服务器事件驱动模型,定时自动触发任务,自动签到,自动发送。

其次当然是Web类的应用。基于各种Web框架部署应用,基于Java、Python、PHP等语言搭建网站。无服务器可以轻松实现博客应用,如wordpress online。与其他云产品合作,如Codeup、OSS、RDS等。,可以实现高可用、高性能的Web应用,比如官方的Kod云盘系统。

一、使用Serverless实现B站每日登陆签到

作为一个哔哩哔哩老用户,哔哩哔哩的评级无疑是恰当的& # 34;名片& # 34;当然,我已经是6级大佬中的一员了。升级哔哩哔哩需要的经验值是关键,经验会在登陆、投币、观看中积累。为了快速升级,这次我将使用阿里云Serverless实现日常哔哩哔哩登录体验Get,观看视频体验Get,观看银瓜子Get(白嫖直播送礼道具)直播,配合钉钉机器人实现Webhook的消息推送。

1.创建无服务器服务和功能。

进入函数计算的FC控制台,选择[服务和函数]并单击[创建服务]

在[创建服务]页面中,输入服务名称,并选择启用日志功能。日志可以帮助我们更好地解决错误。

这里当然需要标注一下服务的功能,就是实现哔哩哔哩的日常登录签到。

进入[创建功能]页面,选择[使用标准运行时从头开始创建]。

配置函数名,选择Python3作为运行环境,选择从文件夹上传代码。

注意,如果这里有需要提前下载到代码包的依赖包,我需要使用这里的requests包,我需要执行pip install-t . :。但是,下载命令也可以稍后在控制台执行。

这里Python函数实现的脚本是定时触发类,所以我们选择请求处理程序类型为【处理事件请求】。

在下面配置触发器,选择定时器触发器,输入名称,然后选择[指定时间]。在这里,我选择每天23点运行脚本。

Python脚本内容

#-*-编码:utf8-*-导入请求导入JSON导入时间导入从bs4导入sys导入代码从JSON导入beautiful soup。解码器导入jsondecordeerror #哔哩哔哩登录Cookiecookie = & # 34"# Webhook地址webhook = & # 34https://oapi.dingtalk.com/robot/send?接入令牌= xxxx & # 34# Auto-watch BV号,杰伦新特长-最伟大的作品bid = & # 39bv 1 ua 411 p7ia & # 39;uid = re . match(& # 39;(?& lt=DedeUserID=)。*?(?=;)',cookie)sid = re . match(& # 39;(?& lt=sid=)。*?(?=;)',cookie)csrf = re . match(& # 39;(?& lt=毕丽_jct=)。*',cookie)#部分编码问题sys . stdout = codecs . get writer(& # 34;utf-8 & # 34;)(sys.stdout.detach())# bv转换成AV def BV _ to _ AV(BV):headers = { & # 39;用户代理& # 39;: 'Mozilla/5.0(Windows NT 10.0;Win64x64) AppleWebKit/537.36 (KHTML,像壁虎一样)Chrome/80 . 0 . 3987 . 163 Safari/537.36 & # 39;,} r = requests . get(& # 39;https://api.bilibili.com/x/web-interface/view',{ & # 39;bvid & # 39:bv},headers = headers)response = decode _ JSON(r)try:return str(response[& # 39;数据& # 39;]['援助& # 39;]) except (KeyError,type error):return & # 39;883409884'# json解析def decode _ JSON(r):try:response = r . JSON()except jsondecodeerror:return-1 else:return response #自定义钉钉机器人推送def pushinfo(info,Specific):#定义推送内容,参考https://open . ding talk . com/document/group/message-types-and-data-format #注意机器人的关键字data = { & # 34msgtype & # 34: "正文& # 34;, "正文& # 34;: { "标题& # 34;:"Taoreset & # 34, "内容& # 34;: "[Tao reset-无服务器推送]\ n & # 34;+info+specific } } headers = { & # 39;内容类型& # 39;: '应用/JSON & # 39;} # request header r = requests . post(web hook,headers = headers,data = JSON . dumps(data))r . encoding = & # 39;utf-8 & # 39;Print (r.text)# A B登录,即可获得登录体验def log in():headers = { & # 39;用户代理& # 39;: 'Mozilla/5.0(Windows NT 10.0;Win64x64) AppleWebKit/537.36 (KHTML,像壁虎一样)Chrome/80 . 0 . 3987 . 163 Safari/537.36 & # 39;, '饼干& # 39;:cookie } response = requests . session()。获取(& # 39;http://api.bilibili.com/x/space/myinfo',headers = headers)rej son = JSON . loads(response . text)code = rej son[& # 39;代码& # 39;]msg = rej son[& # 39;消息& # 39;]如果code = = 0:print(& # 39;登录成功& # 39;)返回True else:print(& # 39;登录失败:& # 39;+msg)返回False#获取用户信息def Get _ user _ info():headers = { & # 39;饼干& # 39;:cookie } response = requests . session()。获取(& # 39;http://api.bilibili.com/x/space/myinfo? jsonp = jsonp & # 39;,headers = headers)rej son = JSON . loads(response . text)code = rej son[& # 39;代码& # 39;]msg = rej son[& # 39;消息& # 39;]如果code = = 0:userInfo =[& # 39;账号:& # 39;+str(rejson[& # 39;数据& # 39;]['沉默& # 39;]), '硬币:& # 39;+str(rejson[& # 39;数据& # 39;]['硬币& # 39;]), '体验:& # 39;+str(rejson[& # 39;数据& # 39;]['level _ exp & # 39]['current _ exp & # 39])+"/"+str(rejson[& # 39;数据& # 39;]['level _ exp & # 39]['next _ exp & # 39]), '等级:& # 39;+str(rejson[& # 39;数据& # 39;]['级别& # 39;]), '昵称:& # 39;+str(rejson[& # 39;数据& # 39;]['姓名& # 39;])]print(userInfo[0])print(userInfo[1])print(userInfo[2])print(userInfo[3])print(userInfo[4])return userInfo else:print(& # 34;用户信息获取失败:& # 34;+msg)return & # 34;用户信息获取失败:& # 34;+msg#直播签到,赚银瓜子def do _ sign():headers = { & # 39;饼干& # 39;:cookie } response = requests . session()。获取(& # 39;https://api.live.bilibili.com/sign/doSign',headers = headers)rej son = JSON . loads(response . text)code = rej son[& # 39;代码& # 39;]msg = rej son[& # 39;消息& # 39;]如果code = = 0:print(& # 39;直播签到成功!')返回True else:print(& # 34;现场签到失败:& # 34;+msg)返回False#要看BV视频,就得看experience def watch():aid = BV _ To _ AV(bid)headers = { & # 39;饼干& # 39;:cookie } response = requests . session()。获取(& # 39;http://api.bilibili.com/x/web-interface/view?援助= & # 39;+str(aid),headers = headers)rej son = JSON . loads(response . text)code = rej son[& # 39;代码& # 39;]# print(response . text)if code = = 0:cid = rej son[& # 39;数据& # 39;]['cid & # 39]duration = rej son[& # 39;数据& # 39;]['持续时间& # 39;]else:print(& # 39;视频解析失败& # 39;)返回虚假有效载荷= { & # 39;援助& # 39;:援助,& # 39;cid & # 39:cid,& # 39;jsonp & # 39: "jsonp & # 34, '中期& # 39;:uid,& # 39;csrf & # 39:csrf,& # 39;played _ time & # 39: 0, '暂停& # 39;:假的,& # 39;实时& # 39;:持续时间,& # 39;dt & # 39: 7, 'play _ type & # 39: 1, 'start _ ts & # 39:int(time.time()),} response = requests.session()。帖子(& # 39;http://api.bilibili.com/x/report/web/heartbeat',data=payload,headers = headers)rej son = JSON . loads(response . text)code = rej son[& # 39;代码& # 39;] if code == 0: time.sleep(5)有效载荷[& # 39;played _ time & # 39] =持续时间- 1有效负载[& # 39;play _ type & # 39] = 0有效负载[& # 39;start _ ts & # 39]= int(time . time())response = requests . session()。帖子(& # 39;http://api.bilibili.com/x/report/web/heartbeat',data=payload,headers = headers)rej son = JSON . loads(response . text)code = rej son[& # 39;代码& # 39;]如果code = = 0:print(f & # 34;Av{aid}观看成功& # 34;)返回真实打印(f & # 34Av{aid}无法观看{ response } & # 34)return false def main(* args):if log in():ui = get _ user _ info()desp = & # 39;现场入住:& # 39;+str(do _ sign())+& # 39;\ n \ n & # 39+'看视频:& # 39;+str(watch())+& # 39;\ n \ n & # 39+ui[0]+& # 39;\ n \ n & # 39+ui[1]+& # 39;\ n \ n & # 39+ui[2]+& # 39;\ n \ n & # 39+ui[3]+& # 39;\ n \ n & # 39+ui[4]+& # 39;\ n \ n & # 39pushinfo(& # 39;⿃⿵⿵⿵⿵⿵⿵⿵⿵⿵⿵⿵⿵⿵⿵⿵𝾙𝾙𝾙1277777777,desp)else:pushinfo(& # 39;签到失败& # 39;,'')if _ _ name _ _ = = & # 39_ _ main _ _ & # 39:main()2。修改功能配置

创建功能后,您将进入功能管理界面。这里的代码展示了我们上传的代码文件,所有代码执行的本地路径都在/code目录下。

如果有相关模块提示,您也可以通过在下面的控制台终端中输入命令来完成模块安装和下载。工作目录中的所有代码修改完成后,需要点击部署代码进行部署和上传。

pip安装请求bs4

其余的函数需要修改。单击[功能配置],找到要编辑的[环境信息],并修改[请求处理程序]。函数入口是:,我这里的脚本文件名是bilibiliSignin.py,代码中的主函数是main,所以函数入口是< bilibiliSignin.main & gt

3.完成功能测试

选择【测试功能】立即触发该功能,点击【测试功能】进行测试。

测试完成后,下面会显示日志输出,方便查看结果和排除故障。

完成效果,定时23点触发签到,钉钉机器人推送消息。

嘿,大家,让我们运行无服务器脚本,以便尽快满足哔哩哔哩6级成员!!!

剧本见三水飞兵的Github。

二、Serverless农产品电商网站上云改造

这里我以隔壁软件专业(我是网络技术专业)的一个大作业项目作为部署案例。项目很简单,功能单一,但也是经典的前端分离项目。因为我不擅长开发,所以就不拿项目的具体技术来忽悠了。据说之前有一些版权,就不放源代码了。哈哈哈哈

在转型之前,我相信是很多中小公司业务的经典AllinOne架构,在一台服务器/虚拟机上运行业务涉及的所有服务中间件。虽然现在可能是实验室环境,但是实际上还是有很多项目是这么做的。缺点就不用说了,部署运营难,资源扩展难,后续改造复杂,性能差,没有应用高可用技术。

Serverless的农产品电商平台在云上,项目比较简单,规划在同一个区域。主要是前端HTML页面和后端Jar包由两个独立的无服务器函数运行。其余的支持服务都在云上,由相应的云产品实现。由于redis服务运行在我自己的ECS上,所以我不单独购买Redis版本的云数据库。当然,推荐使用阿里云的Redis云数据库产品。

1.无服务器服务创建

进入函数计算控制台,选择服务和函数,点击创建服务。

输入已创建服务的名称和描述,打开日志功能,然后单击确定完成服务的创建。

创建服务后,输入服务详细信息,找到网络配置,然后单击编辑。

选择访问VPC、自定义配置、VPC、vSwitch和安全组,这些需要与其他云产品(数据库等)放在同一个VPC下。)以后支持。所以要在云上规划网络,也要看产品在本地区是否有库存。

2.首页无服务器功能创建

服务创建完成后,点击【创建功能】,进入功能创建页面。

选择【自定义运行时平滑迁移WebServer】,输入函数名,选择【nginx】作为运行环境,上传nginx的前端html代码和配置文件,选择监听端口为80,即原Nginx中间件的服务端口。

创建功能后,进入功能详细信息界面,可以编辑和修改功能代码中的代码。代码更改后,您需要单击部署代码来再次上传它。如上所述,Nginx服务配置需要一起上传,需要将/etc/nginx/mime.types文件复制到当前目录,避免mime文件类型的映射错误。

这里放上nginx的关键配置,根据自己的业务情况进行修改。注意,配置中的端口监听需要与函数创建的监听端口一致,网页代码的路径设置为/code。

http { include mime.types#注意这个文件的介绍keepalive _ timeout 900服务器{监听80;server_name本地主机;location/{ root/code;索引index.html index.htm;proxy _ set _ header Host $ hostproxy _ set _ header X-Real-IP $ remote _ addr;proxy _ set _ header X-Forwarded-For $ proxy _ add _ X _ Forwarded _ For;}位置/用户{ proxy _ pass http://server less . back end函数访问地址. run;#Nginx改为传递给后端函数,地址可以复制} location/items { proxy _ pass http://server less。后端函数访问address.run#Nginx改为传递给后端函数,可以在后续后端函数创建后复制地址}

可以在通话记录中查询相关日志。

当函数触发运行时,Serverless会根据访问请求自动启动实例,您可以手动登录实例,查看和调试中间件服务的日志和运行环境。

3.创建后端无服务器功能

返回函数服务界面,再次点击【创建函数】,进入函数创建页面。

选择【自定义运行时平滑迁移WebServer】,输入函数名,选择【Java】作为运行环境,上传打包的Jar包文件。

根据具体业务修改【启动命令】和【监控端口】。这里我需要监控8080的业务端口,运行时需要传入数据库连接参数。这里配置的数据库源用户名和密码连接地址将在后续的云数据库RDS中设置。

后台功能创建完成后,进入功能详情界面。其他功能与前端功能相同,不再赘述。

单击[触发器管理]。这里,HTTP触发器提供公共和内部网访问地址。我们复制内网地址,在前端中间件配置处填入这个域名,就可以访问前端触发后端功能。

4.云数据库RDS MySQL Serverless的创建、迁移和导入

最初的Allinone架构并没有实现数据库服务的独立性和高可用性。在本次云部署中,我们将选择阿里云测试版中的云数据库无服务器版本。RDS MySQL Serverless提供了CPU和内存的实时灵活性,具有资源消耗低、简单易用、灵活廉价等优点。可以合理优化使用成本,进一步降本增效。

RDS MySQL无服务器实例创建

进入云数据库的RDS控制台,点击【创建实例】开始创建实例的过程。在【基础资源】设置界面,选择无服务器版本,其余根据实际情况选择。

创建无服务器RDS【实例配置】时,要注意网络VPC的设置,要和无服务器服务设置的VPC一致,实现内网数据互通。确认订单后,等待实例创建完成。

RDS数据库用户设置

完成实例创建并选择管理实例。在左侧任务栏中选择【账户管理】,点击【创建账户】,创建一个数据库账户,连接到power provider平台后端。

输入帐户名和密码,将其选择为普通帐户,然后单击“确定”以完成用户创建。

RDS业务数据库创建

在左栏中选择[数据库管理]和[创建数据库]。

输入农产品电商所需的库名,将账号授权给上一步设置的用户。单击“创建”以完成库设置。

RDS服务连接地址

我们的无服务器功能中所需的连接库的地址可以在rds实例的[database]连接中找到,但是白名单需要提前设置。

我们复制内网地址,也完成连接用户、密码、库的配置,然后就可以配置成无服务器的函数或者后端代码了。

RDS业务数据库的导入和恢复

云数据库的关键是数据内容的迁移。这次部署的业务数据库数量少,规模小,所以使用简单的备份SQL脚本文件作为迁移方法。MySQL/Mariadb数据的导出方式有很多种,可以根据实际需要进行备份导出。当然,大型商业图书馆都有专门的备份迁移工具,这里就不赘述了。

进入DMS数据管理服务,选择数据库开发,点击数据变更下的数据导入。

根据具体的备份方式导入数据库。我选择在这里上传备份sql脚本,并提交应用程序开始导入数据。

数据导入完成,数据迁移完成。

5.5上的云和静态资源CDN。Redis服务

Redis服务走向云端,如前所述。由于Redis服务运行在自己的ECS上,所以不单独购买云数据库的Redis版本。ECS也在同一个VPC下,可以实现内网互操作。当然推荐阿里云的Redis云数据库产品。

静态资源的CDN,包括css\js\ images的加速,在原架构中已经存储在阿里的CDN服务中,这里就不做改动了。

6.公共网络服务访问的域名配置

最后一步,用户最终访问前端无服务器功能。正如阿里云建议的,访问默认公网地址不会做任何中间件分析,而是直接下载首页的静态html文件,所以我们需要配置自己的访问域名。

回到函数计算控制台,选择[域名管理]并点击[添加自定义域名]。

输入自定义域名,配置路由,选择相应功能的服务名、功能名和版本号(最新)

复制要解析的CNAME值。

复制CNAME的记录值,点击【云解析DNS控制台】,输入解析设置,点击【添加记录】

选择记录类型【CNAME】,输入主机头,填写复制的记录值,确认添加完成。

7.农产品电子商务项目无服务器云效应

首页,访问效果,前端功能都没错。

访问农产品的详细信息页面

用户注册功能测试,数据库连接和编写正确。

RDS中的数据已成功写入

用户登录测试

订单提交测试,后端功能正确。

三、使用Serverless应用模板快速构建litemall电商应用系统

1.基于官方模板创建应用程序

无服务器应用提供了大量的官方应用模板,我们可以根据给定的模板修改自己的业务,所以熟悉模板的部署也很重要。

进入函数计算FC控制台页面,点击【应用】,选择【通过模板创建应用】,选择【小案例】

通过详细信息查看部署模板的信息,并查询源代码。单击“立即创建”快速体验无服务器应用程序的创建。本地部署可以通过ServerlessDev工具进行部署。

2.配置创建的应用程序。

单击“立即创建”后,我们将初始化应用程序的配置。

有两种类型的部署:1 .通过第三方代码库进行部署;2 .直接部署。

两者的区别在于,可以使用自己的仓库代码,通过推送的方式更新项目,而直接部署则需要手动配置。

正如你在这里看到的,我们的交付触发器也是基于Git warehouse的push提交,每次提交都会自动触发部署。

如果您自己配置应用程序,则需要根据您的业务配置s.yaml文件。请参考https://www.serverless-devs.com/fc/yaml/readme.

这里我选择Gitee仓库进行部署,但是需要对仓库的第三方应用进行授权。

点击授权,跳转到gitee的站点请求OAuth授权,点击同意授权。

阿里第一次用FC函数计算时,需要添加角色策略。我这里已经用FC了。如果系统提示您添加策略,请根据提示单击添加。

其他高级配置需要根据业务进行修改。这里注意地区的选择,其他后续的弹性资源都会在这个地区。我选择杭州,本地城市。

配置完成后点击Create,代码已经新建并上传到我的Gitee资源库。这里提供的s.yaml可以作为配置的参考,然后根据部署的业务修改yaml。

3.在线应用部署

应用程序创建后,第一次自动部署,这里的部署状态显示正在部署。

检查部署日志。如果部署中有错误,还可以查询日志信息并报告错误。

经过四步部署:预环境、资源同步、资源检查和部署,我们的电子商务应用程序已经部署完毕。

第一次部署完成,也是最新的一个部署版本,可以通过部署历史自由回滚。

4.访问已部署的在线电子商务应用程序。

通过访问测试的域名,可以看到我们的在线litemall电子商务系统,进入电子商务应用的后台管理。

Litemall电商系统是微信小程序从前端分离出来的开源电商系统。它基于电子商务平台,具有会员管理、商城管理、商品管理、促销管理、系统管理、配置管理和统计报表。

Litemall电子商务系统,需要配置的最低开发环境如下:

关系型数据库

JDK1.8或以上

专家

Nodejs

5.更改企业域名访问

同样,当我们正常使用FC业务上网时,Serverless使用默认的访问地址。

该函数计算在线提供的域名,如下所示..http://fc . aliyuncs . com//proxy//【动作?查询]是默认的,我们必须修改访问的域名以进行正常的业务访问。

进入函数计算FC首页,点击高级函数下的域名管理。在这里,你可以看到我们上线电子商务时默认域名的路由信息。

我们选择添加自定义域名。

输入域名名称,即备案购买的域名下的自定义二级域名。

单击路由配置,然后选择服务名。这里是litemall,我们部署的电子商务系统,选择功能名称和版本。

复制公网的CNAME地址,然后在DNS域名管理办公室添加解析。

进入域名管理,添加一条记录,选择CNAME作为记录类型,输入主机记录,将刚刚复制的公网CNAME地址粘贴到记录值中,点击添加。

回到函数计算FC,点击最后的创建,回到首页就可以看到我们新绑定的域名了。

最后,使用我的手机访问我自定义配置的公共网络地址。

电子商务服务正常在线,公网地址可以正常访问主页。

产品购买页面的详细信息

最后

与其他方案相比,Serverless也是一种非常易用且高效的技术方案。其实上面的部署测试还有待完善,比如农产品电商二云项目。真正可靠的云服务还需要引入其他云产品,如负载均衡、高可用性和多站点灾难恢复、安全性等。我想把重点放在无服务器服务器的例子上。我也用过阿里云的很多技术产品,深知底层基础设施的运维难度。

虽然最近几个月学习生活比较忙,但还是对社团的各种活动很感兴趣,想做一些更好的测试。这种无服务器既适用于个人用户,也适用于企业用户。都是非常不错的选择,灵活的资源和按需付费,更节省资源和金钱,也更优雅!

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

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

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

作者:美站资讯,如若转载,请注明出处:https://www.meizw.com/n/251900.html

发表回复

登录后才能评论