手动配置版:构建高可用的支付宝小程序服务
教程简介
本教程提供在阿里云云服务器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个月
|
传统型负载均衡CLB |
每月750个小时 15LCU(免费:每月750小时实例使用时间,每月15个LCU,时长3个月)
|
共享流量包 |
10GB 1个月(用于抵扣CLB公网流量费) |
二、创建角色并绑定到ECS实例
创建好实例后,您需要创建角色关联到ECS实例,用于后端服务调用SDK。
在实例内部基于STS(Security Token Service)临时凭证访问云产品的API,临时凭证将周期性更新。即可以保证云账号AccessKey安全,还可以借助访问控制RAM实现精细化控制和权限管理。
1.创建实例RAM角色。
- 使用阿里云账号登录RAM控制台。
- 在左侧导航栏,选择身份管理 > 角色。
- 在角色页面,单击创建角色。
- 在创建角色面板,选择可信实体类型选择为阿里云服务,然后单击下一步。
阿里云服务用于授权ECS实例访问或管理您的云资源。RAM角色选择阿里云服务类型后,支持授予给ECS实例。网络异常,图片无法展示|
- 选择角色类型为普通服务角色。
- 输入角色名称和备注。
- 选择受信服务为云服务器。
- 单击完成。
- 单击关闭。
2.创建自定义策略。在下面为RAM校色授予权限时,选择这里创建的策略。
- 使用阿里云账号登录RAM控制台。
- 在左侧导航栏,选择权限管理>权限策略。
- 在权限策略页面,单击创建权限策略。
- 在创建权限策略页面,单击脚本编辑页签。
- 输入权限策略内容,然后单击继续编辑基本信息。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "ecs:DescribeInstances", "ecs:DescribeInstanceStatus" ], "Resource": "*" } ] }
- 输入权限策略名称:EcsRamRolePolicyTest 和备注。
- 单击确定。
3.为RAM角色授予权限。
- 使用阿里云账号登录RAM控制台。
- 在左侧导航栏,选择身份管理 > 角色。
- 在角色页面,单击目标RAM角色操作列的精确授权。
- 在添加权限面板,选择权限策略类型为自定义策略,然后输入刚刚创建的权限策略名称。
- 单击确定。
- 单击关闭。
4.为实例授予RAM角色。
- 登录ECS管理控制台。
- 在左侧导航栏,选择实例与镜像 > 实例。
-
在顶部菜单栏左上角处,选择创建ECS的地域,本教程是是华北2(北京)。
- 找到要操作的ECS实例,选择实例设置授予/收回RAM角色。网络异常,图片无法展示|
- 在弹窗中,选择创建好的实例RAM角色,单击确定完成授予。
三、登录云服务器
开通免费试用ECS服务器后,系统会创建一个ECS实例(对应一台云服务器),使用ECS实例部署应用或搭建环境前,需设置实例密码后才能登录实例。
1.登录ECS控制台,在左侧导航栏,选择实例与镜像 > 实例。
2.在顶部菜单栏左上角处,选择和试用实例相同的地域。
3.设置该实例登录密码。在操作列单击
实例创建完成大约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
键进入编辑模式。
推荐阅读