欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

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

最编程 2024-03-06 07:54:49
...

教程简介

本教程提供在阿里云云服务器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键进入编辑模式。

上一篇: 针对 OpenStack 的 Glance 服务部署和测试入门实践 (9)

下一篇: docker 快速实战指南