手动配置版:搭建高可用的支付宝小程序服务

简介: 本教程提供在阿里云云服务器ECS上基于CentOS 7.9 64位操作系统搭建高可用的小程序服务端的指引。同时指导您在本地开发一个简单的支付宝小程序——ECS小助手,通过远程调用部署在ECS上的服务端,实现在小程序中输入框输入ECS实例ID查询实例详细信息的功能。

教程简介

本教程提供在阿里云云服务器ECS上基于CentOS 7.9 64位操作系统搭建高可用的小程序服务端的指引。同时指导您在本地开发一个简单的支付宝小程序——ECS小助手,通过远程调用部署在ECS上的服务端,实现在小程序中输入框输入ECS实例ID查询实例详细信息的功能。

小程序界面的示意图如下:

我能学到什么

  • 熟悉远程登录CentOS操作系统的ECS实例。
  • 学会在ECS实例中部署一个高可用的Python服务。
  • 开发支付宝小程序页面,并与服务端进行数据交互。

一、准备环境和资源

准备资源

部署高可用的小程序服务需要2个ECS实例(CentOS 7.9 64位)、1个CLB实例。

领取免费试用权益

进入以下资源领取入口,单击页面右上方的登录/注册按钮,并根据页面提示完成账号登录(已有阿里云账号)、账号注册(尚无阿里云账号)或实名认证(根据试用产品要求完成个人实名认证或企业实名认证)。

如果您已有相应资源,可以跳过该步骤直接使用。如果您是产品新用户,可按下列步骤领取免费试用权益

资源领取入口

本教程配置

云服务器ECS

1核2GB 3个月

  • 地域:华北2(北京)
  • 操作系统:CentOS 7.9 64位
  • 试用数量:2(ECS01、ECS02)
  • 其他参数:保持默认值或按需选择

传统型负载均衡CLB

每月750个小时 15LCU(免费:每月750小时实例使用时间,每月15个LCU,时长3个月)

  • 地域与可用区:选择与ECS实例相同的地域,本教程选择华北2(北京)
  • 实例计费方式:按使用量计费
  • 实例类型:公网
  • IP 版本:IPv4
  • 试用数量:1

共享流量包

10GB 1个月(用于抵扣CLB公网流量费)

二、创建角色并绑定到ECS实例

创建好实例后,您需要创建角色关联到ECS实例,用于后端服务调用SDK。

在实例内部基于STS(Security Token Service)临时凭证访问云产品的API,临时凭证将周期性更新。即可以保证云账号AccessKey安全,还可以借助访问控制RAM实现精细化控制和权限管理。

1.创建实例RAM角色。

  1. 使用阿里云账号登录RAM控制台
  2. 在左侧导航栏,选择身份管理 > 角色
  3. 角色页面,单击创建角色
  4. 创建角色面板,选择可信实体类型选择为阿里云服务,然后单击下一步
    阿里云服务用于授权ECS实例访问或管理您的云资源。RAM角色选择阿里云服务类型后,支持授予给ECS实例。

  5. 选择角色类型为普通服务角色
  6. 输入角色名称备注
  7. 选择受信服务为云服务器
  8. 单击完成
  9. 单击关闭

2.创建自定义策略。在下面为RAM校色授予权限时,选择这里创建的策略。

  1. 使用阿里云账号登录RAM控制台
  2. 在左侧导航栏,选择权限管理>权限策略
  3. 权限策略页面,单击创建权限策略
  4. 创建权限策略页面,单击脚本编辑页签。
  5. 输入权限策略内容,然后单击继续编辑基本信息
{
    "Version": "1",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecs:DescribeInstances",
                "ecs:DescribeInstanceStatus"
            ],
            "Resource": "*"
        }
    ]
}
  1. 输入权限策略名称:EcsRamRolePolicyTest 和备注
  2. 单击确定

3.为RAM角色授予权限。

  1. 使用阿里云账号登录RAM控制台
  2. 在左侧导航栏,选择身份管理 > 角色
  3. 角色页面,单击目标RAM角色操作列的精确授权
  4. 添加权限面板,选择权限策略类型为自定义策略,然后输入刚刚创建的权限策略名称。
  5. 单击确定
  6. 单击关闭

4.为实例授予RAM角色。

  1. 登录ECS管理控制台
  2. 在左侧导航栏,选择实例与镜像 > 实例
  3. 在顶部菜单栏左上角处,选择创建ECS的地域,本教程是是华北2(北京)
  4. 找到要操作的ECS实例,选择实例设置授予/收回RAM角色
  5. 在弹窗中,选择创建好的实例RAM角色,单击确定完成授予。

三、登录云服务器

开通免费试用ECS服务器后,系统会创建一个ECS实例(对应一台云服务器),使用ECS实例部署应用或搭建环境前,需设置实例密码后才能登录实例。

1.登录ECS控制台,在左侧导航栏,选择实例与镜像 > 实例

2.在顶部菜单栏左上角处,选择和试用实例相同的地域。

3.设置该实例登录密码。在操作列单击 > 实例属性 > 重置实例密码,按照界面提示设置ECS实例的登录密码。保存密码后,在弹出的页面,单击立即重启使密码生效。
   实例创建完成大约3~5分钟后,才支持重置实例密码,如不可重置请耐心等待后重试。

4.单击试用实例的ID,选择安全组页签,单击安全组操作列的配置规则,在入方向添加需要放行的端口。本教程中,在安全组入方向放行SSH默认22端口和Apache默认80端口。

5.远程连接ECS实例。
   a. 返回实例页面,单击该实例对应操作列下的远程连接
   b. 在弹出的连接与命令对话框中,单击通过Workbench远程连接对应的立即登录。
   c. 在弹出的登录实例对话框中,输入登录信息。

6.重复执行以上操作,登录ECS02实例。

四、安装Nginx服务

1.执行命令安装Nginx。

yum update && yum -y install nginx

2.启动Nginx。

systemctl start nginx

3.测试Nginx。在浏览器地址栏输入http://,ECS服务器的弹性公网IP可以从ECS实例页面获取,出现Welcome to CentOS表示Nginx已安装成功。

4.重复执行以上操作,在ECS02实例中安装Nginx服务。

五、开发后端服务

1.创建服务目录

mkdir /data && cd /data

2.创建并编辑Python服务依赖文件。

vim requirements.txt

3.进入Vim编辑器后,按i键进入编辑模式,粘贴以下内容。

aliyun_python_sdk_core==2.13.36
aliyun_python_sdk_ecs==4.24.62
Flask==2.0.3

4.粘贴后,按Esc键,输入:x保存并退出编辑。

5.执行如下命令安装依赖。

pip3 install --upgrade pip && pip3 install -r requirements.txt

6.创建并编辑Python服务代码文件。

vim get_server_info.py

7.进入Vim编辑器后,按i键进入编辑模式,粘贴以下内容。
❔说明
代码中metaUrl中EcsRamRoleTest需要和前面创建的角色名称保持一致。
代码中region需要与您真实创建实例地域保持一致。

# -*- coding: utf-8 -*-
from flask import Flask, jsonify, request
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.auth import credentials
import requests
import json
from aliyunsdkecs.request.v20140526 import DescribeInstancesRequest, DescribeInstanceStatusRequest
app = Flask(__name__)
metaUrl = 'http://100.100.100.200/latest/meta-data/ram/security-credentials/EcsRamRoleTest'
region = 'cn-beijing'
# 获取临时身份凭证
def getStsToken():
  tokenResponse = requests.get(metaUrl)
  return tokenResponse.json()
# 用于健康检查
@app.route('/', methods=['HEAD', 'GET'])
def index():
  return "ok"
# 在app.route装饰器中声明响应的URL和请求方法
@app.route('/ecs/getServerInfo', methods=['GET'])
def getServerInfo():
    tokenResult = getStsToken()
    accessKeyId = tokenResult['AccessKeyId']
    accessSecret = tokenResult['AccessKeySecret']
    securityToken = tokenResult['SecurityToken']
    credential = credentials.StsTokenCredential(accessKeyId, accessSecret, securityToken)
    client = AcsClient(credential=credential, region_id=region)
    # GET方式获取请求参数
    instanceId = request.args.get("instanceId")
    if instanceId is None:    
        return "Invalid Parameter"
    # 查询实例信息
    describeInstancesRequest = DescribeInstancesRequest.DescribeInstancesRequest()
    describeInstancesRequest.set_InstanceIds([instanceId])
    describeInstancesResponse = client.do_action_with_exception(describeInstancesRequest)
    # 返回数据为bytes类型,需要将bytes类型转换为str然后反序列化为json对象
    describeInstancesResponse = json.loads(str(describeInstancesResponse, 'utf-8'))
    print(describeInstancesResponse)
    if len(describeInstancesResponse['Instances']['Instance']) == 0:
        return jsonify({})
    instanceInfo = describeInstancesResponse['Instances']['Instance'][0]
    # 查询实例状态
    describeInstanceStatusRequest = DescribeInstanceStatusRequest.DescribeInstanceStatusRequest()
    describeInstanceStatusRequest.set_InstanceIds([instanceId])
    describeInstanceStatusResponse = client.do_action_with_exception(describeInstanceStatusRequest)
    describeInstanceStatusResponse = json.loads(str(describeInstanceStatusResponse, 'utf-8'))
    instanceStatus = describeInstanceStatusResponse['InstanceStatuses']['InstanceStatus'][0]['Status']
    # 封装结果
    result = {
        # cpu数
        'Cpu': instanceInfo['Cpu'],
        # 内存大小
        'Memory': instanceInfo['Memory'],
        # 操作系统名称
        'OSName': instanceInfo['OSName'],
        # 实例规格
        'InstanceType': instanceInfo['InstanceType'],
        # 实例公网IP地址
        'IpAddress': instanceInfo['PublicIpAddress']['IpAddress'][0],
        # 公网出带宽最大值
        'InternetMaxBandwidthOut': instanceInfo['InternetMaxBandwidthOut'],
        # 实例状态
        'instanceStatus': instanceStatus
    }
    return jsonify(result)
if __name__ == "__main__":
    app.run()

8.粘贴后,按Esc键,输入:x保存并退出编辑。

9.重复执行以上操作,在ECS02实例中开发后端服务。

六、安装uWSGI Server

写完服务端代码后,您需要安装并使用uWSGI来启动Flask服务。

1.执行命令安装uWSGI。

pip3 install uwsgi

2.新建uwsgi配置文件。

cd /data &&vim uwsgi.ini

3.进入Vim编辑器后,按i键进入编辑模式。

[uwsgi]
#uwsgi启动时所使用的地址和端口
socket=127.0.0.1:5000
#指向网站目录
chdir=/data
#python启动程序文件
wsgi-file=get_server_info.py
#python程序内用以启动的application变量名
callable=app
#处理器数
processes=1
#线程数
threads=2
#状态检测地址
stats=127.0.0.1:9191
#保存启动之后主进程的pid
pidfile=uwsgi.pid
#设置uwsgi后台运行,uwsgi.log保存日志信息 自动生成
daemonize=uwsgi.log

4.粘贴后,按Esc键,输入:x保存并退出编辑。

5.运行uwsgi server。

uwsgi uwsgi.ini

6.执行以下命令查看uwsgi服务启动情况,看到如下图效果是服务启动成。

ps aux | grep uwsgi

7.重复执行以上操作,在ECS02实例中安装uWSGI Server。

七、配置Nginx并重启

启动好后端服务后,我们需要添加Nginx配置来代理后端服务。

1.创建配置文件。

vim /etc/nginx/conf.d/app.conf

2.进入Vim编辑器后,按i键进入编辑模式。

server {
    listen 80 default_server;
    server_name app.example.com;
    root /var/www/html;
    # Add index.php to the list if you are using PHP
    index index.html index.htm index.nginx-debian.html;
    location / {
        # 转发端口
        uwsgi_pass  127.0.0.1:5000;
        include uwsgi_params;
    }
}

3.粘贴后,按Esc键,输入:x保存并退出编辑。

4.重启Nginx。

nginx -s reload

5.验证配置是否成功。
❔说明
如果未运行成功,可以在/data/uwsgi.log日志文件查看原因。

curl http://127.0.0.1/ecs/getServerInfo

命令执行结果是Invalid Parameter表示服务配置成功。

6.重复执行以上操作,在ECS02实例中配置Nginx并重启。

八、配置监听

负载均衡实例监听负责检查连接请求,然后根据调度算法定义的转发策略将请求流量分发至后端服务器。

1.登录传统型负载均衡CLB控制台

2.在实例管理页面,单击已创建的CLB实例ID。

3.在监听页签单击添加监听

4.在协议&监听配置向导,完成以下主要参数的配置,其余参数保持默认配置,然后单击下一步

监听配置

说明

示例值

选择负载均衡协议

选择监听的协议类型。

HTTP

监听端口

设置前端协议端口,即用来接收请求并向后端服务器进行请求转发的监听端口。

监听端口范围:1~65535。

80

监听名称

自定义监听的名称。

HTTP_80

5.在后端服务器配置向导,选择默认服务器组,可以看到已添加的ECS01和ECS02,如果没默认添加点击继续添加,选择刚刚创建的ECS01和ECS02实例。

6.输入ECS01和ECS02的端口,本教程都设置为80,然后单击下一步

7.在健康检查配置向导,保持默认配置,单击下一步,然后单击提交。等待配置成功后,单击知道了

九、注册支付宝小程序

开发支付宝小程序前需要您入驻支付宝开放平台,具体操作请参见开发者入驻

1.进入支付宝开放平台注册页根据指引填写信息和提交相应的资料,完成账号申请。

2.在支付宝开放平台上创建小程序应用,具体操作请参见创建小程序

❔说明

您可以通过此账号关联本地开发项目和小程序,上传您的小程序项目到支付宝开放平台。

十、安装小程序开发环境并创建项目

启动好后端服务后,我们接下来要开发开发小程序。先安装小程序开发环境。

1.安装Node.js开发环境,请到Node.js页面下载并安装Node.js环境。

2.下载并安装支付宝小程序开发者工具。详细信息请参见下载说明

3.打开小程序开发者工具。

4.单击加号创建支付宝小程序空白项目。

5.按照流程,选择支付宝,模板选择空白模板,填入如下项目信息后,单击完成

  • 项目名称:例如ECSAssistant。
  • 项目路径:例如/Users/demo/ECSAssistant。
  • 框架语言:原生小程序。

十一、开发小程序

安装好开发环境后,我们来编写小程序代码。

1.生成的的小程序示例项目结构如下。可以看到小程序的项目结构中有三个前缀为app的文件,它们定义了小程序的一些全局配置。

  • app.json 应用配置。用于配置小程序的页面列表、默认窗口标题、导航栏背景色等。
  • app.acss 应用样式。定义了全局样式,作用于当前小程序的所有页面。
  • app.js 应用逻辑。可用于注册小程序应用,可配置小程序的生命周期,声明全局数据,调用丰富的 API。
  1. 小程序所有的页面文件都在pages/路径下,页面文件有四种文件类型,分别是.js、.axml、.acss和.json后缀的文件。相比全局配置文件,页面配置文件只对当前页面生效。其中.axml文件定义了当前页面的页面结构。
    此外,小程序中的所有页面都需要在app.json文件中声明。
    更多配置请参见小程序全局配置介绍
ECSAssistant
├── app.acss
├── app.js
├── app.json
└── pages
    └── index
        ├── index.axml
        ├── index.js
        └── index.json

2.编辑app.json文件,将小程序页面Title修改为ECS小助手,修改后的app.json文件内容如下。

{
  "pages": [
    "pages/index/index"
  ],
  "window": {
    "defaultTitle": "ECS小助手"
  }
}

3.在pages/index目录下,编辑index.axml文件,定义index页面的页面结构,修改后的index.axml文件内容如下。
❔说明
AXML中标签写法和HTML类似,并且支持使用变量表达式进行模板渲染,更多请参见AXML 介绍。支付宝小程序内置了丰富的UI组件,更多请参见基础组件概览

<view class='container'>
  <input placeholder='请输入你的ECS实例ID' class='search-input' value='{{ inputValue }}' onBlur='bindblur'></input>
  <view class='resultView' hidden='{{ showView }}'>
    <text class='result'>CPU数:{{queryResult.Cpu}} 核</text>
    <text class='result'>内存大小:{{queryResult.Memory}} MB</text>
    <text class='result'>操作系统:{{queryResult.OSName}}</text>
    <text class='result'>实例规格:{{queryResult.InstanceType}}</text>
    <text class='result'>公网IP地址:{{queryResult.IpAddress}}</text>
    <text class='result'>网络带宽:{{queryResult.InternetMaxBandwidthOut}} MB/s</text>
    <text class='result'>在线状态:{{queryResult.instanceStatus == 'Running' ? '运行中':'已关机'}}</text>
  </view>
</view>

4.在pages/index目录下,新建index.acss文件,定义index的页面样式,将index.acss文件内容替换为右侧代码。

.container {
    height: 100%;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: space-between;
    padding: 200rpx 0;
    box-sizing: border-box;
}
.search-input {
    position: relative;
    margin-bottom: 50rpx;
    padding-left: 80rpx;
    line-height: 70rpx;
    height: 80rpx;
    box-sizing: border-box;
    border: 2px solid #ff8f0e;
    border-radius: 100rpx;
    overflow: hidden;
    text-overflow: ellipsis;
    transition: border 0.2s;
}
.resultView {
    margin-top: 70rpx;
}
.result {
    position: relative;
    left: 30rpx;
    display: list-item;
    font-size: small;
}

5.在pages/index目录下,编辑index.js文件,定义搜索框的失去焦点事件,修改后的index.js文件内容如下。
❔说明
支付宝提供了丰富的前端API和服务端API,您可以基于这些API来实现您的小程序功能,更多请参见小程序 API 使用说明
代码中替换为您创建的CLB实例的公网IP地址。

Page({
    data: {
        queryResult: null,
        showView: "false"
    },
    bindblur: function(e) {
        let that = this;
        my.httpRequest({
            url: "http://<CLB_PUBLIC_IP>/ecs/getServerInfo",
            method: "GET",
            data: {
                instanceId: e.detail.value
            },
            success(res) {
                if (res.status == 200) {
                    that.setData({
                        queryResult: res.data,
                        showView: !that.data.showView
                    });
                } else {
                    that.setData({
                        showView: "false"
                    });
                    my.showToast({
                        content: "请输入你的ECS实例ID",
                        type: 'fail',
                        duration: 3000,
                    });
                }
            }
        });
    }
});

6.保存后,编辑器会自动刷新,看到如下界面,表示小程序运行成功了。

十二、完成

完成以上操作后,您已经成功部署了服务端程序,并且在本地开发好了小程序。

您可以登录ECS控制台,复制刚刚创建的ECS实例ID,输入到小程序输入框中,就可以看到结果了。

您可以通过停机一台ECS模拟故障进而验证服务的可用性。操作如下:

1.登录ECS控制台,找到目标实例,在操作列单击,在面板单击停止

2.等ECS状态为已停止后,再次在小程序中查询ECS实例ID,看到返回正常内容,则表明服务可用。

十三、清理及后续

清理

1.ECS提供的试用实例有按量付费实例和包年包月实例。请在阿里云免费试用确认您试用的实例类型,并参考以下规则清理:

  • 如果无需继续使用实例,可以登录ECS控制台,找到目标实例,在操作列单击,搜索并单击释放设置,根据界面提示释放实例。
  • 如果需要继续使用实例,请至少在试用到期1小时前为阿里云账号充值,确保账户金额不小于100.00元人民币。到期未续费的实例会因欠费而被自动停机,停机15天内实例将保留,15天后实例和数据都将被自动释放。
  • 包年包月实例到期会自动释放,释放实例的同时释放数据。
  • 如果需要继续使用实例,请在试用到期前及时续费。到期未续费的实例会因欠费而被自动停机,停机15天内实例将保留,15天后实例和数据都将被自动释放。

2.CLB免费试用权益有期限限制,权益到期后未释放的CLB实例可能产生费用。完成教程后,请参考以下场景处理CLB实例:

  • 如果无需使用CLB实例,您可以登录传统型负载均衡CLB控制台在左侧导航栏,选择传统型负载均衡CLB(原SLB)>实例管理,在实例管理页面,找到目标CLB实例,在操作列单击>释放设置,按照界面提示手动释放实例。
  • 如果需继续使用CLB实例,请至少在试用到期1小时前为您的阿里云账号充值,确保账户金额不小于100.00元人民币。到期未续费的CLB实例会因欠费而被自动停机,停机7天内CLB实例将保留,7天后CLB实例和数据都将被自动释放。

后续

如果您期望上线您的小程序,您需要做下面几件事:

1.申请域名,可以参考域名注册基本流程如何注册阿里云域名

2.申请SSL证书,并配置到服务器上,可以参考申请免费DV单域名试用证书

3.上传小程序并提交审核,可以参考小程序发布上线

待审核通过后,手动上线小程序,就可以在支付宝客户端中查看和使用小程序了。

十四、延伸阅读

相关文章
|
5月前
|
小程序 Java 关系型数据库
基于Java微信小程序同城家政服务系统设计和实现(源码+LW+调试文档+讲解等)
基于Java微信小程序同城家政服务系统设计和实现(源码+LW+调试文档+讲解等)
|
2月前
|
小程序 前端开发 中间件
ThinkPHP 配置跨域请求,使用TP的内置跨域类配置,小程序和web网页跨域请求的区别及格式说明
本文介绍了如何在ThinkPHP框架中配置跨域请求,使用了TP内置的跨域类`\think\middleware\AllowCrossDomain::class`。文章还讨论了小程序和web网页在跨域请求格式上的区别,并提供了解决方案,包括修改跨域中间件源码以支持`Origin`和`token`。此外,还介绍了微信小程序跨域请求的示例和web网页前端发送Axios跨域请求的请求拦截器配置。
ThinkPHP 配置跨域请求,使用TP的内置跨域类配置,小程序和web网页跨域请求的区别及格式说明
|
1月前
|
XML 小程序 JavaScript
小程序入门之项目配置说明和数据绑定
小程序入门之项目配置说明和数据绑定
40 1
|
26天前
|
小程序 安全 数据库连接
为什么已经提交的小程序无法连接后台服务?
【10月更文挑战第17天】为什么已经提交的小程序无法连接后台服务?
44 0
|
3月前
|
存储 小程序 数据可视化
小程序开发问题之使用小程序云服务开发个人相册小程序如何解决
小程序开发问题之使用小程序云服务开发个人相册小程序如何解决
|
3月前
|
小程序 JavaScript Java
微信小程序+SpringBoot接入后台服务,接口数据来自后端
这篇文章介绍了如何将微信小程序与SpringBoot后端服务进行数据交互,包括后端接口的编写、小程序获取接口数据的方法,以及数据在小程序中的展示。同时,还涉及到了使用Vue搭建后台管理系统,方便数据的查看和管理。
微信小程序+SpringBoot接入后台服务,接口数据来自后端
|
4月前
|
运维 小程序 前端开发
好的商业模式-----小程序定制资料,加一张好看的海报,在推广中就可以找到用户中了,云服务部署收5000,部署是一种服务,定制化,游戏开发创者,仲裁劳务会剪视频好,提供服务,想增加一些新功能收费,会说
好的商业模式-----小程序定制资料,加一张好看的海报,在推广中就可以找到用户中了,云服务部署收5000,部署是一种服务,定制化,游戏开发创者,仲裁劳务会剪视频好,提供服务,想增加一些新功能收费,会说
|
4月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp小程序的智慧医疗服务平台附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp小程序的智慧医疗服务平台附带文章源码部署视频讲解等
50 0
|
4月前
|
存储 小程序 数据库
拉货搬家服务小程序如何开发?拉货搬家服务小程序制作流程
随着现代社会的发展,拉货搬家已经成为人们生活中不可避免的一部分。然而,繁琐的拉货搬家过程往往会让人感到沮丧和压力。为了解决这个问题,开发一款拉货搬家服务小程序就显得尤为重要。这个小程序可以帮助用户轻松下单拉货搬家服务,让拉货搬家更加便捷高效。
|
4月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的智能推荐的校园社区服务微信小程序附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的智能推荐的校园社区服务微信小程序附带文章源码部署视频讲解等
53 0