wordpress主题模板

WordPress会员推广插件Erphpdown v10.3辉哥专业破解美化版

简介

Erphpdown是一个vip会员、推广提成、收费下载、查看内容、前端个人中心、支持银联、支付宝、微信支付、贝宝,有赞云支付的WordPress 插件,插件是由模板兔开发的一款针对虚拟资源收费下载的插件,经过完美测试运行于 wordpress 3.1.x-5.x 版本。模板兔已针对此插件开发了一个前端用户中心,基本适用于任何主题(不排除有的主题使用错位的可能)。本插件无域名限制。

由于辉哥需自用,所以进行了一些列简单的修改。

基本功能已经在程序中集成官方支付宝(PC电脑端支付即时到帐、唤醒APP支付:H5支付、当面付(个人可申请))接口、paypal、官方微信支付(PC扫码支付、唤醒APP支付:H5支付、公众号支付)、Paypy个人免签支付宝/微信即时到账接口、虎*椒支付接口(个人接口)、ma支付(个人接口)(郑重声明:对于接口的申请需用户自行申请)免登录收费下载资源、查看内容收费下载地址与免费下载地址共存,可同时提供免费下载与收费下载,支持不同价格的下载地址自定义购买下载框位置集成mycred积分插件,mycred积分兑换成erphpdown货币(另付费功能)充值卡充值(管理员后台生成充值卡卡号卡密,可以放在第三方自动发卡平台出售,然后购买用用卡密来进行网站充值)(另付费功能)设置用户提现手续费比率设置用户推广消费提成比率,支持三级分销设置货币昵称(例如:积分)设置充值比例(例如:1元=10积分),支持设置冲多少送多少查询所有消费记录查询所有充值记录查看与处理取现申请列表查看全部收益与推广推广用户消费获得提成(这对管理员没必要)用户充值与扣费查询用户余额、充值记录、消费记录发布收费下载资源(支持外链,可设置解压密码,通过email发送给购买用户)发布收费查看内容(支持全文内容收费查看以及部分内容收费查看)管理员、投稿者、订阅者权限分配(以上某些功能是管理员专有权限)前端短代码调用、前端用户个人中心下载路径加密(内链)每日签到送站内币申请提现VIP会员(一天、包月、包季、包年、永久)特权(VIP专享、年费VIP专享、终身VIP专享、VIP半价、VIP八折、VIP免费、年费VIP免费、终身VIP免费),专享与免费的区别在于免费的可以供普通用户单独购买,而专享仅供VIP下载一次购买,永久下载或可以设置过期时间重复购买弹窗特效以及Ajax无跳转购买前端个人中心、用户中心(可直接充值、查看消费等)更新记录新增自定义购买下载框位置(默认是显示在正文结尾),支持每篇文章可附加购买隐藏内容(使用短代码),后台仪表盘可显示今日与昨日的销售统计,修复移动端部分手机弹窗显示不全的bug (v10.3 2020.05.25)新增vip专属隐藏短代码,免费开放集成官方微信/支付宝唤醒APP支付接口(以前的版本需要另收费集成,需使用最新版赠送的前端个人中心) (v10.2 2020.05.14)新增三级分销功能,可单独设置资源的免费下载地址(免费与收费共存,使用场景例如:免费的下载地址限速,收费的下载地址不限速),每日签到送站内币(需重启插件、使用最新版赠送的前端个人中心),修复bug (v10.1 2020.04.28)

完整版更新日志:

使用说明

辉哥不说明其程序的使用说明,如需使用教程可以自己百度。

原版与辉哥美化版对比

原版购买资源

美化版购买资源

原版购买弹出框

美化版购买弹出框

原版资源已购

美化版资源已购

原版资源下载页

美化版资源下载页

原版短代码预览

美化版短代码预览

下载及原文链接:

心理学九招拆解:针对新用户注册的增长黑客

本文中提到的诸如游戏化、推荐拉新这种比较经典的增长操作,背后对应了了不止一个心理学概念,这解释了为什么经典的增长黑客方法常常在不同产品之间即插即用、无往不利。有些心理学应用,作者解释得很浅,所以又到了自我思考的时候——怎么更好地把这些招数应用到自己的产品中。

你有没有想过为什么用户还没注册就流失?

当然这可能有很多原因。但坦白说,你有没有想过在用户初次接触APP时,运用心理学概念留住他们?

心理学不仅仅能帮助市场活动创意或用户界面设计。无论制造商还是SaaS企业,心理学理应出现在公司中的任何部门。而运营者实施不同的心理学概念,会帮助产品获取且留存更多用户。

柏拉图曾经曰过:“人类行为的三个主要来源:欲望,情感和知识。” 三个来源都满足,才会驱动用户转化、采取行动。

来看一个虚拟案例:目标用户最大的痛点是“无法按时向所有客户发布所有的帖子”。你基于此,研发了一个社交媒体的排期工具。此时,用户的欲望是“发布和维护每个帖子,图文质量无损”; 情感是某种“得到缓解的感受”,它舒缓压力,让用户感到满足,因为用户有了更多时间做其他的事;而知识(诱发)是“惊喜时刻”(Aha Moment):当用户理解产品提供给他们的价值时,才会采取行动,开始使用产品。

市场和销售负责激发潜在用户,释放他们的欲望和情感,但最终,用户体验的目标是——触发他们的惊喜时刻。

这篇文章中,我们提到不同的心理学概念、行为、效果和成功案例,这些内容的目的均在于提供更多APP产品用户转化的价值,帮助产品创造出“惊喜时刻”。

第一招:蔡格尼克效应

心理学家蔡格尼克发现,相比完成了的任务,人们更会试图记住未完成或中断了的任务。这个后来被叫做蔡格尼克效应。

以文案或内容为例:如果一篇文章最开头的几段里已经把所有信息都交代了,你还会想读完全篇吗?如果文章开头挑逗一下读者,他们就想要继续读下去,做产品也是这个道理。

为释放惊喜时刻,大家可以试着过程中增加不同的任务或者进度条。这个策略不仅在SaaS工具或产品中被广泛应用,在线上游戏中也很常见。

未完成的任务条强迫用户继续接近惊喜时刻。在StoryChief的案例中,UI左边可以看见完美的蔡格尼克效应应用。

另一个案例是线上博客平台Ghost。Ghost团队发现,完成特定任务的用户,是普通用户订阅付费版几率的十倍。这个特定任务甚至不是“发布一篇博客”,仅仅是“更换一个博客主题”。

发现了这个有趣的数据后,他们做了一个“上手清单“,清单里包括添加主题,和一个如何添加主题的视频教程。最初那些没有添加主题的用户,会收到一封邮件,邮件里包括这个视频教程。结果是,7%的新用户因此添加了主题,其中26%的人看了视频教程。使用蔡格尼克效应,Ghost成功转化了一把用户。

第二招:同伴压力

同伴压力或社会压力鼓励人们跟随同伴,改变他们的态度、行为或价值观。

你想过每个社交媒体产品增长背后的秘密是什么吗?Facebook, Instagram, Twitter, LinkedIn 就是使用同伴压力的好案例。如果你的朋友圈里,十个有六个都在用一个工具去完成目标,你也很可能会开始使用。

一直以来增长黑客的著名案例——Dropbox推荐计划,鼓励人们邀请身边的朋友也来使用产品,这样用户可以获得更多云空间。这也可以算是蔡格尼克效应。采用两种心理学概念,Dropbox几个月内创造了3900%的用户增长。

推荐好友注册Dropbox可以得到最高的容量奖励

第三招:人为推进效应

曾经有一个实验很有意思:参与者收集全部十张邮票,可以得到一个免费三明治。但其中一组参与者在不用付出任何努力的前提下,会先得到两张邮票作为奖励。实验结果发现,提前得到奖励的那组参与者更有动力完成全部邮票收集。

这被称为“人为推进效应” —— 如果人们能获得一些标志性的奖赏,将更倾向于完成目标。

Kickstarter应用了“人为推进效应”:每个项目都有一个进度条显示众筹当下的状态。当人们发现某个项目马上就要筹满,就很可能在这个项目上投资一笔。

还有Paypal。当人们注册Paypal的时候,创建账户这一步会被自动点亮。成功完成Paypal的注册设置一共分为五步,创建账户这一步等于是免费送给用户的。

第四招:用户体验游戏化

人人都喜欢游戏。游戏化不仅让产品有趣,而且能帮助提升用户转化,帮助普通用户升级为尊贵会员。为用户注册树立标杆的公司当然是Duolingo。他们很好地运用了游戏化手段奖励用户。

用户完成每日目标后,Duolingo将奖励他们XP点数和成就徽章。用户不断得到点数和徽章,就能不断升级。

Foursquare也是把用户注册游戏化的一款产品,他们实现了1千万用户注册,2011年融资五千万美金,估值6亿美金。在Foursquare,签到被游戏化,比如去一个新地点就可以得到一定分数。

Foursquare用徽章增加游戏感

第五招:选择的悖论

美国心理学家巴里施瓦茨的书《选择的悖论》发现,选择更少的人买东西的意愿更高。根据施瓦茨的说法,通常人们买东西会经历以下6步:

搞清楚目标估算每个目标的重要性排列选项估算每个选项达到目标的可能性锁定选项修改目标

其中,第3步“排列选项”是做决定过程中最重要的。 选项越多,越不确定。如果选项少一点儿,人们做决定的时候会更自信。

Unbounce的Ryan Engley利用减少线上会议的选项,做了一个测试。在A/B测试了两个落地页后——第一个落地页有四个选项,第二个落地页有三个选项——他发现第二个落地页转化率高16.93%。

另一个实践“选择的悖论”的产品是HelloBar。HelloBar是WordPress的一个插件,用于提升转化率,把访客转化为顾客。HelloBar有很多功能,用户可以在里面选择目标,是提升流量,收集email,还是把访客带去社交媒体,或者个性化工具栏等等。

Hellobar因为功能太多,决定分流用户去不同的界面

让用户先选择目标,Hellobar减少了功能选项。这显著提升了Hellobar的用户转化率。

第六招:熟悉偏见

为了更好地解释这一点,我们以投资打一个比方:比如你要在两家公司中选择一家进行投资。第一家你熟悉,第二家你完全不了解。你会投资哪一家呢?很多人会选择第一个,因为熟悉。

这被叫做“熟悉偏见”。人们倾向选择或购买更熟悉的产品。

领英在用户注册中充分利用了熟悉偏见。当用户第一次注册或者添加新好友时,他们会提供你一个添加电邮联系人的选项。

而Pinterest——当用户创建账号的时候,Pinterest会基于你的兴趣,知识和熟悉领域提供给用户多个主题。

像上面领英的例子,减少用户寻找好友的时间,也更快地触发了用户的“惊喜时刻”。

第七招:峰终定律

诺贝尔奖得主、心理学家丹尼尔卡尼曼和他的同事发现,对体验的记忆由两个因素决定:

情绪峰值时(最好或最坏)的感受最后时刻的感受

这被叫做峰终定律。

我们通过一个例子来解释它:你的家人为欢迎新邻居准备了一顿晚餐。如果邻居带着微笑离开,他们可能会将这顿晚餐视为一次愉快的经验。如果他们是带着愤怒或无趣离开的,很大几率上他们会避免再来你们家。

峰终定律在游戏中应用得很多。

英雄联盟是世界上最受欢迎的游戏之一(我也是它的粉丝)。它利用不同的事件指示出游戏中的峰值,比如:

First blood, Double Kill, Triple Kill, Quadra kill, Penta kill(一杀,二连杀..)

Killing spree, Rampage, Unstoppable, Godlike, Legendary(疯狂杀戮、像神一样、传奇…)

An enemy has been slained(敌人被杀)

这些事件反映了游戏中的阶段,它们激励你推进比赛并且取得胜利。

在SaaS行业,MailChimp著名的 “High five” 图示就做得挺好的。

用户在MailChimp上完成一项操作,会得到跳动的HighFive动画手势

甚至这条推特也验证了峰终定律在用户注册中的有效性。

High Five图示将激励用户完成下一步的电邮营销。

快速生成销售企划的线上工具Proposify在用户注册中也使用了峰终定律。

在教学demo中,用户可以创建一个企划的demo版本。一步步地,当用户完成创建并且注册后,系统会提醒用户去查收一封电邮。当用户照做了,同时也接受了Proposify向他们推广邮件。就像他们说的,这封电邮就是用户注册过程中的“圣杯”。当用户打开电邮,就已经完成了全部注册流程。

有很多用户注册运用峰终定律的例子,你应该见过不少类似“祝贺你,完成了第一个/次XXX”或者“祝贺你有了100个订阅者”这样的弹窗。

第八招:社交促进

社交促进或受众效应的心理概念,基于一种假设,假设人们在和团队一起工作时将表现得更好。

1897年,Tripplet测试出自行车手独自骑行和对抗骑行的表现——独自骑行和竞赛骑行比,速度更慢。在和他人一同工作时,我们总想证明自己能更好地完成任务。

社交媒体把受众效应作为核心心理学概念。社交网络迫使人们去交谈、共同完成任务,同时改进自己在任务中的表现。

团队协作与聊天平台Slack,在其著名的Slack机器人产品中,也利用了社交促进概念。虽然Slack机器人不是真人,它却能帮助用户更快地设置账户和频道。通过一种有趣和互动的方式,Slack有效地提升了拉新。

第九招:歧义效应

歧义效应是一种认知偏差。在缺少信息的情况下,决策通常会被干扰,这意味着人们往往会选择那个收益更高的选项。

歧义效应自人类出现起,便一直存在。那时候人们要在黑果子和红果子之间做个选择,在不知道哪个更加有毒的前提下,他们也至少会选相对了解的那个。

歧义效应影响人们每天的日常生活。如果你想在用户注册这一步用上,谨记:

注册步骤越清楚越好引流到外部的导航按钮越少越好

项目管理的线上软件ProdPad, 很好地在用户注册流程上应用了这一招。

看,每一个步骤下面都配上了简短又引人注意的信息说明,让新用户更快地了解产品,而且ProdPad一开始就直白地向用户解释,为什么需要用户填写一定的个人资料,这对建立产品和用户之间的信任很有帮助。

总结

如果你想引导用户使用一款新产品,最重要的就是在用户注册流程中释放惊喜时刻并且触发用户试用,这样,新用户才有可能转化为忠诚用户或者付费用户。“惊喜时刻”可能因为各种各样的原因而产生,而心理学现象或原理能对其中的一些原因作出解释。

无论你应用的是哪一招,记住最重要的——用户旅程越简单高效越好,这将让你的用户转化受益无穷。

作者:Aazar Ali Shad,Userpilot增长VP,5年SaaS经验,现在帮助200多个SaaS公司优化用户注册,提升产品认受度。

翻译:增长黑客炼成记

本文由 @增长黑客炼成记 翻译发布于人人都是产品经理。未经许可,禁止转载

题图来自Unsplash,基于CC0协议

B站每日自动签到&传统单节点网站的 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 jsonimport timeimport reimport sysimport codecsfrom bs4 import BeautifulSoupfrom json.decoder import JSONDecodeError# B站登陆Cookiecookie = ""# Webhook地址webhook = "?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转为avdef 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('', {'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 -1 else: return response# 自定义钉钉机器人推送def pushinfo(info,specific):# 定义推送内容,格式参考# 注意机器人的关键词 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('',headers=headers) rejson = json.loads(response.text) code = rejson['code'] msg = rejson['message'] if code == 0: print('登录成功') return True else: print('登录失败:'+msg) return False# 获取用户信息def get_user_info(): headers = { 'Cookie':cookie } response = requests.session().get('?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 userInfo else: print("用户信息获取失败:"+msg) return "用户信息获取失败:"+msg# 直播签到,赚银瓜子儿def do_sign(): headers = { 'Cookie':cookie } response = requests.session().get('',headers=headers) rejson = json.loads(response.text) code = rejson['code'] msg = rejson['message'] if code == 0: print('直播签到成功!') return True else: print("直播签到失败:"+msg) return False# 看BV号视频,得观看经验def watch(): aid=bv_to_av(bid) headers = { 'Cookie':cookie } response = requests.session().get('?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('',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('',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 Falsedef 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关键配置,根据自己的业务情况修改,注意配置中端口监听需要与函数创建监听端口保持一致,同时网页代码的路径设置为/code

http { 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 后端函数访问地址.run; #Nginx反代传给后端的函数,地址在后续后端函数创建完可以拷贝 } location /items { proxy_pass 后端函数访问地址.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文件,参考:

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

点击前往授权,跳转到gitee的站点进行OAuth授权请求,点击同意授权

阿里用户在第一次使用FC函数计算时,需要对角色策略进行添加的,我这里已经使用过FC了,若提示需要添加策略,按照提示点击添加即可。

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

完成配置后点击创建,代码已经新建上传到我的Gitee仓库了。这里提供的s.yaml可以作为配置的参考,后续根据所部署的业务去修改yaml

3.应用部署上线

应用创建完成,首次自动进行部署,这里部署状态可以看到正在部署

查看部署日志,如果部署出现错误也可以从日志信息中查询报错。

部署经历了前置环境、资源同步、资源检查、执行部署这四个步骤后,我们的电商应用就完成了部署

首次部署完成,也是最新latest的一次部署版本,可以通过部署历史自由的进行回滚

4.访问部署上线的电商应用

访问测试的域名,就可以看到我们上线的litemall电商系统,进入电商应用的后台管理

litemall电商系统是一个开源的前后端分离带微信小程序的电商系统,具有电商平台基础的会员管理、商城管理、商品管理、推广管理、系统管理、配置管理、统计报表。

litemall电商系统,需要配置最小开发环境有以下:

MySQL

JDK1.8或以上

Maven

Nodejs

5.更换业务域名访问

同样,当我们正常上线了FC的业务时,Serverless用的是默认访问地址

函数计算上线提供的域名是以..[action?queries]为默认的,若是正常业务访问我们必然要修改访问的域名。

进入到函数计算FC的首页,点击高级功能下的域名管理,这里可以看到我们上线电商应用时的默认域名已经路由信息

我们选择添加自定义域名

输入域名的名称,也就是购买备案的域名下的自定义二级域名

点击路由配置,选择服务名称,这里是我们部署的电商系统litemall,选择函数名称与版本

拷贝公网CNAME地址,后续在DNS域名管理处添加解析

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

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

最后,拿手机访问我自定义配置的公网地址

电商服务正常上线,公网地址正常访问主页

商品的详情购买页面

最后

Serverless相对其他方案来说,也是非常容易上手并高效的技术方案。上面的部署测试,其实还有很多需要改进的地方,例如第二个农产品电商上云项目,真正可靠的云上业务还需要负载均衡、高可用多地容灾、安全等其他云产品的引入,我想把案例的重点放在Serverless服务器无感化上,本人也使用过不少阿里云的技术产品,深知对底层基础设施运维难度。

虽然这几个月学习生活比较繁忙,但是还是对社区的各种活动非常感兴趣,也想做一些更好的测试。这次的Serverless无论是对个人用户,还是企业用户。都是一种非常不错的选择,弹性资源与按需付费,更加节省资源与Money,更加优雅!

原文链接:

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