搭建高可用的微信小程序服务(Alibaba Cloud Linux 3)

news2024/11/29 4:48:22

 本文介绍如何在阿里云云服务器ECS上基于Alibaba Cloud Linux 3操作系统搭建高可用的微信小程序服务端,并在本地开发一个名为ECS小助手的简单微信小程序。通过远程调用部署在ECS上的服务端,实现在小程序中输入框输入ECS实例ID查询实例详细信息的功能。

步骤一:准备环境和资源
部署高可用的小程序服务需要2台ECS实例(Alibaba Cloud Linux3.2104 LTS 64位)、1台CLB实例。具体操作,请参见ECS实例创建方式介绍和创建和管理CLB实例。

本教程配置:

云服务器ECS

地域:华北2(北京)

操作系统:Alibaba Cloud Linux3.2104 LTS 64位

实例规格配置:1核2 GB

实例数量:2(ECS01、ECS02)

其他参数:保持默认值或按需选择

传统型负载均衡CLB

地域与可用区:选择与ECS实例相同的地域,本教程选择华北2(北京)

实例规格配置:按需创建

实例计费方式:按使用量计费

实例类型:公网

实例数量:1

IP 版本:IPv4

步骤二:配置资源并搭建服务
一键配置
准备好资源后,您可以通过一键配置快速完成资源配置或应用搭建。一键配置基于阿里云资源编排服务ROS(Resource Orchestration Service)实现,旨在帮助开发者通过IaC(Infrastructure as Code)的方式体验资源的自动化配置。如需查看软件版本、安装命令等配置的具体信息,可查看教程的手动配置版。模板完成的内容包括:

为ECS实例配置安全组

创建角色并绑定到ECS实例

安装Nginx服务并写入配置

安装uWSGI Server并写入配置

安装Python环境并写入代码

操作步骤
打开一键配置模板链接前往ROS控制台,系统自动打开使用新资源创建资源栈的面板,并在模板内容区域展示YAML文件的详细信息。

ROS控制台默认处于您上一次访问控制台时的地域,请根据您创建的资源所在地域修改地域。您可以在顶部导航栏选择华北2(北京)地域,保持页面所有选项不变,单击下一步进入配置模板参数页面。

在配置模板参数页面修改资源栈名称,选择您申请免费试用时创建的ECS实例,设置要创建的用于ECS实例扮演的角色名称,选择创建的CLB实例。填写完所有必选信息并确认后单击创建开始一键配置。

当资源栈信息页面的状态显示为创建成功时表示一键配置完成。

手动配置
您可参考以下步骤,手动配置ECS及CLB实例:

步骤一:创建角色并绑定到ECS实例

步骤二:登录云服务器

步骤三:安装Nginx服务

步骤四:开发后端服务

步骤五:安装uWSGI Server

步骤六:配置Nginx并重启

步骤七:配置监听

步骤一:创建角色并绑定到ECS实例
创建好实例后,您需要创建角色并关联到ECS实例,用于后端服务调用SDK。

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

创建实例RAM角色。

使用RAM管理员登录RAM控制台。

在左侧导航栏,选择身份管理 > 角色。

在角色页面,单击创建角色。

在创建角色面板,选择可信实体类型选择为阿里云服务,然后单击下一步。

阿里云服务用于授权ECS实例访问或管理您的云资源。RAM角色选择阿里云服务类型后,支持授予给ECS实例。

选择角色类型为普通服务角色。

输入角色名称和备注。

选择受信服务为云服务器。

单击完成。

单击关闭。

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

使用阿里云账号登录RAM控制台。

在左侧导航栏,选择权限管理>权限策略。

在权限策略页面,单击创建权限策略。

在创建权限策略页面,单击脚本编辑页签。

输入权限策略内容,然后单击继续编辑基本信息。

放大查看复制代码
{
    "Version": "1",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecs:DescribeInstances",
                "ecs:DescribeInstanceStatus"
            ],
            "Resource": "*"
        }
    ]
}
输入权限策略名称:EcsRamRolePolicyTest和备注。

单击确定。

为RAM角色授予权限。

使用RAM管理员登录RAM控制台。

(可选)如果您不使用系统权限,可以参见账号访问控制创建自定义权限策略章节创建一个自定义策略。

在左侧导航栏,选择身份管理 > 角色。

在权限管理页签,单击精确授权。

在添加权限面板,选择权限策略类型为自定义策略,然后输入刚刚创建的权限策略名称。

单击确定。

单击关闭。

为实例授予RAM角色。

登录ECS管理控制台。

在左侧导航栏,选择实例与镜像 > 实例。

在顶部菜单栏左上角处,选择创建ECS的地域,本教程是华北2(北京)。

找到要操作的ECS实例,选择 > 实例设置 > 授予/收回RAM角色。

在弹窗中,选择创建好的实例RAM角色,单击确定完成授予。

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

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

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

设置该实例登录密码。在操作列单击> 实例属性 > 重置实例密码,按照界面提示设置ECS实例的登录密码。保存密码后,在弹出的页面,单击立即重启使密码生效。

实例创建完成大约3~5分钟后,才支持重置实例密码,如不可重置请耐心等待后重试。

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

远程连接ECS实例。

a.返回实例页面,单击该实例对应操作列下的远程连接。

b.在弹出的连接与命令对话框中,单击通过Workbench远程连接对应的立即登录。

c.在弹出的登录实例对话框中,输入登录信息。

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

步骤三:安装Nginx服务
执行命令安装Nginx。

放大查看复制代码
sudo yum update && sudo yum -y install nginx
启动Nginx。

放大查看复制代码
sudo systemctl start nginx
执行以下命令,查看Nginx服务的运行状态。

如果回显信息显示Active:active(running)时,表示Nginx已启动。

放大查看复制代码
systemctl status nginx
重复执行以上操作,在ECS02实例中安装Nginx服务。

步骤四:开发后端服务
创建服务目录。

放大查看复制代码
sudo mkdir /data && cd /data
创建并编辑Python服务依赖文件。

放大查看复制代码
sudo vim requirements.txt
进入Vim编辑器后,按i键进入编辑模式,粘贴以下内容。

放大查看复制代码
aliyun_python_sdk_core==2.13.36
aliyun_python_sdk_ecs==4.24.62
Flask==2.0.3
粘贴后,按Esc键,输入:x保存并退出编辑。

执行如下命令安装依赖。

放大查看复制代码
sudo pip3 install --upgrade pip && sudo pip3 install -r requirements.txt
创建并编辑Python服务代码文件。

放大查看复制代码
sudo vim get_server_info.py
进入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()
粘贴后,按Esc键,输入:x保存并退出编辑。

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

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

执行命令安装uWSGI。

放大查看复制代码
sudo pip3 install uwsgi
新建uwsgi配置文件。

放大查看复制代码
cd /data && sudo vim uwsgi.ini
进入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
粘贴后,按Esc键,输入:x保存并退出编辑。

运行which uwsgi命令,查找并确认uwsgi可执行文件的完整路径。

系统返回信息如下:

放大查看复制代码
/usr/local/bin/uwsgi
运行uwsgi server。

放大查看复制代码
sudo /usr/local/bin/uwsgi uwsgi.ini
执行以下命令查看uwsgi服务启动情况,看到如下图效果是服务启动成。

放大查看复制代码
ps aux | grep uwsgi


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

步骤六:配置Nginx并重启
启动好后端服务后,我们需要添加Nginx配置来代理后端服务。

创建配置文件。

放大查看复制代码
sudo vim /etc/nginx/conf.d/app.conf
进入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;
    }
}
粘贴后,按Esc键,输入:x保存并退出编辑。

重启Nginx。

放大查看复制代码
sudo nginx -s reload
验证配置是否成功。

说明
如果未运行成功,可以在/data/uwsgi.log日志文件查看原因。

放大查看复制代码
curl http://127.0.0.1/ecs/getServerInfo
命令执行结果是Invalid Parameter表示服务配置成功。

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

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

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

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

在监听页签单击添加监听。

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

放大查看
监听配置

说明

示例值

选择负载均衡协议

选择监听的协议类型。

HTTP

监听端口

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

监听端口范围:1~65535。

80

监听名称

自定义监听的名称。

HTTP_80

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

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

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

步骤三:注册微信小程序
在开发小程序之前,您需要先注册微信小程序。

进入小程序页面,单击前往注册,根据指引填写信息和提交相应的资料,完成账号申请。

使用申请的微信公众平台账号登录小程序后台,单击开发管理> 开发设置,可以看到小程序的AppID,请记录AppID,后续操作中需要使用。

步骤四:安装小程序开发环境并创建项目
启动好后端服务后,我们接下来要开发小程序。先安装小程序开发环境。

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

下载并安装微信小程序开发工具。详细信息请参见开发工具下载。

打开小程序开发工具,使用微信扫码登录。

单击加号创建微信小程序示例项目。

参考以下填写项目信息,最后单击新建。

项目名称:例如ECSAssistant。

目录:例如D:\workspace\wechat\ECSAssistant。

AppID:小程序的唯一标识,从小程序控制台获取。

开发模式:小程序。

后端服务:不使用云服务。

配置项目允许访问非HTTPS域名。在顶部配置栏,选择设置>项目设置,在本地设置页签,选中不校验合法域名、web-view(业务域名)、TLS版本一级HTTPS证书。

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

生成的小程序示例项目结构如下。

可以看到小程序的项目结构中有三种前缀为app的文件,它们定义了小程序的一些全局配置。

app.json应用配置。用于配置小程序的页面列表、默认窗口标题、导航栏背景色等。更多信息,请参见全局配置。

app.acss应用样式。定义了全局样式,作用于当前小程序的所有页面。

app.js应用逻辑。可配置小程序的生命周期,声明全局数据,调用丰富的API。

小程序所有的页面文件都在pages/路径下,页面文件有四种文件类型,分别是.js、.wxml、.wxss、和.json后缀的文件。相比全局配置文件,页面配置文件只对当前页面生效。其中.wxml文件定义了当前页面的页面结构。小程序中的所有页面都需要在app.json文件中声明。更多信息,请参见代码构成。

此外,项目顶层还有开发工具配置文件project.config.json和爬虫索引文件sitemap.json。

放大查看复制代码
ECSAssistant
├── app.js
├── app.json
├── app.wxss
├── pages
│ ├── index
│ │ ├── index.js
│ │ ├── index.json
│ │ ├── index.wxml
│ │ └── index.wxss
│ └── logs
│     ├── logs.js
│     ├── logs.json
│     ├── logs.wxml
│     └── logs.wxss
├── project.config.json
└── sitemap.json
编辑app.json文件,将小程序页面Title修改为ECS小助手,修改后的app.json文件内容如下。

放大查看复制代码
{
  "pages":[
    "pages/index/index",
    "pages/logs/logs"
  ],
  "window":{
    "backgroundTextStyle":"light",
    "navigationBarBackgroundColor": "#fff",
    "navigationBarTitleText": "ECS小助手",
    "navigationBarTextStyle":"black"
  },
  "style": "v2",
  "sitemapLocation": "sitemap.json"
}
编辑pages/index/index.wxss文件,定义index的页面样式,修改后的index.wxss文件内容如下。

放大查看复制代码
.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;
}
编辑pages/index/index.js文件,定义搜索框的失去焦点事件,修改后的index.js文件内容如下。

说明
将代码中<CLB_PUBLIC_IP>换成您刚刚创建的CLB实例的公网IP。

放大查看复制代码
Page({
  data: {
    queryResult: null,
    showView: 'false',
  },


  bindblur: function(e) {
    let that = this;
    wx.request({
      url: 'http://<CLB_PUBLIC_IP>/ecs/getServerInfo',
      method: 'GET',
      data: {
        instanceId: e.detail.value
      },
      success(res) {
        if(res.statusCode == 200){
          that.setData({
            queryResult: res.data,
            showView: !that.data.showView,
          });
        }else{
          that.setData({
            showView: 'false',
          });
          wx.showToast({
            title: '请输入你的ECS实例ID',
            duration: 1500,
            icon: 'none',
            mask: true
          })
        }
      }

    })
  }
})
编辑pages/index/index.wxml文件,编写展示界面,修改后的index.wxml文件内容如下。

放大查看复制代码
<view class='container'>
  <input placeholder='请输入你的ECS实例ID' class='search-input' value='{{ inputValue }}' bindblur='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>
保存后,编辑器会自动刷新。看到如下界面,表示小程序运行成功了。

步骤六:测试微信小程序
完成以上操作后,您已经成功部署了服务端程序,并且在本地开发好了小程序。

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

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

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

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

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

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

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

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

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

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

相关文档

原文:推荐一篇阿里云文档《搭建高可用的微信小程序服务(Alibaba Cloud Linux 3)》(来自 阿里云文档 - 云服务器 ECS) https://help.aliyun.com/zh/ecs/use-cases/build-a-high-availability-wechat-mini-program-service-on-an-alibaba-cloud-linux-3-instance

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2060048.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java使用Map+函数式接口实现策略模式

一、项目背景 在项目中&#xff0c;我们处理了各种类型的通知消息。在没有采用策略模式之前&#xff0c;代码中充斥了大量的 if-else 语句&#xff0c;这不仅让整个项目显得杂乱无章&#xff0c;还增加了后续维护的难度。为了解决这一问题&#xff0c;我们采用了 Map 和函数式…

Vue事件处理:v-on 指令

1、v-on 指令 在 Vue.js 中&#xff0c;事件处理是一个很重要的环节&#xff0c;可以使用 v-on 指令对 DOM 事件进行监听。该指令通常在模板中直接使用&#xff0c;在触发事件时执行相应的 JavaScript 代码。在 HTML 元素中使用 v-on 指令时&#xff0c;v-on 后面可以是所有的…

动态内存管理申请调整和释放

动态内存管理存放在内存中的堆区中 动态内存分配的函数&#xff1a;malloc、calloc、realloc、free 动态内存分配 malloc函数&#xff08;内存申请空间&#xff09;无初始化free函数&#xff08;动态内存释放&#xff09;calloc函数&#xff08;内存空间申请&#xff09;初始化…

【MADRL】基于MADRL的单调价值函数分解(QMIX)算法

本篇文章是博主强化学习RL领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在强化学习专栏&#xff1…

30道python自动化测试面试题与答案汇总!

Python是不可或缺的语言,它的优美与简洁令人无法自拔,下面这篇文章主要给大家介绍了关于30道python自动化测试面试题与答案汇总的相关资料,需要的朋友可以参考下 1、什么项目适合做自动化测试&#xff1f; 关键字&#xff1a;不变的、重复的、规范的 1&#xff09;任务测试明…

硬核剧透!安全领域专家及领军人物共话生态标准 | 2024 龙蜥大会=

2024 龙蜥操作系统大会由中国计算机学会开源发展委员会、中关村科学城委员会、海淀区委网信办、中国开源软件推进联盟指导&#xff0c;龙蜥社区主办&#xff0c;阿里云、中兴通讯、Intel、浪潮信息、Arm、中科方德等 24 家理事单位共同承办&#xff0c;主题为“进化重构赴未来”…

别再混淆了!一文带你理清前置机、跳板机与堡垒机的区别

本文详细介绍前置机、跳板机和堡垒机在网络安全和IT基础设施中各自扮演着重要角色&#xff0c;它们虽然有一定的相似性&#xff0c;但在功能和用途上存在显著差异。以下是对三者的详细解析&#xff1a; 前置机 概念 前置机是一种中间设备&#xff0c;通常位于客户端和服务器…

神经网络训练多个epoch,写论文的时候可以取最好的效果那一个epoch作为结果吗?

在论文中&#xff0c;通常建议报告在验证集上表现最佳的模型作为结果。你可以在训练过程中记录每个 epoch 的性能&#xff0c;并选择在验证集上性能最好的那个 epoch 的结果。这种方法能够展示你所训练的模型在其最佳状态下的表现。 这样做有几个优点&#xff1a; 客观展示模…

Linux系统编程(13)IPC(共享内存)和网络通信基础

一、共享内存 共享内存是通过映射的方式在内核中申请一段可以使用的物理内存空间来映射到用户空间中&#xff0c;用户对用户空间的操作就是直接操作物理内存区域。通过这种方式&#xff0c;进程可以直接读写这部分内存&#xff0c;从而实现高效的数据交换。相比于其他 IPC 机制…

vue2子组件生命周期被调用两次

目前解决办法是改成了这种写法&#xff0c;改为这种不会出现加载两次子组件生命周期的问题 <el-tabs v-model"activeName" style"margin: 0px"><el-tab-pane name"systemLogCollection"><span slot"label">{{ tabLi…

[数据集][目标检测]起子检测数据集VOC+YOLO格式1215张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1215 标注数量(xml文件个数)&#xff1a;1215 标注数量(txt文件个数)&#xff1a;1215 标注…

20240822 每日AI必读资讯

特斯拉雇佣员工通过穿戴动捕服来帮助训练其人形机器人Optimus&#xff01; - 该职位被称为“数据采集操作员”&#xff0c;时薪最高可达48美元&#xff0c;要求员工每天行走超过七小时&#xff0c;携带高达30磅的重量&#xff0c;并长时间佩戴VR头显。 - 员工还必须身高在5英…

ConfigurationProperties使用

ConfigurationProperties 是 Spring Framework 的一个注解 用于将配置文件&#xff0c;环境变量中的值映射到一个 Java 对象的属性上。 简单使用 user:admin:name: adminpassword: 123456age: 18Data Component ConfigurationProperties(prefix "user.admin") publ…

Vue 满屏纵向轮播图

目录 前言轮播图效果展示具体实现实现思路具体代码前言 今天汇总一个需求,还是之前写的,要求写一个满屏的轮播图,准确的说,是鼠标滑动到轮播图的时候,轮播图固定在屏幕上,随着其中的轮播子项遍历结束后,解除固定的效果。原本我最开始想直接修改Element-UI的组件的,但是…

湖州网站建设快速建站

在当今信息化时代&#xff0c;网站的建设已成为企业和个人展示形象、传播信息的重要途径。湖州作为一个历史悠久、文化底蕴深厚的城市&#xff0c;发展迅速&#xff0c;涌现出许多需要快速建立网站的企业和个人。本文将探讨湖州网站建设的快速建站方案。 首先&#xff0c;快速建…

WRF-LES与PALM微尺度气象大涡模拟

针对微尺度气象的复杂性&#xff0c;大涡模拟&#xff08;LES&#xff09;提供了一种无可比拟的解决方案。微尺度气象学涉及对小范围内的大气过程进行精确模拟&#xff0c;这些过程往往与天气模式、地形影响和人为因素如城市布局紧密相关。在这种规模上&#xff0c;传统的气象模…

Camunda BPMN 基础组件

Camunda基础 一、参与者 参与者&#xff08;Participants&#xff09;是参与流程的对象&#xff0c;表示流程中活动的执行者&#xff0c;可以是一个组织、角色、系统或者个人。 图示为基础事件&#xff0c;除此之外还有&#xff1a; 消息开始事件&#xff08;Message Start…

第二百零四节 Java正则表达式教程 - Java正则表达式量词

Java正则表达式教程 - Java正则表达式量词 我们可以指定正则表达式中的字符的次数可以匹配字符序列。 为了使用正则表达式表达一个数字或更多的模式&#xff0c;我们可以使用量词。 下表列出了量词及其含义。 量词含义*零次或更多次一次或多次?一次或根本不{m}正好m次{m,}至…

数字工厂管理系统的使用操作难不难

在当今智能制造的浪潮中&#xff0c;引入数字工厂管理系统无疑为企业带来了前所未有的效率提升与决策优化能力。然而&#xff0c;谈及数字工厂管理系统的操作难易程度&#xff0c;这并非一个可以一概而论的问题&#xff0c;它深深植根于系统的复杂性、用户技能水平、培训深度以…

python之matplotlib (8 极坐标)-圆与心

极坐标 极坐标图像的绘制类似于三维图像的绘制&#xff0c;只需要将projection参数由3d改为polar即可。 import numpy as np import matplotlib.pyplot as plt figplt.figure() axfig.add_subplot(projectionpolar)theta np.linspace(0, 2 * np.pi, 100) r np.sin(the…