基于Raindrop网,分享项目的组网架构和部署。

项目组网架构

struct

架构说明

1.流

项目访问分为两个流,通过nginx分两个端口暴露给外部使用:
数据流:用户访问Raindrop网站。
控制流:管理人员通过supervisor监控、管理服务器进程。

图中除了将程序部署在ECS上外,还使用了OSS(对象存储服务,可以理解成一个nosql数据库),主要是为了存放一些静态文件,提高访问速度。阿里的OSS还可以与CDN一起使用,同样可以提高访问速度。

2.nginx

通过nginx对外暴露两个端口,如上所述,80端口供用户访问网站,另一个端口供管理人员使用。
80端口:根据请求的url配置了方向代理,分别导向client(angular)和server(flask).
其中server通过gunicorn部署在[socket]localhost:10000
配置如下:

server {listen 80 default_server;# set client body size to 4M (add by dh) #client_max_body_size 4M;gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;# productroot /home/raindrop/www/client/dist;# Add index.php to the list if you are using PHPindex index.html index.htm index.nginx-debian.html;server_name _;location / {# First attempt to serve request as file, then# as directory, then fall back to displaying a 404.try_files $uri $uri/ =404;}# access flask static folderlocation /static/ {# productroot /home/raindrop/www/server/app;}location /api/ {proxy_pass http://localhost:10000/api/;proxy_redirect off;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    }# Error pageserror_page 413 @413_json;location @413_json {default_type application/json;      return 200 '{"msg": "Request Entity Too Large(max=4M)"}';}
}

3.gunicorn

gunicorn作为wsgi容器,用来执行flask server。
gunicorn可以使用异步socket:gevent,其本质是基于greenlet实现协程的第三方库,改善io阻塞问题,通过简单的配置就能使程序获得极高的并发处理能力。

注意:使用gunicorn != 使用gevent,如要开启gevent socket,启动gunicorn时需要增加--work-class参数,如下:

gunicorn --workers=4 --worker-class socketio.sgunicorn.GeventSocketIOWorker -b localhost:10000 wsgi:app

除了gunicorn,也可以选用uwsgi,但是有两点限制需要注意:
1.如果使用了Flask-socketio,请不要使用uwsgi,原因

Note regarding uWSGI: While this server has support for gevent and WebSocket, 
there is no way to use the custom event loop needed by gevent-socketio, 
so there is no directly available method for hosting Flask-SocketIO applications on it.
If you figure out how to do this please let me know!

2.如果使用异步WSGI Server,请勿使用uwsgi,原因:慎用异步 WSGI Server 运行 Flask 应用

 Flask(Werkzeug)的Local Thread无法与uwsgi基于uGreen的微线程兼容,引起Local Thread工作混乱。

4.celery

在程序运行过程中会有一些比较耗时但并非紧急的工作,这些任务可以使用异步任务来处理,提高server的响应速度。
celery - Distributed Task Queue是一个第三方库,提供异步队列和任务处理功能。
Raindrop使用celery配合实现feed功能。通过flask进行配置,使用redis作为异步队列来存储任务,并将处理结果(feed activity)存储在redis中。

5.supervisor

如上所述,我们需要在服务器上运行gunicorn和celery两个进程。
显然,我们需要一个monitor来帮我们管理这两个进程,避免进程崩溃不能及时拉起,阻塞业务。
supervisor:Supervisor process control system for UNIX是一个开源monitor程序,并且内置了web管理功能,可以远程监控、重启进程。配置如下:

[inet_http_server]
# web 管理端口,通过nginx暴露给远端用户
port=127.0.0.1:51000[program:raindrop]
# 程序启动命令
command = gunicorn --workers=4 --worker-class socketio.sgunicorn.GeventSocketIOWorker -b localhost:10000 wsgi:app
directory = /home/raindrop/www/server
user = dh                                     
stopwaitsecs=60
stdout_logfile = /var/log/raindrop/supervisor-raindrop.log
redirect_stderr = true[program:celery]
command = celery -P gevent -A wsgi.celery worker
directory = /home/raindrop/www/server
user = dh                                             
stopwaitsecs=60
stdout_logfile = /var/log/raindrop/supervisor-celery.log
redirect_stderr = true

6.数据库

mysql:网站主要数据存储在关系型数据库中
redis:缓存mysql数据 + celery异步队列

服务器

使用阿里云的服务器
ECS:部署服务端程序
OSS:存储前端静态文件(速度很快,对前端体验改善很大,采用angular框架强烈推荐使用)

组件

nginx: HTTP Server
angularjs: client框架
flask:server框架
gunicorn: web 容器
celery: 异步任务处理
supervisor: monitor
redis: 数据缓存 + 任务队列
mysql: 数据库

本地开发环境与工具

ubuntu12.04 64: 操作系统
virtualenv: python虚拟环境(隔离项目开发环境,不用担心包冲突了)
vagrant: 基于virtualbox的本地虚拟环境(环境可以导入导出,团队开发必备)
gulp: angular工程打包工具
pip: python包管理工具
fabric: 基于python的远程脚本(自动化部署神器)

打包部署

基于Ubuntu 12.0.4,其它系统安装命令(apt-get 等)请自行修改。

繁琐VS自动化

deploy

  1. 如果是第一次部署,需要初始化ECS服务器,安装基本工具:
    nginx, supervisor, redis, mysql, pip, virtualenv

  2. 打包项目代码

  3. 发布静态文件到OSS服务器

  4. 发布项目代码到ECS服务器,安装server依赖的包

  5. 修改mysql, nginx, supervisor配置文件

  6. 拉起所需进程

然后各种apt-get install, scp, tar, cp, mv,不得不说,这是一个烦人且毫无技术含量的工作,干过几次后基本就可以摔键盘了。
不过,有繁琐的地方,一定有自动化。其实完成上面这些工作,三条命令足以:

fab init_env
fab build
fab deploy

这要感谢Fabric:Simple, Pythonic remote execution and deployment项目,封装了非常简洁的远程操作命令。

Fabric

使用Fabric,只需要编写一个fabile.py脚本,在启动定义init_env, build, deploy三个任务:

# -*- coding: utf-8 -*-import os, re, hashlib
from termcolor import colored
from datetime import datetime
from fabric.api import *
from fabric.contrib.files import existsclass FabricException(Exception):passenv.abort_exception = FabricException# 服务器地址,可以有多个,依次部署:
env.hosts = ['user@120.1.1.1'
]env.passwords = {'user@120.1.1.1:22':'123456'
}# sudo用户为root:
env.sudo_user = 'root'# mysql
db_user = 'root'
db_password = '123456'_TAR_FILE = 'raindrop.tar.gz'
_REMOTE_TMP_DIR = '/tmp'
_REMOTE_BASE_DIR = '/home/raindrop'
_ALIYUN_OSS = {'endpoint'       : 'oss-cn-qingdao.aliyuncs.com','bucket'         : 'yourbucketname','accessKeyId'    : 'youraccessKeyId' ,'accessKeySecret': 'youraccessKeySecret'
}def build():'''必须先打包编译client,再打包整个项目'''with lcd(os.path.join(os.path.abspath('.'), 'client')):local('gulp build')# 上传静态文件到oss服务器,并修改index.html中对静态文件的引用with lcd(os.path.join(os.path.abspath('.'), 'client/dist')):with lcd('scripts'):for file in _list_dir('./'):if oss_put_object_from_file(file, local('pwd', capture=True) + '/' + file):_cdnify('../index.html', file)with lcd('styles'):for file in _list_dir('./'):if oss_put_object_from_file(file, local('pwd', capture=True) + '/' + file):_cdnify('../index.html', file)# 注意在oss上配置跨域规则,否则fonts文件无法加载# !!修改fonts文件夹请放开此段程序!!# with lcd('fonts'):#     for file in _list_dir('./'):#         oss_put_object_from_file('fonts/%s' % file, local('pwd', capture=True) + '/' + file)                with lcd(os.path.join(os.path.abspath('.'), 'server')):local('pip freeze > requirements/common.txt')excludes = ['oss', 'distribute'][local('sed -i -r -e \'/^.*' + exclude + '.*$/d\' "requirements/common.txt"') for exclude in excludes]local('python setup.py sdist')# e.g command: fab deploy:'',Fasle
# 注意命令两个参数间不要加空格
def deploy(archive='', needPut='True'):if archive is '':filename = '%s.tar.gz' % local('python setup.py --fullname', capture=True).strip()archive = 'dist/%s' % filenameelse:filename = archive.split('/')[-1]tmp_tar = '%s/%s' % (_REMOTE_TMP_DIR, filename)if eval(needPut):# 删除已有的tar文件:run('rm -f %s' % tmp_tar)# 上传新的tar文件:put(archive, _REMOTE_TMP_DIR)# 创建新目录:newdir = 'raindrop-%s' % datetime.now().strftime('%y-%m-%d_%H.%M.%S')with cd(_REMOTE_BASE_DIR):sudo('mkdir %s' % newdir)# 重置项目软链接:with cd(_REMOTE_BASE_DIR):# 解压到新目录:with cd(newdir):sudo('tar -xzvf %s --strip-components=1' % tmp_tar)    # 保存上传文件if exists('www/server/app/static/upload/images/', use_sudo=True):sudo('cp www/server/app/static/upload/images/ %s/server/app/static/upload/ -r' % newdir)sudo('rm -f www')sudo('ln -s %s www' % newdir)with cd(_REMOTE_BASE_DIR):with prefix('source %s/env/local/bin/activate' % _REMOTE_BASE_DIR):sudo('pip install -r www/server/requirements/common.txt')# 启动服务with cd('www'):# mysqlsudo('cp etc/my.cnf /etc/mysql/')sudo('restart mysql')# monitorsudo('cp etc/rd_super.conf /etc/supervisor/conf.d/')sudo('supervisorctl stop celery')sudo('supervisorctl stop raindrop')sudo('supervisorctl reload')sudo('supervisorctl start celery')sudo('supervisorctl start raindrop')# nginxsudo('cp etc/rd_nginx.conf /etc/nginx/sites-available/')# ln -f —-如果要建立的链接名已经存在,则删除之sudo('ln -sf /etc/nginx/sites-available/rd_nginx.conf /etc/nginx/sites-enabled/default')sudo('nginx -s reload')def init_env():sudo('aptitude update')sudo('aptitude safe-upgrade')# sudo('apt-get install nginx')sudo('aptitude install python-software-properties')sudo('add-apt-repository ppa:nginx/stable')sudo('aptitude update')sudo('apt-get install nginx')sudo('apt-get install supervisor')sudo('apt-get install redis-server')sudo('apt-get install mysql-server')sudo('apt-get install python-pip python-dev build-essential')sudo('pip install virtualenv')run('mkdir /var/log/raindrop -p')with cd ('/home/raindrop'):sudo('virtualenv env')def oss_put_object_from_file(key, file_path):from oss.oss_api import *oss = OssAPI(_ALIYUN_OSS['endpoint'], _ALIYUN_OSS['accessKeyId'], _ALIYUN_OSS['accessKeySecret'])res = oss.put_object_from_file(_ALIYUN_OSS['bucket'], key, file_path)return res.status == 200 and True or Falsedef _expand_path(path):print pathreturn '"$(echo %s)"' % pathdef sed(filename, before, after, limit='', backup='.bak', flags=''):# Characters to be escaped in bothfor char in "/'":before = before.replace(char, r'\%s' % char)after = after.replace(char, r'\%s' % char)# Characters to be escaped in replacement only (they're useful in regexen# in the 'before' part)for char in "()":after = after.replace(char, r'\%s' % char)if limit:limit = r'/%s/ ' % limitcontext = {'script': r"'%ss/%s/%s/%sg'" % (limit, before, after, flags),'filename': _expand_path(filename),'backup': backup}# Test the OS because of differences between sed versionswith hide('running', 'stdout'):platform = local("uname")if platform in ('NetBSD', 'OpenBSD', 'QNX'):# Attempt to protect against failures/collisionshasher = hashlib.sha1()hasher.update(env.host_string)hasher.update(filename)context['tmp'] = "/tmp/%s" % hasher.hexdigest()# Use temp file to work around lack of -iexpr = r"""cp -p %(filename)s %(tmp)s \
&& sed -r -e %(script)s %(filename)s > %(tmp)s \
&& cp -p %(filename)s %(filename)s%(backup)s \
&& mv %(tmp)s %(filename)s"""else:context['extended_regex'] = '-E' if platform == 'Darwin' else '-r'expr = r"sed -i%(backup)s %(extended_regex)s -e %(script)s %(filename)s"command = expr % contextreturn local(command)def _cdnify(index_file, cdn_file):sed(index_file, '([^<]*(src|href)=")[^<]*' + cdn_file + '"', '\\1http://' + _ALIYUN_OSS['bucket'] + '.' + _ALIYUN_OSS['endpoint'] + '/' + cdn_file + '"')def _list_dir(dir=None, access=lcd, excute=local):"""docstring for list_dir"""if dir is None:return []with access(dir):string = excute("for i in *; do echo $i; done", capture=True)files = string.replace("\r","").split("\n")return files        

通过fabric自动化部署有两点需要注意:
1.安装mysql时,设置的密码不能生效,需要登到服务器上手动设置一下:

mysql -u root
use mysql;
update user set password=PASSWORD('123456') where User='root';
flush privileges;
quit;

2.服务器上的用户需要自己手动创建。

gulp

在build任务中,使用gulp build打包client的angular代码。
这里先不多说,有需要请参考github项目generator-gulp-angular

setup

setup是python自己的打包工具。
build任务中,最后使用python setup.py sdist命令把整个工程打包成一个tar.gz文件,上传到服务器。
使用这个工具需要编写如下两个文件:
setup.py:打包脚本

#!/usr/bin/env pythonfrom setuptools import setup, find_packages
import servertry:long_description = open('README.md').read()
except:long_description = server.__description__REQUIREMENTS = []
exclude_lib = ['oss', 'distribute']
for lib in open("server/requirements/common.txt").readlines():for exclude in exclude_lib:if lib.lower() not in exclude:REQUIREMENTS.append(lib)setup(name='raindrop',url='https://www.yudianer.com',version=server.__version__,author=server.__author__,author_email=server.__email__,description=server.__description__,long_description=long_description,license=server.__license__,packages=find_packages(),zip_safe=False,platforms='any',    install_requires=REQUIREMENTS
)

MANIFEST.in:指定打包哪些文件夹

recursive-include etc *
recursive-include client/dist *
recursive-include server/app *
recursive-include server/requirements *
recursive-exclude server *.pyc
prune server/app/static/upload/images
prune server/env 
prune server/tests

本文由raindrop网码农撰写。欢迎转载,但请注明出处。

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 从servlet到struts2

    Servlet Servlet优点 1、Servlet是mvc的基础&#xff0c;其他的框架比如struts1&#xff0c;struts2&#xff0c;webwork都是从servlet基础上发展过来的。所以掌握servlet是掌握mvc的关键。 2、Servlet把最底层的api暴漏给程序员&#xff0c;使程序员更能清楚的了解mvc的各个…...

    2024/4/25 22:48:24
  2. 手搭一个 React,Typescript,Koa,GraphQL 环境

    本文系原创&#xff0c;转载请附带作者信息&#xff1a;yhlben 项目地址&#xff1a;github.com/yhlben/cdfa… 前言 在实际的开发过程中&#xff0c;从零开始初始化一个项目往往很麻烦&#xff0c;所以各种各样的脚手架工具应运而生。crea-react-app&#xff0c;vue-cli&#…...

    2024/4/25 19:04:28
  3. React,Angular和Vue的15种绝佳替代品

    “音乐之声”可能会说&#xff1a;“让我们从头开始&#xff0c;这是一个很好的起点。” 但是几乎每个开发人员都知道这是一个愚蠢的计划。 正确的起点是由一支伟大的开源开发人员团队建立的坚实基础。 克隆他们的辛苦工作&#xff0c;然后添加足够的代码以使其成为您自己的代码…...

    2024/4/21 4:21:59
  4. Koa 基础篇(三)—— 模板引擎

    ejs 安装 npm install --save ejs koa-views引入 const views require("koa-views") app.use(views("views",{extension:"ejs"}))注意&#xff1a;上面这里意思就是把路径 views 作为存放 ejs 模板的路径。 基本使用 router.get("/ne…...

    2024/4/21 4:21:58
  5. 【前端:Ts+React+Redux+React-Router+ant-design;服务端:Node+Koa2+MongoDB】从TodoList入门React全家桶采坑合集

    文章目录前言采坑合集没有全家桶脚手架搭建typescript环境在官方全家桶中使用typescript配置tslint样式表的使用配置其他类型的css处理文件行内样式的使用样式没有模块作用域配置react-router没有双绑绑定事件事件参数问题使用ant-designreduxredux谷歌开发者工具combineReduce…...

    2024/4/21 4:21:57
  6. Vue+koa2开发一款全栈小程序(服务端环境搭建和项目初始化)

    1.微信公众平台小程序关联腾讯云 腾讯云的开发环境是给免费的一个后台&#xff0c;但是只能够用于开发&#xff0c;如果用于生产是需要花钱的&#xff0c;我们先用开发环境吧 1.用小程序开发邮箱账号登录微信公众平台 2.【设置】→【开发者工具】→第一次是git管理&#xff…...

    2024/5/2 7:48:39
  7. Koa-art-template自定义日期管道

    在用Node.js进行后端开发时&#xff0c;对于日期的处理&#xff0c;都是从数据库查出来进间戳&#xff0c;然后在接口里进行处理后渲染到模板文件上&#xff0c;这种方式会存在一定弊端&#xff0c;那就是每查一个时间戳都要进行处理一下&#xff0c;比较麻烦&#xff0c;下面给…...

    2024/4/28 1:18:07
  8. nest框架连接mongodb数据库

    作为后端语言开发自然要连接数据库,对数据的增删改查,目前nest提供可以连接的数据库有mySQL和mongoDB,官网地址,本文介绍使用nest连接mongoDB数据库,官网介绍也很简单,官网提供的案例 一、使用步骤 1、安装依赖包 npm install --save nestjs/mongoose mongoose2、在项目中创建…...

    2024/4/20 19:50:35
  9. Angular做一个笔记文章管理应用

    前言 相信大家在逛技术论坛或者技术博客的时候&#xff0c;都会发现有些写的很好的文章我们想保存下来以便可以重复翻阅和查看&#xff0c;在一些相对大的站点&#xff0c;比如SegmentFault或者掘金都会提供类似收藏这样的功能来帮我们做这个保存的工作&#xff0c;我们以后可以…...

    2024/4/20 19:50:34
  10. nest.js、egg.js、midway,express、koa的区别

    前言 随着nest.js框架逐渐火起来&#xff0c;对于没有接触过nest的小伙伴可能会疑惑nest是什么&#xff1f;在你了解了nest.js是什么的前提下&#xff0c;你可能会疑惑nest.js与传统的koa、express有什么区别&#xff1f;针对这两个问题&#xff0c;结合了网上的一些文章&#…...

    2024/4/20 19:50:33
  11. node框架:Express,Koa,Hapi

    Express&#xff1a; Express是一个最小且灵活的Web应用程序框架&#xff0c;为Web和移动应用程序提供了一组强大的功能&#xff0c;它的行为就像一个中间件&#xff0c;可以帮助管理服务器和路由 安装&#xff1a; // 你可以将express安装到项目依赖npm install express --…...

    2024/4/21 4:21:55
  12. Koa2基础入门二:koa模板引擎ejs.js、art-template、pug

    适用于koa 的模板引擎什么是ejs.jsKoa 中使用ejs 模板的使用Ejs 中引入另一个ejs模板常用标签文件总览什么是art-template使用什么是pug什么是ejs.js EJS是一个简单高效的模板语言&#xff0c;通过数据和模板&#xff0c;可以生成HTML标记文本。可以说EJS是一个JavaScript库&a…...

    2024/4/21 4:21:54
  13. koa art-template模板引擎的使用

    art-template 模板引擎介绍 art-template 是一个简约、超快的模板引擎。 它采用作用域预声明的技术来优化模板渲染速度&#xff0c;从而获得接近 JavaScript 极限的运行 性能&#xff0c;并且同时支持 NodeJS 和浏览器。 art-template 支持 ejs 的语法&#xff0c;也可以用自己…...

    2024/4/21 4:21:53
  14. Koa2入坑(四)

    使用引擎模版 1、使用html 目录结构: | html| viewsindex.htmltodo.html404.htmlapp.js app.js: const Koa require(koa); const fs require(fs) const app new Koa();/*** 用Promise封装异步读取文件方法* param {string} page html文件名称* return {promise} …...

    2024/4/21 4:21:53
  15. NG全家桶全栈项目实践总结

    前言 Angular在国内使用的人并不像国外那么多&#xff0c;基本都是外企在用&#xff0c;但其框架的思想却仍可以为我们所借鉴&#xff0c;在某些问题没有思路的时候可以参考ng相关的处理&#xff0c;ng处理方式和思维确实比较超前&#xff0c;但也因此而曲高和寡。本文旨在通过…...

    2024/4/21 4:21:51
  16. Angular 联调测试碎碎念

    前言 使用angular开发项目&#xff0c;进行前后端联调时&#xff0c;常见的状态是所有静态文件放于nginx根目录下&#xff0c;使用nginx的反向代理功能调用真实API。因为经验缺乏&#xff0c;之前调试之时&#xff0c;不得不在静态文件目录下直接修改文件&#xff0c;修复成功…...

    2024/4/20 5:00:20
  17. ionic3使用@angular/http 访问nodejs(koa2框架)服务不能返回数据

    cordova的http插件不能使用在browser上&#xff0c;所以当需要在browser上浏览时&#xff0c;需要使用angular/http 里的方法来访问nodejs服务。 如果出现服务端能够接收请求并相应&#xff0c;而客户端接收不到服务端返回的数据时&#xff0c;应该是出现跨域问题。 解决办法&a…...

    2024/4/21 4:21:49
  18. koa art-template 模板引擎

    一、常见模板引擎的性能对比 适用于 koa 的模板引擎选择非常多&#xff0c;比如 jade、ejs、nunjucks、art-template 等。 art-template是一个简约、超快的模板引擎。 它采用作用域预声明的技术来优化模板渲染速度&#xff0c;从而获得接近 JavaScript 极限的运行 性能&#xf…...

    2024/4/20 4:49:13
  19. 如何选择正确的Node框架:Express,Koa还是Hapi?

    摘要&#xff1a; Node三驾马车。 原文&#xff1a;如何选择正确的Node框架&#xff1a;Express&#xff0c;Koa还是Hapi&#xff1f;作者&#xff1a;一二三 Fundebug经授权转载&#xff0c;版权归原作者所有。 简介 Node.js是10年前首次推出的&#xff0c;目前它已经成为…...

    2024/4/27 12:19:00
  20. 使用koa+angular+mysql 完成了一个企业站

    使用koa、angular、mysql 完成了企业站整套前后端项目&#xff1a;https://github.com/LiangJingxuan/tradingAPP &#xff0c;我想要星星…...............................................................................................转载于:https://www.cnblogs.com/…...

    2024/4/21 4:21:46

最新文章

  1. RTMP 直播推流 Demo(二)—— 音频推流与视频推流

    音视频编解码系列目录&#xff1a; Android 音视频基础知识 Android 音视频播放器 Demo&#xff08;一&#xff09;—— 视频解码与渲染 Android 音视频播放器 Demo&#xff08;二&#xff09;—— 音频解码与音视频同步 RTMP 直播推流 Demo&#xff08;一&#xff09;—— 项目…...

    2024/5/2 11:28:41
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. C语言面试题之合法二叉搜索树

    合法二叉搜索树 实例要求 实现一个函数&#xff0c;检查一棵二叉树是否为二叉搜索树&#xff1b; 示例 1: 输入:2/ \1 3 输出: true 示例 2: 输入:5/ \1 4/ \3 6 输出: false 解释: 输入为: [5,1,4,null,null,3,6]。根节点的值为 5 &#xff0c;但是其右子节点值为 4 …...

    2024/4/30 11:24:24
  4. promise.all方式使用

    romise.all( ).then( ) 处理多个异步任务&#xff0c;且所有的异步任务都得到结果时的情况。 比如&#xff1a;用户点击按钮&#xff0c;会弹出一个弹出对话框&#xff0c;对话框中有两部分数据呈现&#xff0c;这两部分数据分别是不同的后端接口获取的数据。 弹框弹出后的初…...

    2024/5/1 13:17:42
  5. 增加网站搜索引擎排名的6个准则

    怎样提高网站排名首页 在竞争激烈的网络世界中&#xff0c;网站的排名对于吸引流量和提升曝光至关重要。登上搜索引擎结果页面的首页&#xff0c;意味着更多的曝光和点击率。以下是一些方法&#xff0c;可以帮助您提高网站在搜索引擎中的排名&#xff0c;让其跻身首页&#xf…...

    2024/5/1 13:47:30
  6. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/1 17:30:59
  7. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/30 18:14:14
  8. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  9. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/2 9:28:15
  10. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  12. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  16. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/2 9:07:46
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57