简介: Serverless好哇!这里将针对集体与生产两个利用方向的测评 应用Serverless实现主动获取每日B站的经验值,让你更快冲到LV6! 你的业务站点还是一台服务器All in One吗?基于Serverless与阿里云产品的农产品电商网站上云!   什么是函数?刚刚考完数学没多久的我,脑力里立马想到的是自变量、因变量、函数值,也就是y=f(x)。当然,在计算机里,函数function往往指的是一段被定义好的代码程序,咱们能够通过传参调用这个定义好的函数,实现咱们所须要的性能。那么,明天的函数计算FC又是什么?   云计算时代的当下,容器化技术与各种工具倒退的DevOps,曾经把开发与运维的工作进行了新的兼顾,开发人员在实现代码的编写后,无需思考环境,间接提交到各种流水线就能够实现测试、开发、部署,我的项目构建微服务,由容器实现环境的封装。然而往往咱们最终还是须要投入精力到业务上线的集群,是公有云环境还是私有云?是裸金属服务器还是云实例ECS?是自购还是租用?

   当然,DevOps的落地,服务器\集群的运维,这些都是须要投入大量的资源与精力,DevOps是一条捷径,但不是惟一的前途。因而函数计算FC的呈现,带来了无服务Serverless的架构,让开发者在开发和部署的时候,不在有部署服务简单的感觉,对服务器的无感召,能够使开发者真正的关注在本人的代码上。阿里云Serverless函数式极简编程可专一于业务翻新,无洽购和部署老本、提供监控报警等齐备的可观测能力。函数计算是事件驱动的全托管计算服务,真正的无需去思考服务器的运维治理,只须要实现开发的代码进行上传,函数计算会通过角色策略去布局计算资源,弹性的形式执行函数,最初高效的执行部署。优雅!

 Serverless 将会有那些实用场景?是集体?还是生产?那么这次我将部署两种不同方向的利用对Serverless进行测评 一、告诉零碎与Webhook,Trigger触发与Chat机器人。许多零碎中波及到的push类性能,例如邮件、短信、Webhook。当然Webhook的能力不只是信息告诉,不过这里所指的告诉性能必然是须要基础设施也就是服务器来撑持运行,如果将这些性能间接由Serverless来操作,咱们便无需领取运维一台服务器,节俭了大量的工作与费用。同样,咱们能够利用Serverless事件驱动模型实现定时主动触发工作,主动签到主动发送。  二、其次当然是Web类的利用。基于各类Web框架的利用部署,构建基于Java、Python、PHP等语言的站点,Serverless很容易实现如wordpress这样的博客利用的上线。配合其余云产品,Codeup、OSS、RDS等,更能实现高可用高性能的Web利用,如官网提供的Kod云盘零碎。     一、应用Serverless实现B站每日登陆签到       作为一个老b站用户,b站等级无疑是妥妥的"名片",当然我早已是六级大佬的一员了。b站降级所需的经验值是要害,登陆、投币、观看都会积攒教训。为了能够疾速降级,这次我将应用阿里云Serverless,实现每日b站的登陆教训Get,观看视频教训Get,观看直播银瓜子Get(白嫖的直播送礼道具),并且配合钉钉机器人,实现Webhook的音讯推送。1.创立Serverless服务及函数 进入函数计算FC控制台,抉择【服务及函数】,点击【创立服务】

  在【创立服务】的页面中,输出服务名称,并抉择启用日志性能,日志更能能够帮忙咱们更好的排查谬误这里我当然须要标注服务的性能,即实现bilibili的日常登陆签到。

 进入【创立函数】页面,抉择【应用规范Runtime从零创立】配置函数名称,抉择运行环境为Python3,并且抉择从文件夹上传代码。留神,这里如果有依赖包须要提前下载到代码包下,我这里须要用到requests包 ,在本地须要执行 pip install -t . <模块名称>。不过后续也能够在控制台处执行下载命令这里的Python性能实现的脚本是定时触发类的,因而咱们抉择申请处理程序类型为【处理事件申请】

 下方配置触发器,抉择定时触发器,输出名称,抉择【指定工夫】,我这里抉择的是每日的23点进行脚本的运行 

Python脚本内容# -- coding: utf8 --
import requests
import json
import time
import re
import sys
import codecs
from bs4 import BeautifulSoup
from json.decoder import JSONDecodeError

B站登陆Cookie

cookie = ""

Webhook地址

webhook = "https://oapi.dingtalk.com/robot/send?access_token=xxxx"

主动观看的BV号,杰伦新专-最平凡的作品

bid = 'BV1ua411p7iA'

uid=re.match('(?<=DedeUserID=).*?(?=;)',cookie)
sid=re.match('(?<=sid=).*?(?=;)',cookie)
csrf=re.match('(?<=bili_jct=).*',cookie)

局部编码问题

sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach())

bv转为av

def bv_to_av(bv):

headers={   'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36',}r = requests.get('https://api.bilibili.com/x/web-interface/view', {'bvid': bv}, headers=headers)response = decode_json(r)try:    return str(response['data']['aid'])except (KeyError, TypeError):    return '883409884'

json解析

def decode_json(r):

try:    response = r.json()except JSONDecodeError:    return -1else:    return response

自定义钉钉机器人推送

def pushinfo(info,specific):

定义推送内容,格局参考https://open.dingtalk.com/doc...

留神机器人的关键词

data = { "msgtype": "text",  "text": {  "title":"Taoreset",      "content": "【Taoreset-Serverless推送】\n"+info+specific }

}

headers = {'content-type': 'application/json'} # 申请头r = requests.post(webhook, headers=headers, data=json.dumps(data))r.encoding = 'utf-8'print (r.text)

阿b登录,得登陆教训

def login():

headers={   'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36','Cookie':cookie}response = requests.session().get('http://api.bilibili.com/x/space/myinfo',headers=headers)rejson = json.loads(response.text)code = rejson['code']msg = rejson['message']if code == 0:    print('登录胜利')    return Trueelse:    print('登录失败:'+msg)    return False

获取用户信息

def get_user_info():

headers = {    'Cookie':cookie}response = requests.session().get('http://api.bilibili.com/x/space/myinfo?jsonp=jsonp',headers=headers)rejson = json.loads(response.text)code = rejson['code']msg = rejson['message']if code == 0:    userInfo=['账号:'+str(rejson['data']['silence']),    '硬币:'+str(rejson['data']['coins']),    '教训:'+str(rejson['data']['level_exp']['current_exp'])+"/"+str(rejson['data']['level_exp']['next_exp']),    '等级:'+str(rejson['data']['level']),    '昵称:'+str(rejson['data']['name'])    ]    print(userInfo[0])     print (userInfo[1])    print(userInfo[2])    print(userInfo[3])    print(userInfo[4])    return userInfoelse:    print("用户信息获取失败:"+msg)    return "用户信息获取失败:"+msg

直播签到,赚银瓜子儿

def do_sign():

headers = {    'Cookie':cookie}response = requests.session().get('https://api.live.bilibili.com/sign/doSign',headers=headers)rejson = json.loads(response.text)code = rejson['code']msg = rejson['message']if code == 0:    print('直播签到胜利!')     return Trueelse:    print("直播签到失败:"+msg)    return False

看BV号视频,得观看教训

def watch():

    aid=bv_to_av(bid)    headers = {        'Cookie':cookie    }    response = requests.session().get('http://api.bilibili.com/x/web-interface/view?aid='+str(aid),headers=headers)    rejson = json.loads(response.text)    code = rejson['code']    #print(response.text)    if code == 0:        cid = rejson['data']['cid']        duration = rejson['data']['duration']    else:        print('视频信息解析失败')        return False    payload = {        'aid': aid,        'cid': cid,        'jsonp': "jsonp",        'mid': uid,        'csrf': csrf,        'played_time': 0,        'pause': False,        'realtime': duration,        'dt': 7,        'play_type': 1,        'start_ts': int(time.time()),    }    response = requests.session().post('http://api.bilibili.com/x/report/web/heartbeat',data=payload,headers=headers)    rejson = json.loads(response.text)    code = rejson['code']    if code == 0:        time.sleep(5)        payload['played_time'] = duration - 1        payload['play_type'] = 0        payload['start_ts'] = int(time.time())        response = requests.session().post('http://api.bilibili.com/x/report/web/heartbeat',data=payload,headers=headers)        rejson = json.loads(response.text)        code = rejson['code']        if code == 0:            print(f"av{aid}观看胜利")            return True    print(f"av{aid}观看失败 {response}")    return False

def main(*args):

if login():    ui = get_user_info()    desp='直播签到:'+str(do_sign())+'\n\n'+'观看视频:'+str(watch())+'\n\n'+ui[0]+'\n\n'+ui[1]+'\n\n'+ui[2]+'\n\n'+ui[3]+'\n\n'+ui[4]+'\n\n'    pushinfo('哔哩哔哩签到胜利',desp)else:    pushinfo('哔哩哔哩签到失败','')

if name == '__main__':

main() 2.批改函数配置实现函数的创立后就进入了函数治理的界面。函数代码这里就显示了咱们上传的代码文件,所有代码执行的本地门路都在/code目录下。


如果有依赖模块提醒没有,在下方的控制台终端输出命令也能够实现模块装置下载,所有工作目录下的代码批改,实现后都须要点击部署代码进行部署上传。pip install -t . requests bs4

 其余须要批改一下函数的配置,点击【函数配置】,找到【环境信息】编辑,批改【申请处理程序】,批改函数入口为<要执行的代码文件名.执行的函数名>,我这里脚本的文件名为bilibiliSignin.py,代码里的主函数为main,因而函数入口就为<bilibiliSignin.main>

 3.实现函数功能测试抉择【测试函数】,即可立刻对函数进行触发,点击测试函数进行测试

实现测试后下方就会显示日志输入内容,不便查看后果和排错

  实现成果,定时触发23点准时实现签到,并由钉钉的机器人推送音讯

 欸嘿,大伙一起吧Serverless脚本跑起来,早日迎接B站六级会员!!!

 脚本参考Github ,by sanshuifeibing 二、Serverless农产品电商网站上云革新   这里我拿隔壁软件业余(俺是网络技术的)的一个大作业我的项目作为部署的案例。我的项目是非常简单并且性能繁多的,然而也是十分经典的前后端拆散我的项目,因为我开发不太会,我的项目具体技术就不献丑了。之前据说是有什么版权的,我就不放源代码了hhhh   在革新之前,我置信是很多中小型公司业务的经典AllinOne构造,把业务波及到的所有服务中间件运行在一台服务器/虚拟机上,尽管当初看可能完完全全是实验室环境,然而理论看到的仍然有很多我的项目是这么做的。害处也不必多提,部署运维难、难以进行资源的扩容、后续革新简单、性能差没有利用高可用技术等等。。。 

   Serverless的农产品电商平台上云,我的项目比较简单,布局就在同一地区了。次要是将前端HTML页面与后端Jar包运行别离由两个独自的Serverless函数实现运行计算。其余撑持服务上云,别离用对应的云产品实现,这里Redis服务因为我本人ECS上有运行redis服务,就不再独自购买云数据库Redis版了,当然举荐应用阿里云的Redis云数据库产品。   

 1.Serverless服务创立进入函数计算控制台,抉择【服务及函数】,点击【创立服务】输出创立服务的名称与形容,开启日志性能,点击确定,实现服务的创立

 服务创立实现后,进入【服务详情】,找到【网络配置】,点击【编辑】抉择容许拜访VPC,抉择自定义配置,抉择VPC、vSwitch、平安组,这里须要和后续其余撑持的云产品(数据库等)放弃在同一VPC下。因而须要做好云上网络的布局,也要看一下产品是否在地区下有没有库存。

 2.前端页面Serverless函数创立实现服务创立后,点击【创立函数】,进入函数的创立页面抉择【应用自定义运行时平滑迁徙WebServer】,输出函数名称,抉择运行环境为【Nginx】,上传前端html代码与nginx的配置文件,抉择监听端口为80,即为原nginx中间件的服务端口。

      实现函数创立后,进入到函数详情界面,能够在函数代码中对代码进行编辑批改,代码改变后须要点击部署代码从新上传。上述也提到了,这里须要将Nginx服务配置一起上传,其中须要拷贝一份/etc/nginx/mime.types文件到当下目录,防止mime文件类型映射谬误。   这里放nginx要害配置,依据本人的业务状况批改,留神配置中端口监听须要与函数创立监听端口保持一致,同时网页代码的门路设置为/codehttp {

include mime.types;  #留神引入此文件keepalive_timeout  900;server {    listen       80;            server_name  localhost;    location / {        root   /code;        index  index.html index.htm;        proxy_set_header    Host $host;         proxy_set_header    X-Real-IP $remote_addr;          proxy_set_header    X-Forwarded-For  $proxy_add_x_forwarded_for;   }    location /users {        proxy_pass http://serverless.后端函数拜访地址.run;      

Nginx反代传给后端的函数,地址在后续后端函数创立完能够拷贝

    }    location /items {        proxy_pass http://serverless.后端函数拜访地址.run; 

Nginx反代传给后端的函数,地址在后续后端函数创立完能够拷贝


  能够在调用日志查问相干日志

 当函数触发运行,Serverless将会依据拜访申请主动起实例,在这里能够手动登陆实例,去进行中间件服务的日志、运行环境的一些查看与排错。

3.后端Serverless函数创立   回到函数服务界面,再次点击【创立函数】,进入函数的创立页面抉择【应用自定义运行时平滑迁徙WebServer】,输出函数名称,抉择运行环境为【Java】,上传打包好的Jar包文件。   依据具体业务批改【启动命令】与【监听端口】。我这里须要监听业务端口为8080,并且须要在运行时传入数据库连贯的参数,这里所配置的数据库源用户名明码连贯地址,在后续的云数据库RDS中会进行相干设置。 

 后端函数创立实现后进入函数详情界面,其余性能与上述前端函数雷同,不再复述

 点击【触发器治理】,此处HTTP触发器提供了公网与内网拜访地址,咱们拷贝内网地址在前端中间件反代配置处填入此域名,实现拜访前端触发后端函数

 4.云数据库RDS MySQL Serverless创立与迁徙导入   原有Allinone架构中没有做到数据库服务的独立与高可用,在此次云化部署,咱们将选用阿里云公测中的云数据库Serverless版本。RDS MySQL Serverless提供了CPU、内存的实时弹性能力,具备资源用量低、简略易用、弹性灵便和价格低廉等长处,正当优化应用老本,进一步降本增效。RDS MySQL Serverless实例创立   进入云数据库RDS控制台,点击【创立实例】,开始创立实例的流程,在【根底资源】设置界面,抉择Serverless版,其余依据理论进行抉择  

 Serverless RDS创立时【实例配置】须要留神网络VPC的设置,要与Serverless服务所设定的VPC统一,实现内网数据互通。确定订单后,期待实例创立实现即可

RDS数据库用户设置实现实例创立,抉择治理实例。在左侧任务栏抉择【账号治理】,点击【创立账号】创立数据库账户供电商平台后端进行连贯。输出账户名、明码,抉择为一般账户,点击确定实现用户创立 

 RDS 业务数据库创立抉择左侧栏中【数据库治理】,抉择【创立数据库】输出农产品电商业务所需的库名,并且受权账户给前一步设置的用户,点击创立实现库的设置。

 RDS 服务连贯地址咱们的Serverless函数中所须要连贯库的地址,在rds实例中【数据库】连接处能够查到,不过须要提前设定白名单。

 咱们将内网地址进行拷贝,并且也实现了连贯用户、明码、库的配置,就能够配置到Serverless函数或者是后端代码中了

 RDS 业务数据库的导入复原   数据库的上云要害是数据内容的迁徙,这次部署的业务数据库很少又很小,因而应用简略的备份SQL脚本文件作为迁徙的形式。MySQL/Mariadb的数据导出有多种形式,能够依据理论需要进行备份导出,当然大型业务库有专用的备份迁徙工具,这里不细说了。进入DMS数据管理服务,抉择【数据库开发】,在【数据变更】下点击【数据导入】。依据具体备份形式导入数据库,我这里抉择上传备份的sql脚本,提交申请开始导入数据

 数据导入实现,数据迁徙实现

   5.Redis服务上云与动态资源CDN   Redis服务上云,前文也提到了,这里Redis服务因为我本人ECS上有运行redis服务,就不再独自购买云数据库Redis版了,ECS也处于同一VPC之下,能够实现内网互通。当然举荐应用阿里云的Redis云数据库产品。

    动态资源的CDN,包含css\js\图片的减速,原有架构中曾经寄存在阿里的CDN服务上了,我这里就不多做改变了。   6.公网业务拜访域名配置   最初一步,用户最终拜访的是前端Serverless函数,如同阿里云给出的提醒,拜访默认的公网地址不会做任何中间件解析,而是间接下载首页html动态文件,因而咱们须要本人配置拜访域名。

    回到函数计算控制台,抉择【域名治理】,点击【增加自定义域名】输出自定的域名,配置路由,抉择对应函数的服务名称、函数名称、版本号LATEST(最新)将须要解析的CNAME值,拷贝

拷贝CNAME记录值,点击【云解析DNS控制台】,进入解析设置,点击【增加记录】抉择记录类型【CNAME】,输出主机头,填入拷贝的记录值,确认实现增加

 7.农产品电商我的项目Serverless上云成果首页,拜访成果,前端函数无误

 农产品详情页拜访

  用户注册功能测试,数据库连贯与写入无误

 RDS中数据已胜利写入

 用户登陆测试

 订单提交测试,后端函数无误

  三、应用Serverless利用模板疾速构建litemall电商利用零碎1.基于官网模板创立利用Serverless利用提供了大量的官网利用模板,咱们能够依据给出的模板来批改本人的业务,因而相熟模板的部署也很重要。进入到函数计算FC的控制台页面,点击【利用】,抉择【通过模板创立利用】,抉择【商城案例】 

 通过详情查看部署模板的信息,以及查问源代码,点击立刻创立能够疾速体验Serverless利用的创立,本地部署能够通过ServerlessDev工具进行部署

 2.对创立利用进行配置点击立刻创立后,咱们进行利用的初始化配置。部署类型有两种:1.通过第三方代码仓库部署,2.间接部署两者区别就是应用本人的仓库代码后续能够通过push更新我的项目公布,而间接部署须要手动配置。这里就能够看到,咱们的交付触发也是以Git仓库push提交为主,每次提交会主动触发部署。如是本人配置利用,须要依据业务配置s.yaml文件,参考:https://www.serverless-devs.c... 这里我抉择Gitee仓库进行部署,然而须要进行仓库第三方利用的受权

 点击返回受权,跳转到gitee的站点进行OAuth受权申请,点击批准受权

 阿里用户在第一次应用FC函数计算时,须要对角色策略进行增加的,我这里曾经应用过FC了,若提醒须要增加策略,依照提醒点击增加即可。 

 其余高级配置,须要依据业务进行批改,这里留神地区的选定,后续的其余弹性资源都会在此地区下,我这里抉择本地杭州。

  实现配置后点击创立,代码曾经新建上传到我的Gitee仓库了。这里提供的s.yaml能够作为配置的参考,后续依据所部署的业务去批改yaml

 3.利用部署上线

利用创立实现,首次主动进行部署,这里部署状态能够看到正在部署

 查看部署日志,如果部署呈现谬误也能够从日志信息中查问报错。

部署经验了前置环境、资源同步、资源查看、执行部署这四个步骤后,咱们的电商利用就实现了部署 

 首次部署实现,也是最新latest的一次部署版本,能够通过部署历史自在的进行回滚 

 4.拜访部署上线的电商利用拜访测试的域名,就能够看到咱们上线的litemall电商零碎,进入电商利用的后盾治理 

 litemall电商零碎是一个开源的前后端拆散带微信小程序的电商零碎,具备电商平台根底的会员治理、商城治理、商品治理、推广治理、系统管理、配置管理、统计报表。

 litemall电商零碎,须要配置最小开发环境有以下:MySQLJDK1.8或以上MavenNodejs

   5.更换业务域名拜访同样,当咱们失常上线了FC的业务时,Serverless用的是默认拜访地址函数计算上线提供的域名是以..fc.aliyuncs.com//proxy///[action?queries]为默认的,若是失常业务拜访咱们必然要批改拜访的域名。

 进入到函数计算FC的首页,点击高级性能下的域名治理,这里能够看到咱们上线电商利用时的默认域名曾经路由信息咱们抉择增加自定义域名 

 输出域名的名称,也就是购买备案的域名下的自定义二级域名点击路由配置,抉择服务名称,这里是咱们部署的电商零碎litemall,选择函数名称与版本拷贝公网CNAME地址,后续在DNS域名管理处增加解析

 进入到域名治理下,增加一条记录,记录类型抉择CNAME,输出主机记录,将刚刚拷贝的公网CNAME地址粘到记录值,点击增加即可

 回到函数计算FC,在最初点击创立即可,回到主页看到咱们新绑定的域名

 最初,拿手机拜访我自定义配置的公网地址电商服务失常上线,公网地址失常拜访主页 

 商品的详情购买页面

  最初Serverless绝对其余计划来说,也是非常容易上手并高效的技术计划。下面的部署测试,其实还有很多须要改良的中央,例如第二个农产品电商上云我的项目,真正牢靠的云上业务还须要负载平衡、高可用多地容灾、平安等其余云产品的引入,我想把案例的重点放在Serverless服务器无感召上,自己也应用过不少阿里云的技术产品,深知对底层基础设施运维难度。尽管这几个月学习生存比拟忙碌,然而还是对社区的各种流动十分感兴趣,也想做一些更好的测试。这次的Serverless无论是对个人用户,还是企业用户。都是一种十分不错的抉择,弹性资源与按需付费,更加节俭资源与Money,更加优雅!原文链接:http://click.aliyun.com/m/100...本文为阿里云原创内容,未经容许不得转载。