日期: 2021 年 4 月 13 日

Linux系统上实现定时重启Tomcat服务

因为使用阿里云部署服务器应用时,Tomcat服务经常由于内存不足出现OutOfMemoryError异常的情况。经常过几天就需要重启一次服务器,更要命的是不知道什么时候会由于内存不足导致无法访问,如果重启不及时严重影响系统体验。

为了解决上述问题,一方面是对tomcat配置做一些优化,网上有很多文章讲解如何优化Tomcat内存设置;另一方面就是写一个shell脚本,每天定时重启Tomcat服务。这里主要记录一下如何写shell脚本并且配置定时任务。本人使用的环境是阿里云Ubuntu服务器,以下配置在阿里云的Ubuntu服务器上能正常运行。

一、创建Shell脚本
新建一个tomcat.sh文件,输入以下内容:

#!/bin/bash
. /etc/profile
tomcatPath=”/usr/local/tomcat”
binPath=”$tomcatPath/bin”
echo “[info][$(date +’%F %H:%M:%S’)]正在监控tomcat,路径:$tomcatPath”
pid=`ps -ef | grep tomcat | grep -w $tomcatPath | grep -v ‘grep’ | awk ‘{print $2}’`
if [ -n “$pid” ]; then
echo “[info][$(date +’%F %H:%M:%S’)]tomcat进程为:$pid”
echo “[info][$(date +’%F %H:%M:%S’)]tomcat已经启动,准备使用shutdown命令关闭…”
$binPath”/shutdown.sh”
sleep 2
pid=`ps -ef | grep tomcat | grep -w $tomcatPath | grep -v ‘grep’ | awk ‘{print $2}’`
if [ -n “$pid” ]; then
echo “[info][$(date +’%F %H:%M:%S’)]使用shutdown命令关闭失败,准备kill进程…”
kill -9 $pid
echo “[info][$(date +’%F %H:%M:%S’)]kill进程完毕!”
sleep 1
else
echo “[info][$(date +’%F %H:%M:%S’)]使用shutdown命令关闭成功!”
fi
else
echo “[info][$(date +’%F %H:%M:%S’)]tomcat未启动!”
fi
echo “[info][$(date +’%F %H:%M:%S’)]准备启动tomcat…”
$binPath”/startup.sh”
脚本的逻辑比较简单,先查看tomcat进程是否存在,如果不存在则直接调用startup.sh命令启动tomcat,如果tomcat的进程存在则调用shutdown.sh命令停掉tomcat服务,有时会关闭失败,所以在检查一下tomcat进程时候还存在,如果存在就使用kill命令杀掉该进程,然后启动tomcat。
这里有一个地方需要注意,第二行代码(. /etc/profile)不能省掉,需要将环境变量引入到当前脚本环境中,要不然会导致启动定时任务时运行脚本失败,会报以下错误:

Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At least one of these environment variable is needed to run this program
二、修改文件权限
要让脚本可以执行,当然要把文件设置为可执行文件了。

chmod 777 tomcat.sh
三、建立定时任务
在控制台上输入使用crontab -e 命令进入编辑crontab脚本,*次输入该命令时需要选择编辑器。
%title插图%num

选择vim编辑器编辑就可,在文件后面增加一条任务。(我的脚本文件路径是:/home/script/tomcat.sh)

%title插图%num

然后保存并退出即可,接着使用crontab -l命令即可看到刚才新增的定时任务在列表里面。一般情况是直接生效,如果没有生效可以使用sudo service cron restart命令重启定时任务。

sudo service cron restart
四、定时任务描述语法
crontab中每一个定时任务的格式由6部分组成,分别是分钟、小时、天、月、星期以及命令,前5部分用来配置任务触发时机,中间使用空格隔开,如下:
minute hour day month dayofweek command

minute – 表示分钟,值的范围是从0到59的整数
hour – 表示小时,值的范围是从0到23的整数
day – 表示天,值的范围是从1到31的整数
month – 表示月,值的范围是从1到12的整数
dayofweek – 表示星期,值的范围是从0到6的整数 (0表示周日)
command – 需要执行的命令(/home/script/tomcat.sh > /home/script/shlog.txt表示执行tomcat.sh脚本,并且把结果日志打印到shlo.txt中)
时间部分除了使用估计数字以外还可以配合星号(*),逗号(,),斜杠(/),横杠(-)组合来表示其他意义。

1. 星号(*)
表示任意值,比如:

30 01 * * * command #每天的1:30执行命令
2. 逗号(,)
表示指定的时间,比如:

30 01 1,10,20 * * command #每月的1号、10号、20号的1:30分执行命令
3. 斜杠(/)
表示每隔多长时间,比如:

* */2 * * * command #每个2小时执行一次命令
4. 横杠(-)
表示连续时间,比如:

* 1-7/1 * * * command #凌晨1点-7点之前每隔一小时执行一次命令
五、其他
以上哪里写的不对或者有待改进,欢迎大家提意见,谢谢!
下载地址:tomcat.sh

生产环境如何重启tomcat

如果是系统安装,可以直接用服务管理脚本进行, 如ubuntu在/etc/init.d/tomcat8

主要思路是先用start-stop-daemon发停止信号结tomcat进程, 如果不能顺利结束, 再用kill杀掉进程.
使用方法是

$ sudo service tomcat8 stop
1
如果你自己用脚本管理,也可以参考这个思路, 贴上停止脚本片段供你参考:

stop)
log_daemon_msg “Stopping $DESC” “$NAME”

set +e
if [ -f “$CATALINA_PID” ]; then
start-stop-daemon –stop –pidfile “$CATALINA_PID” \
–user “$TOMCAT8_USER” \
–retry=TERM/20/KILL/5 >/dev/null
if [ $? -eq 1 ]; then
log_progress_msg “$DESC is not running but pid file exists, cleaning up”
elif [ $? -eq 3 ]; then
PID=”`cat $CATALINA_PID`”
log_failure_msg “Failed to stop $NAME (pid $PID)”
exit 1
fi
rm -f “$CATALINA_PID”
rm -rf “$JVM_TMP”
else
log_progress_msg “(not running)”
fi
log_end_msg 0
set -e
;;

十大云服务器服务商评测\排名

云服务器凭借着云计算所带来诸多优势成为了广泛关注的热点话题,作为云计算服务的重要组成部分,云服务器租用服务就是面向各类互联网用户提供综合业务能力的服务平台,它整合了传统意义上的互联网应用三大核心要素:计算、存储、网络。不过,要分辨云服务器和传统主机并非容易事,要选到好的云服务器更是难事。因此 本文系统的分享一下对 国内十大云服务器服务商感受

工具/原料

百度、十大云服务器服务商评测

方法/步骤

如何判断一家云服务器服务商的品质。可以从一下方面。

1、*佳TCO:品牌服务器、无需押金、按月支付、按需付费、*佳总体拥有成本。

2、全国覆盖:云计算节点分布于全国各骨干机房,BGP、双线、单线,客户可自主选择。

3、快速供应:资源池并内置多种操作系统和应用标准镜像,需求无论是一台还是百台、Windows还是Linux,均可实现瞬时供应和部署。

4、按需弹性伸缩:保护用户投资且无需对系统、环境和数据做任何变更,即可快速实现云服务器配置的按需扩容或减配。

5、高可靠和快速恢复:尊享国际品牌企业级服务器的高性能和可靠性,内置的监控、备机、快照、数据备份等服务确保故障的快速恢复。提供智能备份功能,将数据风险降到*低。

6、易用、易管理:提供多种管理工具,不懂技术也能用。

7、安全性:从硬件级别上实现故障和安全性的隔离,平台内置ARP攻击防护能力,分布式和规模化提升防DDOS攻击能力。

8、高性能:集群虚拟化,真正物理隔离,各云服务器独占内存等硬件资源确保高性能。 9、一键部署构件:联合国内外多家知名软件厂商的论坛、电子商务等功能型云服务器构件,无需任何安装和配置工作,实现软件系统的一键部署。

10、SLA:云服务器的24*7的专业运维服务团队,提供*高等级的SLA。

按照以上标准,国内云服务器得出一下排名

十大云服务器服务商评测\排名

易迈互联(易迈云):口碑良好、性价比高。

易迈互联,我国*大的综合性互联网服务商,旗下易迈云是我国*大的云服务器提供商,在业界以卓越的服务和顶级技术的着称。易迈互联云主机的云主机具有高性价、稳定性好、实用性强、承载用户量大等优势,在国内云服务器市场有口皆碑。易迈互联也是我国*大一站式解决方案专家,不仅提供云主机服务,也提供网站制作、SEO、域名注册和企业邮箱等服务,是当前国内*大、*强的一站式服务商。

北方数据中心:口碑过得去、性价比挺高。

北方云数据中心隶属秦*岛燕大正洋电子有限公司,北方云数据中心致力于为企业打开世界经济大门,投身信息数字化潮流提供*专业、*便捷、*全面的互联网服务。公司依托自身完善的服务体系,强大的技术支持力量以及丰富的经验、信息资源和市场运作实力,在短短几年时间里,迅速成长为业内*的知名企业。业务主要集中于企业互联网应用服务和电子商务应用服务。

新网互联:口碑可以、性价比中等

是北京新网互联科技有限公司拥有的互联网服务品牌,是中国互联网应用服务提供商,是移动寻址和企业移动营销服务领域的先行者,是目前互联网应用行业内唯一一家跨互联网应用和移动互联网应用服务的提供商。新网互联致力于为企业提供综合性网络应用服务,不断推出的基于互联网技术的创新应用产品,力求在为客户和合作伙伴创造价值的过程中实现自身价值。

Ucloud:口碑一般、性价比一般

UCloud云计算是国内技术与服务顶尖的基础云服务商,公司专注于基础云计算的产品研发与运营,是上海市云计算基地重点企业,国家工信部首批认证 通过的“可信云计算企业”。UCloud云计算平台已经为游戏、移动互联网、大数据、电子商务、SaaS等多个领域提供IT基础架构支撑,得益于业内* 的云计算技术和技术团队的专业经验,UCloud已成功为国内外上万家企业用户提供服务,大幅降低了用户使用IT基础设施的成本及技术门槛。Ucloud 主要面向游戏客户,相对于其他云主机服务商,其价格较高,稳定性不错。Ucloud适合预算充足的游戏及企业用户,不适合站长等个人用户。

西部数码:口碑中等、性价比可以。

是成都西维数码科技有限公司旗下知名网络服务品牌!成立于2002年,注册资本1000万元,主营信息存储与发布平台,服务项目包括:域名注册、虚拟主机、VPS、云主机、企业邮箱、主机租用、主机托管、CDN网站加速、网络服务等。

阿里云:口碑较差,性价比低

阿里云依托于阿里巴巴集团,通过对其丰富的网络资源进行整合,拥有自己的数据中心,是国内云主机中的佼佼者,目前名气*大。阿里云有外包的第三方客 服团队,用于支撑用户的售后服务及备案等增值服务。技术方面,支持自动宕机迁移,数据备份和回滚、系统性能报警;安全方面支持防DDoS功能、多用户隔离 等功能。目前,有北京、青岛、杭州、香港机房可选,多线BGP接入,缺点:硬盘I/O速度较差,硬盘不能直接扩容大小,必须新购买硬盘迁移数据。

缺点:性价比低、华而不实、管理后台复杂、喜欢搞钓鱼式营销。

腾讯云:口碑比较差,性价比低

腾讯又一个阻击型产品,于2013年9月上线,目前用户主要以游戏应用为主。腾讯云服务器使用公共平台操作系统,团队完全负责云主机的维护,并提供 丰富配置类型虚拟机,用户可以便捷地进行数据缓存、数据库处理与搭建web服务器等工作。腾讯对游戏和移动应用类客户提供了较强的扶持政策,比较适合这类 型的客户使用,但普通中小客户和中网站客户难以通过审批,腾讯提供的配套设备也不适合这部分客户使用。长远来说,腾讯云将是阿里云*有力的竞争对手,只是 现阶段来看,腾讯相对阿里云还有很大的差距需要追赶。
————————————————

原文链接:https://blog.csdn.net/shxzls/article/details/42521059

基于python的代码实现

基于python的代码实现

sen+mk python实现代码免费共享—–赶紧收藏吧
python开源社区公布了进行sen+mk趋势性检验的官方包,有关该官方包的主要内容详见:https://github.com/Coder2cdb/pyMannKendall,开源不易,有些人还收费查看,我觉得没必要,本次代码免费分享给大家,有需要的收藏点赞!

本次sen+mk python代码输入参数:多年影像的存储路径
path1=r”E:\2021-03-03—生态修复\吴起本地\NDVI_wuqi”
本次sen+mk python代码输出参数:结果影像存储路径
result_path=r”E:\小师妹\1990-2000_NDVI\result”
调用方法:
sen_mk_test(path1, result_path)
MannKendall输出参数说明


trend: tells the trend (increasing, decreasing or no trend)
h: True (if trend is present) or False (if trend is absence)
p: p-value of the significance test
z: normalized test statistics
Tau: Kendall Tau
s: Mann-Kendal’s score
var_s: Variance S
slope: Theil-Sen estimator/slope
intercept: intercept of Kendall-Theil Robust Line
”’

1.导入python包
#coding:utf-8
import numpy as np
import pymannkendall as mk
import os
import rasterio as ras

2.获取所有的影像路径,按照从小到大年份排序
path1=r”E:\2021-03-03—生态修复\吴起本地\NDVI_wuqi”
filepaths=[]
for file in os.listdir(path1):
filepath1=os.path.join(path1,file)
filepaths.append(filepath1)

3.读取所有的影像数据并拼接为一个numpy矩阵
#获取影像数量
num_images=len(filepaths)
#读取影像数据
img1=ras.open(filepaths[0])
#获取影像的投影,高度和宽度
transform1=img1.transform
height1=img1.height
width1=img1.width
array1=img1.read()
img1.close()

#读取所有影像
for path1 in filepaths[1:]:
if path1[-3:]==’tif’:
print(path1)
img2=ras.open(path1)
array2=img2.read()
array1=np.vstack((array1,array2))
img2.close()

nums,width,height=array1.shape

4.定义输出矩阵
#输出矩阵,无值区用-9999填充
slope_array=np.full([width,height],-9999.0000)
z_array=np.full([width,height],-9999.0000)
Trend_array=np.full([width,height],-9999.0000)
Tau_array=np.full([width,height],-9999.0000)
s_array=np.full([width,height],-9999.0000)
p_array=np.full([width,height],-9999.0000)
#只有有值的区域才进行mk检验,如果所有影像同一像元都为空,则不进行mk检验
c1=np.isnan(array1)
sum_array1=np.sum(c1,axis=0)
nan_positions=np.where(sum_array1==num_images)
positions=np.where(sum_array1!=num_images)
#输出总像元数量
print(“all the pixel counts are {0}”.format(len(positions[0])))

5.sen+mk检验
for i in range(len(positions[0])):
print(i)
x=positions[0][i]
y=positions[1][i]
mk_list1=array1[:,x,y]
trend, h, p, z, Tau, s, var_s, slope, intercept = mk.original_test(mk_list1)
if trend==”decreasing”:
trend_value=-1
elif trend==”increasing”:
trend_value=1
else:
trend_value=0
slope_array[x,y]=slope#senslope
s_array[x,y]=s
z_array[x,y]=z
Trend_array[x,y]=trend_value
p_array[x,y]=p
Tau_array[x,y]=Tau

6.定义写影像的函数
#写影像,包括宽度,高度,投影,波段名,矩阵
def writeImage(image_save_path,height1,width1,para_array,bandDes,transform1):
with ras.open(
image_save_path,
‘w’,
driver=’GTiff’,
height=height1,
width=width1,
count=1,
dtype=para_array.dtype,
crs=’+proj=latlong’,
transform=transform1,
) as dst:
dst.write_band(1,para_array)
dst.set_band_description(1,bandDes)
del dst

7.输出结果
#输出矩阵
all_array=[slope_array,Trend_array,p_array,s_array,Tau_array,z_array]
#输出路径
result_path=r”E:\2021-03-03—生态修复\吴起本地\result”
slope_save_path=os.path.join(result_path,”slope.tif”)
Trend_save_path=os.path.join(result_path,”Trend.tif”)
p_save_path=os.path.join(result_path,”p.tif”)
s_save_path=os.path.join(result_path,”s.tif”)
tau_save_path=os.path.join(result_path,”tau.tif”)
z_save_path=os.path.join(result_path,”z.tif”)
image_save_paths=[slope_save_path,Trend_save_path,p_save_path,s_save_path,tau_save_path,z_save_path]
band_Des=[‘slope’,’trend’,’p_value’,’score’,’tau’,’z_value’]
#逐个存储
for i in range(len(all_array)):
writeImage(image_save_paths[i], height1, width1, all_array[i], band_Des[i],transform1)

sen+mk代码汇总
”’
Created on 2021年4月11日

@author: SunStrong
”’
#coding:utf-8
import numpy as np
import pymannkendall as mk
import os
import rasterio as ras

def sen_mk_test(image_path,outputPath):

#image_path:影像的存储路径
#outputPath:结果输出路径

filepaths=[]
for file in os.listdir(path1):
filepath1=os.path.join(path1,file)
filepaths.append(filepath1)

#获取影像数量
num_images=len(filepaths)
#读取影像数据
img1=ras.open(filepaths[0])
#获取影像的投影,高度和宽度
transform1=img1.transform
height1=img1.height
width1=img1.width
array1=img1.read()
img1.close()

#读取所有影像
for path1 in filepaths[1:]:
if path1[-3:]==’tif’:
print(path1)
img2=ras.open(path1)
array2=img2.read()
array1=np.vstack((array1,array2))
img2.close()

nums,width,height=array1.shape
#写影像
def writeImage(image_save_path,height1,width1,para_array,bandDes,transform1):
with ras.open(
image_save_path,
‘w’,
driver=’GTiff’,
height=height1,
width=width1,
count=1,
dtype=para_array.dtype,
crs=’+proj=latlong’,
transform=transform1,
) as dst:
dst.write_band(1,para_array)
dst.set_band_description(1,bandDes)
del dst

#输出矩阵,无值区用-9999填充
slope_array=np.full([width,height],-9999.0000)
z_array=np.full([width,height],-9999.0000)
Trend_array=np.full([width,height],-9999.0000)
Tau_array=np.full([width,height],-9999.0000)
s_array=np.full([width,height],-9999.0000)
p_array=np.full([width,height],-9999.0000)
#只有有值的区域才进行mk检验
c1=np.isnan(array1)
sum_array1=np.sum(c1,axis=0)
nan_positions=np.where(sum_array1==num_images)

positions=np.where(sum_array1!=num_images)

#输出总像元数量
print(“all the pixel counts are {0}”.format(len(positions[0])))
#mk test
for i in range(len(positions[0])):
print(i)
x=positions[0][i]
y=positions[1][i]
mk_list1=array1[:,x,y]
trend, h, p, z, Tau, s, var_s, slope, intercept = mk.original_test(mk_list1)
”’
trend: tells the trend (increasing, decreasing or no trend)
h: True (if trend is present) or False (if trend is absence)
p: p-value of the significance test
z: normalized test statistics
Tau: Kendall Tau
s: Mann-Kendal’s score
var_s: Variance S
slope: Theil-Sen estimator/slope
intercept: intercept of Kendall-Theil Robust Line
”’

if trend==”decreasing”:
trend_value=-1
elif trend==”increasing”:
trend_value=1
else:
trend_value=0
slope_array[x,y]=slope#senslope
s_array[x,y]=s
z_array[x,y]=z
Trend_array[x,y]=trend_value
p_array[x,y]=p
Tau_array[x,y]=Tau

all_array=[slope_array,Trend_array,p_array,s_array,Tau_array,z_array]

slope_save_path=os.path.join(result_path,”slope.tif”)
Trend_save_path=os.path.join(result_path,”Trend.tif”)
p_save_path=os.path.join(result_path,”p.tif”)
s_save_path=os.path.join(result_path,”s.tif”)
tau_save_path=os.path.join(result_path,”tau.tif”)
z_save_path=os.path.join(result_path,”z.tif”)
image_save_paths=[slope_save_path,Trend_save_path,p_save_path,s_save_path,tau_save_path,z_save_path]
band_Des=[‘slope’,’trend’,’p_value’,’score’,’tau’,’z_value’]
for i in range(len(all_array)):
writeImage(image_save_paths[i], height1, width1, all_array[i], band_Des[i],transform1)

#调用
path1=r”E:\2021-03-03—生态修复\吴起本地\NDVI_wuqi”
result_path=r”E:\2021-03-03—生态修复\吴起本地\result”
sen_mk_test(path1, result_path)

 

云服务器哪个好,选择阿里云服务器的理由

很多用户在初次选择云服务器商家的时候,往往不知道怎么选择,因为国内云服务器商众多,阿里云服务器是一种高效,计算能力可弹性伸缩的云计算服务,现在是很多用户的上云首选,我们就来说说为什么上云要首选阿里云服务器。

选择阿里云服务器的理由
阿里云服务器是一种高效,计算能力可弹性伸缩的云计算服务,用户可根据业务需要,随时创建,修改,释放云服务器ECS配置。他运行于阿里云自研的飞天操作系统;具有计算性能可弹性伸缩,存储空间可扩展,网络配置可自定义的低耦合特性。实例规格,磁盘,网络,操作系统等作为云服务器ECS的组成部分,可像搭积木一样任意组合卸载;满足用户的多样化需求。

弹性
云计算*大的优势就在于弹性。目前,阿里云已拥有在数分钟内开出一家中型互联网公司所需要的IT资源的能力,这就能够保证大部分企业在云上所构建的业务都能够承受巨大的业务量压力。
计算弹性:
纵向的弹性,即单个服务器的配置变更。传统IDC模式下,很难做到对单个服务器进行变更配置。而对于阿里云,当您购买了云服务器或者存储的容量后,可以根据业务量的增长或者减少自由变更自己的配置。

横向的弹性
对于游戏应用或直播平台出现的高峰期,若在传统的IDC模式下,您根本无法立即准备资源;而云计算却可以使用弹性的方式帮助客户度过这样的高峰。当业务高峰消失时,您可以将多余的资源释放掉,以减少业务成本的开支。利用横向的扩展和缩减,配合阿里云的弹性伸缩,完全可以做到定时定量的伸缩,或者按照业务的负载进行伸缩。关于横向弹性的具体应用,详情请参考弹性伸缩。

存储弹性
阿里云拥有很强的存储弹性。当存储量增多时,对于传统的IDC方案,您只能不断去增加服务器,而这样扩展的服务器数量是有限的。在云计算模式下,将为您提供海量的存储,当您需要时可以直接购买,为存储提供*大保障。

网络弹性
云上的网络也具有非常大的灵活性。只要您购买了阿里云的专有网络,那么所有的网络配置与线下IDC机房配置可以是完全相同的,并且可以拥有更多的可能性。可以实现各个机房之间的互联互通,各个机房之间的安全域隔离,对于专有网络内所有的网络配置和规划都会非常灵活。

总之,对于阿里云的弹性而言,是计算的弹性、存储的弹性、网络的弹性以及您对于业务架构重新规划的弹性。您可以使用任意方式去组合自己的业务,阿里云都能够满足您的需求。

python简单游戏-反弹球

python简单游戏-反弹球
tkinter实现,直接贴上代码

from tkinter import*
import time
import random

class Ball:
def __init__(self,canvas,paddle,color):
self.canvas = canvas
self.paddle = paddle
self.id = canvas.create_oval(10,10,25,25,fill=color)
self.canvas.move(self.id,245,100)
starts = [-3,-2,-1,1,2,3]
random.shuffle(starts)
self.x = starts[0]
self.y = -3
self.canvas_height = self.canvas.winfo_height()
self.canvas_width = self.canvas.winfo_width()
self.hit_bottom = False

def hit_paddle(self,pos):
paddle_pos=self.canvas.coords(self.paddle.id)
if pos[2]>=paddle_pos[0] and pos[0]<=paddle_pos[2]:
if pos[3]>=paddle_pos[1] and pos[3]<=paddle_pos[3]:
return True
return False

def draw(self):
self.canvas.move(self.id,self.x,self.y)
pos = self.canvas.coords(self.id)
if pos[1] <= 0:
self.y = 4
if pos[3] >= self.canvas_height:
self.hit_bottom=True
if self.hit_paddle(pos)==True:
self.y=-4
if pos[0] <= 0:
self.x = 4
if pos[2] >= self.canvas_width:
self.x = -4

class Paddle:
def __init__(self,canvas,color):
self.canvas = canvas
self.id = canvas.create_rectangle(0,0,100,10,fill=color)
self.canvas.move(self.id,200,400)
self.x=0
self.canvas_width = self.canvas.winfo_width()
canvas.bind_all(‘<KeyPress-Left>’,self.turn_left)
canvas.bind_all(‘<KeyPress-Right>’,self.turn_right)
self.hit_bottom = False

def draw(self):
self.canvas.move(self.id,self.x,0)
pos = self.canvas.coords(self.id)
if pos[0] <= 0:
self.x = 0
elif pos[2] >= self.canvas_width:
self.x = 0

def turn_left(self,evt):
self.x=-7

def turn_right(self,evt):
self.x=7

tk = Tk()
tk.title(“反弹吧!球球”)
#tk.resizable(0,0)
tk.wm_attributes(“-topmost”,1)
canvas = Canvas(tk,width=650,height=600,bd=0,highlightthickness=0)
canvas.pack()
tk.update()

paddle=Paddle(canvas,’blue’)
ball = Ball(canvas,paddle,’red’)

while 1:
if ball.hit_bottom==False:
ball.draw()
paddle.draw()
tk.update_idletasks()
tk.update()
time.sleep(0.01)

%title插图%num

Python基础

Python基础(粗略整理,笔者会持续更新)

Python基础(粗略整理,笔者会持续更新)
输出函数print
print(520) # 可以输出数字
print(98.5)

print(“String”)
str4_ = “We all know that ‘A’ and ‘B’ are two capital letters.” # 输出字符串,没毛病,单双都可
print(3+1) # 输出带运算符表达式

#可以输入到指定的文件
fp = open(‘S:/test.txt’,’a+’) # 注意不是反斜杠。这个文件操作真的简单 a+ 以为不存在则创建,存在则追加
print(“hello world”,file=fp)# 注意要加file = *
fp.close

#不进行换行输出,写在一行???

转义字符
\t 制表符以四个字符为单位,可以理解为补齐空格,所以才能制表嘛。会出现1、2、3、4=个空格,即是否重开制表位问题。
原字符 在字符串前加个r或R
r”Hello\nworld” #字符串*后一个字符不能是反斜线
1
标识符和保留字
保留字查看的方法:

import keyword
print(keyword.kwlist)

标识符规则基本一致

变量的定义和使用
变量的定义:

变量名 = *

name = “miao”
1
变量的组成:
标识,类型和值分别可以通过内置函数id(),type(),以及其本身获得
所以都是引用变量呢

多次复制之后,变量名会指向新的空间。 没有被指向的会成为垃圾

数据类型
不带小数的都叫int

带小数的都叫float

浮点数的计算输出因为存储方式问题会存在结果容易出问题的问题。

用decimal()解决。

True和Fale分别是0 1

字符串,不解释

称为不可变的字符序列

‘单引号’ “双引号” “””“三引号””” 其中单双必须在一行,三可以随意

print(str,type(str)) # 直接逗号分隔。。。

类型转换
str( )函数

懂得都懂,可以讲括号里面的转成字符串

int( )

float( )

不多BB

input( )函数
enter = input(‘输入提示’)

类型转换
int(enter)

本运算
算术运算符
除法运算 /

1/2 = 0.5

整除运算

11//2 = 5

幂运算 **

2**2 = 4

一正一负的整除和取余

一正一负的整除向下取整

9//-4 = -3

余数 = 被除数-出书*商

9%-4 = -3 -9%4 = 3

赋值运算符
运算顺序从右到左
支持链式赋值
a=b=c=20 # 内存地址相同,懂得都懂

参数赋值
a+=30 #等一系列操作

系列解包赋值
a,b,c = 10,20,30
比较运算符
比较运算的结果时Bool类型
== 比较的是对象的值
is运算符比较的是对象的标识(地址,id)is not 不解释
Bool运算符
and -> &&
or ||
not !
in 在不在,可以~ 同样的还有 not in
s = “hello world”
“w” in s

程序的bool值
内置函数bool()

布尔值位False:False、数值()、None、空字符串、空列表、空元组、空字典、空集合
程序的组织结构
顺序、循环、选择

顺序结构
从上到下,依次执行

选择结构
根据bool值判断语句是否执行

单分支结构:

if num>=n : # (num>=n) 这么些也是可以的
print(“我说可以~”)

双分支结构:

if(num>=n)

多分支结构:
if num>n:
print(“ky”)
elif num==n:
print(“ky”)
else:
printf(“gun”)

分支结构之间允许出现嵌套

if else 简写,类似于三目运算符

x if condition else y

pass语句
语句什么都不做,只是一个占位符,用在语法上需要语句的地方
if(a>b):
pass # 用于构建语句

循环结构
range()函数
用于生成一个整数序列
创建方式:
# 一参,范围,但是不包括右区间点
r = rang(10) # 返回结果是一个迭代器对象,默认从0开始,默认相差1
list(r) # list 生成一个列表,用于存储迭代器对象序列

# 二参,指定了起始值
range(1,10)

# 三参,起始值,结束值,步长
range(1,10,2)

可以使用in和not in来进行bool运算
对象只储存三个值,占内存空间较小,很灵活,再用到range时才会产生相关的序列
while
while condition:

​ sentence

初始化变量
条件判断
执行语句
改变变量
for-in
for var in iterableOBJ:

​ sentence

通常用序列和字符串去作为可迭代对象

用不到变量的话可以用 _ 替代

for _ in range(5):
print(“wo tu le “)

break 和 continue
直接写就完了
break
continue

else 在循环中
else写在循环之后,如果循环执行过程中没有遇到break那么之心完毕之后会执行else
for item in range(5):
print(“Hello!”)
if(item==5):
break
else:
print(“word”)

列表—数组
id,type,value
列表的创建
方括号

list = [“hello”,”world”]

使用内置函数list

list = list([“hello”,”world”,321]) # 混合类型。。。

列表的特点
列表元素有序排列
索引银蛇*个数据
列表可以存放重复数据
任意数据类型混合存储
根据需要动态的分配和回收内存
list的元素获取
获取单个元素
通过index( )函数

list.index(“str”) # 返回*个匹配的索引,不存在则抛出异常
list(“str”,star,end) # 返回区间内的索引

通过索引去获得元素

list[2] # 正向获取 0~n-1 ,n为元素个数
list[-3] # 逆向获取 -n~-1

获取多个元素
切片操作,同样不包括stop

list_name[star:stop:step]

step默认为1,可简写为[star:stop]

step为正数,从star开始往后计算切片;为负数则从star往前挤蒜切片

step,步长,1无间隔,2间隔1……

遍历
for-in,天生的迭代器

列表元素的添加
append( ),追加

extend( ),在列表的末尾至少添加一个元素,对于列表的操作

instet( ),任意位置插入

切片,任意位置至少添加一个元素

list[1:] = list3 # 从*个元素开始切掉后面的,把list3接到后面

列表元素的删除
remove( )

一次删除一个元素
重复元素只删除*个
不存在元素抛出异常
pop( )

删除一个指定索引的元素
不存在抛出异常
没有指定索引删除*后一个,有出栈那味儿了
切片

一次至少删除一个呗
clear( )

清空表
del

删除表

del list # 删除对象

列表元素的修改
为指定的元素赋予一个新值
为指定切片赋予一个新值,切下来一块,补充上去,不在乎长度,自动扩充的
列表的排序操作
sort( )方法

默认进行升序排序,内部有参数reserve=True可以进行降序
内置函数sorted

会产生一个新的列表,需要一个变量去接一下
列表生成式
list = [i for i range (star,stop)]

i 的位置是表示列表元素的表达式
字典
Python内置的数据结构之一,与列表一样是一个可变序列
以键值对的方式存储数据,字典是一个无需的序列。 类似于Map
地点的实现原理类似于hashMap,由key到value的处理。经过hash函数,所以在内存上存储时无序的。
字典的创建
使用花括号

score = {“zhangsan”: 100 , “lisi”: 98, “wangwu”: 45}

使用内置函数dict( )

dict(name = “jack” , age = 20) # 注意,这里的键没有加引号

字典元素的获取
用[ ]来获取

score[“zhangsan”] # 如果字典中不存在对应的值则抛出keyError异常

用get( )

score.get(“zhangsan”) # 如果字典中不存在key,返回None
score.get(“zhaoliu”,bucunzaide) # 可以通过参数设置默认的value,以便指定key不存在时的返回值

字典元素的删除
del score[“zhangsan”]
score.clear() # 清空整个字典

字典元素的新增
score[“jack”] = 90 # 类似的还可以用来修改

获取字典视图的三个方法
keys( )获取字典中所有的key
values( )获取字典中所有的valus
items( ) 获取字典中所有的K V对
字典元素的遍历
for item in score:
print(score[item]) # item是Key

字典的特点
字典中的所有元素都是一个key-value对,key不允许重复,value可以重复
字典中的元素是无序的
字典中的key’必须是不可变对象
字典可以根据需求自动的伸缩
字典会浪费较大的内存,是一种空间换时间的数据结构
字典生成式
内置函数 zip()

list = zip(item,price) # 可迭代对象作为参数
print(list)

元组和集合
元组
Python的内置数据结构之以,是一个不可变序列
不可变序列与可变序列
不可变序列:包括字符串和元组,没有 增 删 改 的操作
可变序列:列表、字典和集合,可以对序列执行 增 删 改 操作,对象的地址不发生改变
元组的创建
小括号

t = (“PYTHON”,”hello”,90) t = (“PYTHON”,)

内置函数tuple( )

t = tuple((“PYTHON”,”hello”,90))
1
为什么设计这个东西?
在多任务环境下,同时操作对象时不需要加锁(根本改不了),使用在程序中尽量使用不可变序列
可以动对象的值但是不能动地址
集合
与列表和字典一样属于可变类型的序列
集合时没有value的字典,数据结构同样是hash表
集合的创建
大括号

s = {“Python”,”hello”,90}
1
使用内置函数set( )

s = set(range(5))
s = set({“Python”,”hello”,90})# 括号里面放可迭代的对象
1
2
集合元素的相关操作
新增
add( )一次点击加一个元素
update( ) 一次添加至少一个 括号里面放可迭代的对象
删除
remove( )一次删除一个指定元素,如果指定元素不存在就抛出KeyError
discard( )不抛出
pop( )删除任意元素,栈顶的?
clear( )懂得都懂
集合间的关系
是否相等用 == 和 != 判断
是否是自己 issubset( )
是否是超集 issuperset( )
是否有交集 isdisjoint( )
集合的数学操作
交集 intersection( ) 或者使用运算符 &
并集 union( ) 或者使用运算符 |
经过集合操作,地址不发生变化
差集 difference( ),或者是运算符 –
对称差集 symmetric_difference( )
集合生成式
{i*i for i range(1,10) }
1
字符串
字符串在python中时基本数据类型,是一个不可变的字符序列

字符串的驻留机制。。。

字符型的列表,后面的不做赘述,有需要直接查API

查询,大小写转换,内容对其劈分,各种判断(是否合法),替换与合并,比较,切片,格式化,编码与解码(用于网络传输)

函数
函数的创建和调用
def 函数名([输入参数]):

​ 函数体

​ return xxx

def calc(a,b):
c = a+b
return c
result = calc(10,20)

函数调用的参数传递
位置实参,根据形参对应的值进行参数传递

关键字实参,根据形参的名称景行参数传递

calc(b=10,a=10) # 怎么说呢,感觉很诡异
1
参数传值传的是地址,可以间接改变value

函数定义时,给形参设定默认值,只有与默认值不符的时候才需要传递实参

个数可变的我位置参数

定义函数时,无法确定传递的位置参数的个数时,使用可变的位置参数
使用*定义个数可变的位置参数
参数值会是一个元组
个数可变的关键字形参

结果为一个字典(),传的是键值对,关键字形参本身就是键值对er
函数的返回值
函数返回多个值时,结果为元组
变量的作用域
程序代码能访问该变量的区域
局部变量
在函数内定义并使用的变量,只在函数内部有效,局部变量使用global生命,这个变量就会成为全局变量
全局变量
函数体外定义的变量
BUG
面向对象

不同的数据类型属于不同的类
可以使用内置函数查看数据类型
对象
类的实例
类的创建
class student:
native_place = “taiyuan” # 直接卸载类里面的变量成为类属性
def __init__(self,name age): # 初始化方法
# 在类之外定义的称为函数,在类内部定义的成为方法
self.name = name
self.age = age
@staticmethod
def method():
print(“Static method”)
@classmethod
def cm(cls):
print(“Class method”)

对象的创建
stu1 = Student(“zhangsan”,18)
# 实例对象有类指针指向类对象
stu.eat()

类属性
在方法外定义的属性——在类体内直接定义
被所有的该类对象共享,当然,允许修改
类方法
使用@classmethod修饰的方法,使用类名可以直接访问

Student.cm( )

静态方法同上,修饰有所不同

动态的绑定属性和方法
stu2.gender = “girl” # 直接绑定到实例化的对象上
def show():
print(“show “)

stu2.show = show # 完成方法绑定

封装
在python中没有专门的修饰符用于属性的私有,如果该属性不希望在类对象的外部被访问,前面使用两个“ – “
但是仍然可以通过 Objname._ClassName__variable_name 访问
继承
如果一个类没有继承任何类,那么它默认继承object

定义子类是,必须在其构造函数中调用父类的构造函数

class Student(People):
def __init__(self,name,age,score):
super().__init__(name,age)
self,score = score

方法重写
在子类里面把父类的方法重新写一遍就完了呗,或i用super( ).
object
object类是所有类的父类,一次所有类都具有object类的属性和方法
内置函数dir( )可以查看指定对象的所有属性
_str() 同toString( )
多态
你不知道一个变量所引用的对象到底是什么类型,仍然可以通过这个变量调用方法,在运行中根据变量所引用对象的类型,动态地决定调用哪个对象中的方法

静态语言实现多态的三个条件

继承
方法重写
弗雷引用指向子类对象
动态语言崇尚”鸭子类型“,当看到一只鸟走起来像鸭子、游泳起来像鸭子,那么这只鸟就可以被称为鸭子。不关心对象是什么类型,到底是不是鸭子,只关心对象的行为。

只要有相关的方法就行,不在乎有没有继承关系。0

特殊方法和属性
obj.__ dict__ #获得类对象或者实例对象所有的属性,返回值是一个字典
obj.__class__# 获得对象所属的类
obj__base__ # 获得对象弗雷的一个元组
obj.__mro__ # 查看类的继承结构
obj.__subclasses__() # 返回子类的列表

def __init__(self,vars):
obj.var = var # 用于定义类成员变量及其初始化
__add__() # 运算符重载
__len__() # 定义如何计算长度

模块化编程
模块
Moudles

一个模块可以有很多个函数,类,语句什么的,一个py文件就是一个模块

方便其他程序和脚本的导入并使用

重用性,方便管理

导入
import math # 导入数学计算模块
from math import pi # 导入math中的pi

 

为什么选择阿里云服务器ECS?

阿里云ECS
云服务器(ECS)是阿里云提供的性能卓越、稳定可靠、弹性扩展的IaaS级别云计算服务。云服务器ECS免去了您采购IT硬件的前期准备,让您像使用水、电、天然气等公共资源一样便捷、高效地使用服务器,实现计算资源的即开即用和弹性伸缩。阿里云ECS持续提供创新型服务器,解决多种业务需求,助力您的业务发展。【企业级云服务器 1折特惠】高可靠+高可用的企业级独享实例,购买后可升降配,不怕业务急速增长,详情请戳:企业云服务器配置选型
%title插图%num

阿里云ECS优势:
1、无需自建机房,无需采购以及配置硬件设施。
2、分钟级交付,快速部署,缩短应用上线周期。
3、快速接入部署在全球范围内的数据中心和BGP机房。
4、成本透明,按需使用,支持根据业务波动随时扩展和释放资源。
5、提供GPU和FPGA等异构计算服务器、弹性裸金属服务器以及通用的x86架构服务器。
6、支持通过内网访问其他阿里云服务,形成丰富的行业解决方案,降低公网流量成本。
7、提供虚拟防火墙、角色权限控制、内网隔离、防病毒攻击及流量监控等多重安全方案。
8、提供性能监控框架和主动运维体系。
9、提供行业通用标准API,提高易用性和适用性。

【企业级云服务器 1折特惠】高可靠+高可用的企业级独享实例,购买后可升降配,不怕业务急速增长,详情请戳:企业云服务器配置选型

与普通的IDC机房或服务器厂商相比,阿里云ECS具有高可用性、安全性和弹性的优势:

一、高可用性
相较于普通的IDC机房以及服务器厂商,阿里云使用更严格的IDC标准、服务器准入标准以及运维标准,保证云计算基础框架的高可用性、数据的可靠性以及云服务器的高可用性。
阿里云提供的每个地域都存在多可用区。当您需要更高的可用性时,可以利用多可用区部署方案搭建主备服务或者双活服务。对于面向金融领域的两地三中心的解决方案,您也可以通过多地域和多可用区搭建出更高的可用性服务。其中包括容灾、备份等服务,阿里云都有非常成熟的解决方案。

二、安全性
阿里云通过了多种国际安全标准认证,包括ISO27001、MTCS等。安全合规性对于用户数据的私密性、用户信息的私密性以及用户隐私的保护力度都有非常严格的要求。
在网络建设方面,推荐您使用阿里云专有网络VPC。专有网络提供了稳定、安全、快速交付、自主可控的网络环境。对于传统行业以及未接触到云计算的行业和企业而言,借助专有网络混合云的能力和混合云的架构,将享受云计算所带来的技术红利。

1、丰富的网络产品体系
您只需进行简单配置,就可在当前的业务环境下,与全球所有机房进行串接,从而提高了业务的灵活性、稳定性以及业务的可发展性。

2、与自建的IDC机房互连
阿里云专有网络可以建立高速通道到您原有的IDC机房,形成混合云的架构。阿里云提供了多种混合云解决方案和丰富的网络产品,形成强大的网络功能,让您的业务更加灵活。

3、专有网络的稳定性
业务搭建在专有网络上,而网络的基础设施将会不停进化,使您每天都拥有更新的网络架构以及更新的网络功能,让您的业务永远保持在一个稳定的状态。

4、专有网络的安全性
面对互联网上不断的攻击流量,专有网络天然具备流量隔离以及攻击隔离的功能。业务搭建在专有网络上后,专有网络会为业务筑起*道防线。

三、弹性

云计算*大的优势在于弹性与灵活性。阿里云拥有在数分钟内创建出一家中型互联网公司所需要的IT资源的能力,保证了大部分企业在云上所构建的业务都能够承受巨大的业务量压力。
阿里云的弹性体现在计算的弹性、存储的弹性、网络的弹性以及您对于业务架构重新规划的弹性。您可以使用任意方式去组合业务,阿里云都能够满足您的需求。

1、计算弹性

Ⅰ、纵向的弹性。
即单台云服务器ECS的配置变更。普通IDC模式下,很难做到对单台服务器进行变更配置。而对于阿里云,当您购买了云服务器ECS或者存储的容量后,可以根据业务量的增减自由变更配置。

Ⅱ、横向的弹性。
对于游戏应用或直播平台出现的高峰期,若在普通的IDC模式下,您根本无法立即准备资源;而云计算却可以使用弹性的方式帮助您度过这样的高峰。当业务高峰消失时,您可以将多余的资源释放掉,以减少业务成本。利用横向的扩展和缩减,配合阿里云的弹性伸缩,完全可以做到定时定量的伸缩,或者按照业务的负载进行伸缩。

2、存储弹性
当数据量增多时,对于普通的IDC方案,您只能不断增加服务器,而这样扩展的服务器数量是有限的。阿里云为您提供海量的存储,您可以按需购买,为存储提供*大保障。

3、网络弹性
阿里云的专有网络VPC的网络配置与普通IDC机房配置可以是完全相同的,并且可以拥有更灵活的拓展性。在阿里云,您可以实现各个可用区(机房)之间的互联互通、安全域隔离以及灵活的网络配置和规划。

【企业级云服务器 1折特惠】高可靠+高可用的企业级独享实例,购买后可升降配,不怕业务急速增长,详情请戳:企业云服务器配置选型

%title插图%num

ECS产品架构
1、**实例:**等同于一台虚拟服务器,内含CPU、内存、操作系统、网络配置、磁盘等基础的计算组件。实例的计算性能、内存性能和适用业务场景由实例规格决定,其具体性能指标包括实例vCPU核数、内存大小、网络性能等。

2、**镜像:**提供实例的操作系统、初始化应用数据及预装的软件。操作系统支持多种Linux发行版和多种Windows Server版本。

3、**块存储:**块设备类型产品,具备高性能和低时延的特性。提供基于分布式存储架构的云盘以及基于物理机本地存储的本地盘。

4、**快照:**某一时间点一块云盘的数据状态文件。常用于数据备份、数据恢复和制作自定义镜像等。

5、**安全组:**由同一地域内具有相同保护需求并相互信任的实例组成,是一种虚拟防火墙,用于设置实例的网络访问控制。

6、网络:

专有网络(Virtual Private Cloud):逻辑上彻底隔离的云上私有网络。您可以自行分配私网IP地址范围、配置路由表和网关等。

经典网络:所有经典网络类型实例都建立在一个共用的基础网络上。由阿里云统一规划和管理网络配置。

原文链接:https://blog.csdn.net/weixin_43650075/article/details/106318733

企业进入云计算的路径_【云计算】为什么企业需要采用混合云战略?

混合云为那些希望拥有公共云的成本效益和私有云的安全性的企业提供了有效的解决方案。

迁移到云平台的企业通常面临在公共云还是私有云之间进行选择的难题。正确的方法是选择*适合其组织工作负载的方法,既可以是公共云也可以是私有云,甚至是两者的混合。

根据RightScale公司发布的2019年云计算状态报告:

58%的受访者表示混合云是他们的首选方法;
17%的人选择多个公共云;
只有10%的公司选择单一公共云。
那么什么是混合云呢?
混合云是公共云解决方案和私有云解决方案的组合,通常将资源编排为集成的基础设施环境。这样可以根据需求和成本的变化灵活地在私有云和公共云之间移动应用程序和数据工作负载,从而为企业提供更大的灵活性,并为数据部署和使用提供更多选择。

以下是混合云通常被认为是*好的策略以及企业应该在什么时候采用的原因。

考虑混合云策略
混合云策略将公共云环境和私有云环境结合在一起,使企业能够将两者的优点结合起来。

公共云
公共云环境可确保:

成本效益和可扩展性,这通常是部署多云的主要原因。
按需即时配置计算和存储资源,轻松应对快速的季节性增长。
仅通过云计算交付人工智能驱动的服务。
私有云
私有云环境提供:

使用内部部署服务器快速传递信息。因此,全球互联网连接的中断不会使业务运营陷入停顿。
高级别的自定义和合规性法规。
这些方法与混合云的组合部署以下面的形式为企业提供了扩展的好处:

灵活性
混合云解决方案使每个企业都可以灵活选择在任何特定情况下适合其需求的内容。因此,根据他们的要求,企业可以部署*佳的同类硬件、软件或服务以供使用。

此外,由于没有云计算供应商的锁定限制,因此企业无需在IT解决方案质量上做出妥协。混合方法允许灵活的策略驱动部署,从而可以基于安全性、性能和成本要求在公共云和私有云基础设施环境中分配工作负载。

可扩展性
对于服务或帐户的可扩展性,公共云解决方案是*佳途径。但这带来了固有的风险,即在公共云基础设施中敏感信息可能具有对外泄露的风险。

另一方面,私有云组件为敏感信息提供了*低的延迟和*佳的安全性。因此,混合云策略同时具有公共云的可扩展性和私有云环境的安全性。

安全性
私有云基础设施的使用为IT工作负载提供了专用资源,从而改善了其安全状态。因此,混合方法可满足企业的需求,这些企业不仅需要基于云计算解决方案提供的快速灵活的开发选项,还需要将某些解决方案保持在内部部署的安全性和控制力。

节约成本
据报道,64%的企业表示节省成本是2019年云计算计划的主要目标。然而,受访者还指出,其27%的云计算支出被浪费。

混合云方法可以在公共和私有云设置中节省成本。

使用私有云使企业可以坚持按需付费的模式。在这里,企业可以根据需要购买硬件、网络基础设施和软件许可,以及支付用于维护和管理解决方案的人员成本。此外,企业可以提供足够的安全性,并支付运行和冷却IT系统所需的成本。

公共云部署使企业可以在需求高峰时提供经济高效的IT资源,而不会产生资本支出和人工成本。IT专业人员可以帮助确定每种服务的*佳配置、服务提供商和位置,使企业的资源与需求相匹配,同时节省成本。

使用混合云策略,企业可以节省成本,同时以优化的方式在私有云中运行工作负载,而仅在需求高峰季节利用公共云来获得额外的容量。

混合云使企业可以根据自己的特定需求选择*佳的IT基础设施。通过将这两种云计算环境结合起来,企业将能够更有效地运营业务,同时还可以为客户提供各种产品和服务。这带来了高可靠性、更好的客户参与度,以及使企业能够通过根据其能力选择供应商,从而实现支出和技能多样化的能力,而不仅仅是避免供应商锁定。

何时选择混合云
尽管混合云带来了很多优势,但它并不是每个企业的*佳选择。例如,在具有严格IT预算的小型企业中,采用公共云方法可以更好地满足他们的利益。在考虑私有服务器的前期成本、维护、时间投资等因素后,他们发现公共云更适合。在这种情况下,选择混合云策略是没有意义的。

混合云面临的其他问题包括:
混合云可以面临更大的攻击面和数据遍历云计算网络,使其容易受到安全风险的影响。
在混合云的私有和公共之间来回传输的数据会造成延迟,因此对延迟敏感的应用程序不应该用于混合云。
建立和管理高效的混合云涉及一些复杂性,因为需要一种正确的方式可以将公共云和私有云互连。
需要高速运行的应用程序不适用于混合云。
因此,在公共云、私有云和混合云之间,企业通常在需要什么及其局限性之间进行选择。对于混合云,在以下情况下,它们被认为适用于:

为多个垂直行业提供服务的企业面临不同的IT安全性、法规和性能要求。
企业在不损害公共云或私有云技术的价值主张的前提下优化其云计算投资。
员工对IT工作负载及其基本特征有很好的了解,可以使复杂的混合解决方案正常工作。
保护其云计算解决方案是当务之急,企业愿意部署安全的专用网络。
如果企业愿意在云计算解决方案中进行此类更改和*佳投资,则混合云是企业的正确策略。这种定制云计算解决方案的设计牢记企业的历史、当前状态和未来,它提供了一种更实用的方法来满足企业的当前需求,并快速适应不断变化的业务需求。

混合云可以起到促进企业的数字化转型的催化剂的作用,使企业摆脱“一刀切”的云计算基础设施方法。那些愿意迅速适应不断变化的市场需求的企业将会保持*地位。
%title插图%num

Kubernetes 之上的架构应用

规划并运转一个兼顾可扩展性、可移植性和健壮性的运用是一件很有应战的事情,尤其是当体系杂乱度在不断增长时。运用或体系 本身的架构*大的影响着其运转办法、对环境的依靠性,以及与相关组件的耦合强弱。当运用在一个高度散布式的环境中运转时, 假如能在规划阶段遵从特定形式,在运维阶段恪守特定实践,就能够协助咱们更好的应对那些*常呈现的问题。 尽管软件规划形式和开发办法论能够协助咱们出产出满足恰当扩展性目标的运用,根底设施与运转环境也在影响着已布置体系的运 维操作。像 Docker、Kubernetes 这些技能能够协助团队打包、分发、布置以及在散布式环境中扩展运用。学习怎么*好的驾御这 些东西,能够协助你在办理运用时拥有更好的机动性、操控性和呼应能力。 在这份攻略里,咱们将探讨一些你或许想采用的准则和形式,它们能够协助你在 Kubernetes 上更好的扩展和办理你的作业集 (workloads)。尽管在 Kubernetes 上能够运转各式各样的作业集,可是你的不同挑选会影响运维难度和布置时的可选项。你怎么 架构和构建运用、怎么将效劳用容器打包、怎么装备生命周期办理以及在 kubernetes 上怎么操作,每一个点都会影响你的体会。 为可扩展性做运用规划 当开发软件时,你所选用的形式与架构会被许多需求所影响。关于 Kubernetes 来说,它*重要的特征之一就是要求运用拥有水平 扩展能力 – 经过调整运用副本数来分管负载以及提高可用性。这与笔直扩展不同,笔直扩展测验运用同样的参数将运用布置到性能 更强或更弱的效劳器上。 比方,微效劳架构是一种合适在集群中运转多个可扩展运用的软件规划形式。开发者们创立一些可组合的简略运用,它们经过杰出 界说的 REST 接口进行网络通讯,而不是像更杂乱的单体式运用那样经进程序内部机制通讯。将单体式运用拆分为多个独立的单一 功用组件后,咱们能够独立的扩展每个功用组件。许多之前一般存在于运用层的组合与杂乱度被搬运到了运维范畴,而它们刚好可 以被像 Kubernetes 这样的渠道搞定。 比特定的软件形式更进一步,云原生(cloud native)运用在规划之初就有一些额定的考量。云原生运用是遵从了微效劳架构形式 的程序,拥有内置的可康复性、可观测性和可办理性,专门用于适应云集群渠道供给的环境。 举例来说,云原生运用在被创造出时都带有健康度目标数据,当某个实例变得不健康时,渠道能够依据目标数据来办理实例的生命 周期。这些目标发生(也能够被导出)稳定的遥控数据来给运维人员告警,让他们能够依据这些数据做决策。运用被规划成能够应 付常规的重启、失败、后端可用性改变以及高负载等各种情况,而不会损坏数据或许变得无法呼应。 遵从 “12 规律运用”运用理论 在创立预备跑在云上的 web 运用时,有一个盛行的办法论能够帮你关注到那些*重要的特征:“12 规律运用理论”( Twelve- Factor App)。它*初被编写出来,是为了协助开发者和运维团队了解一切被规划成在云环境运转的 web 效劳的共有核心特征,而 关于那些将在 Kubernetes 这种集群环境中运转的运用,这个理论也十分适用。尽管单体式运用能够从这些主张中获益,围绕这些 准则规划的微效劳架构运用也会作业的十分好。 “12 规律”的一份简略摘要: 基准代码(Codebase): 将你的一切代码都放在版别操控体系中(比方 Git 或许 Mercurial)。被布置的内容彻底由基准代码决 定。 依靠(Dependencies):运用依靠应该由基准代码全部显式办理起来,无论是用 vendor(指依靠代码和运用代码保存在一同),还 是经过可由包办理软件解析装置的依靠装备文件的办法。 装备(Config):把运用装备参数与运用本身分开来,装备应该在布置环境中界说,而不是被嵌入到运用本身。 后端效劳(Backing Services):本地或长途的依靠效劳都应该被笼统为可经过网络拜访的资源,衔接细节应该在装备中界说。 构建、发布、运转(Build, release, run):运用的构建阶段应该彻底与发布、运维阶段区别开来。构建阶段从运用源码创立出一 个可履行包,发布阶段担任把可履行包和装备组合起来,然后在运转阶段履行这个发布版别。 进程(Processes):运用应该由不依靠任何本地状况存储的进程完结。状况应该被存储在第 4 个规律描绘的后端效劳中。 端口绑定(Port binding):运用应该原生绑定端口和监听衔接。一切的路由和恳求转发作业应该由外部处理。 并发(Concurrency):运用应该依靠于进程模型扩展。只需同时运转多份运用(或许散布在不同效劳器上),就能完结不调整运用 代码扩展的意图。 易处理(Disposability):进程应该能够被快速发动、高雅中止,而不发生任何严峻的副作用。 开发环境与线上环境等价(Dev/prod parity):你的测验、预发布以及线上环境应该尽或许共同而且坚持同步。环境间的差异有可 能会导致兼容性问题和未经测验的装备突然呈现。 日志(Logs):运用应该将日志输出到规范输出(stdout),然后由外部效劳来决定*佳的处理办法。 办理进程(Admin processes):一次性办理进程应该和主进程代码一同发布,依据某个特定的发布版别运转。 依照“12 规律”所供给的攻略,你能够运用彻底适用于 Kubernetes 运转环境的模型来创立和运转运用。“12 规律”鼓舞开发者 们专心于他们运用的首要职责,考虑运维条件以及组件间的接口规划,并运用输入、输出和规范进程办理功用,终究以可被预见的 办法将运用在 Kubernetes 中跑起来。 容器化运用组件 Kubernetes 运用容器在集群节点上运转阻隔的打包运用程序。要在 Kubernetes 上运转,你的运用有必要被封装在一个或许多个容器 镜像中,并运用 Docker 这样的容器运转时履行。尽管容器化你的组件是 Kubernetes 的要求之一,但其实这个进程也协助强化了 刚刚谈到的“12规律运用”里的许多准则,然后让咱们能够简略的扩展和办理运用。 举例来说,容器供给了运用环境与外部宿主机环境之间的阻隔,供给了一个依据网络、面向效劳的运用间通讯办法,而且一般都是 从环境变量读取装备、将日志写到规范输出与规范错误输出中。容器本身鼓舞依据进程的并发策略,而且能够经过坚持独立扩展性 和绑缚运转时环境来协助坚持开发/线上环境共同性(#10 Dev/prod parity)。这些特性让你能够顺畅打包运用,然后顺畅的在 Kubernetes 上运转起来。 容器优化准则 由于容器技能的灵活性,咱们有许多不同种封装运用的办法。可是在 Kubernetes 环境中,其间一些办法比其他办法作业的更好。 镜像构建(image building),是指你界说运用将怎么在容器里被设置与运转的进程,*大多数关于“怎么容器化运用”的*佳实 践都与镜像构建进程有关。一般来说,坚持镜像尺度小以及可组合会带来许多优点。在镜像晋级时,经过坚持构建步骤可办理以及 复用现有镜像层,被优化过尺度的的镜像能够减少在集群中发动一个新容器所需求的时刻与资源。 当构建容器镜像时,尽*大努力将构建步骤与终究在出产环境运转的镜像区别开来是一个好的开端。构建软件一般需求额定的工 具、花费更多时刻,而且会出产出在不同容器里体现不同、或是在终究运转时环境里根本不需求的内容。将构建进程与运转时环境 清晰分开的办法之一是运用 Docker 的“多阶段构建(multi-stage builds)” 特性。多阶段构建装备答应你为构建阶段和运转阶 段设置不同的根底镜像。也就是说,你能够运用一个装置了一切构建东西的镜像来构建软件,然后将结果可履行软件包复制到一个 精简过的、之后每次都会用到的镜像中。 有了这类功用后,依据*小化的父镜像来构建出产环境镜像一般会是个好主意。假如你想彻底防止由 ubuntu:16.04(该镜像包含了 一个完好的 Ubuntu 16.04 环境)这类 “Linux 发行版” 风格父镜像带来的臃肿,你能够测验用 scratch – Docker 的*简根底 镜像 – 来构建你的镜像。不过 scratch 根底镜像缺了一些核心东西,所以部分软件或许会由于环境问题而无法运转。别的一个方 案是运用 Alpine Linux 的 alpine 镜像,该镜像供给了一个轻量可是拥有完好特性的 Linux 发行版。它作为一个稳定的*小根底 环境获得了广泛的运用。 关于像 Python 或 Ruby 这种解说型编程言语来说,上面的例子会稍有改变。由于它们不存在“编译”阶段,而且在出产环境运转 代码时一定需求有解说器。不过由于咱们依然寻求精简的镜像,所以 Docker Hub 上仍是有许多依据 Alpine Linux 构建的各言语 优化版镜像。关于解说型言语来说,运用更小镜像带来的优点和编译型言语差不多:在开端正式作业前,Kubernetes 能够在新节点 上快速拉取到一切有必要的容器镜像。 在 Pod 和“容器”之间做挑选 尽管你的运用有必要被“容器”化后才能在 Kubernetes 上跑起来,但 pods(译注:由于 pod、service、ingress 这类资源名称不 合适翻译为中文,此处及后面均运用英文原文) 才是 Kubernetes 能直接办理的*小笼统单位。pod 是由一个或更多严密相关的容 器组合在一同的 Kubernetes 目标。同一个 pod 里的一切容器共享同一生命周期且作为一个独立单位被办理。比方,这些容器总是 被调度到同一个节点上、一同被发动或中止,同时共享 IP 和文件体系这类资源。 一开端,找到将运用拆分为 pods 和容器的*佳办法会比较困难。所以,了解 Kubernetes 是怎么处理这些目标,以及每个笼统层 为你的体系带来了什么变得十分重要。下面这些事项能够协助你在运用这些笼统概念封装运用时,找到一些自然的鸿沟点。 寻觅自然开发鸿沟是为你的容器决定有效范围的手段之一。假如你的体系采用了微效劳架构,一切容器都经过杰出规划、被频频构 建,各自担任不同的独立功用,而且能够被经常用到不同场景中。这个程度的笼统能够让你的团队经过容器镜像来发布改变,然后 将这个新功用发布到一切运用了这个镜像的环境中去。运用能够经过组合许多容器来构建,这些容器里的每一个都完结了特定的功 能,可是又不能独立成事。 与上面相反,当考虑的是体系中的哪些部分能够从独立办理中获益*多时,咱们常常会用 pods。Kubernetes 运用 pods 作为它面 向用户的*小笼统,因而它们是 Kubernetes API 和东西能够直接交互与操控的*原生单位。你能够发动、中止或许重启 pods,或 者运用依据 pods 建立的更高级别笼统来引进副本集和生命周期办理这些特性。Kubernetes 不答应你独自办理一个 Pod 里的不同 容器,所以假如某些容器能够从独立办理中获得优点,那么你就不应该把它们分到到一个组里。 由于 Kubernetes 的许多特性和笼统概念都直接和 pods 打交道,所以把那些应该被一同扩缩容的东西绑缚到一个 pod 里、应该被 分开扩缩容的分到不同 pod 中是很有道理的。举例来说,将前端 web 效劳器和运用效劳放到不同 pods 里让你能够依据需求独自 对每一层进行扩缩容。不过,有时候把 web 效劳器和数据库适配层放在同一个 pod 里也说得过去,假如那个适配器为 web 效劳器 供给了它正常运转所需的基本功用的话。 经过和支撑性容器绑缚到一同来增强 Pod 功用 了解了上面这点后,究竟什么类型的容器应该被绑缚到同一个 pod 里呢?一般来说,pod 里的主容器担任供给 pod 的核心功用, 可是咱们能够界说附加容器来修正或许扩展那个主容器,或许协助它适配到某个特定的布置环境中。 比方,在一个 web 效劳器 pod 中,或许会存在一个 Nginx 容器来监听恳求和托管静态内容,而这些静态内容则是由别的一个容器 来监听项目变动并更新的。尽管把这两个组件打包到同一个容器里的主意听上去不错,可是把它们作为独立的容器来完结是有许多 优点的。nginx 容器和内容拉取容器都能够独立的在不同情形中运用。它们能够由不同的团队保护并别离开发,到达将行为通用化 来与不同的容器协同作业的意图。 Brendan Burns 和 David Oppenheimer 在他们关于“依据容器的散布式体系规划形式”的论文中界说了三种打包支撑性容器的首要 形式。它们代表了一些*常见的将容器打包到 pod 里的用例: Sidecar(边车形式):在这个形式中,次要容器扩展和增强了主容器的核心功用。这个形式触及在一个独立容器里履行非规范或工 具功用。举例来说,某个转发日志或许监听装备值改动的容器能够扩展某个 pod 的功用,而不会改动它的首要关注点。 Ambassador(大使形式):Ambassador 形式运用一个援助性容器来为主容器完结长途资源的笼统。主容器直接衔接到 Ambassador 容器,而 Ambassador 容器反过来衔接到或许很杂乱的外部资源池 – 比方说一个散布式 Redis 集群 – 并完结资源笼统。主容器可 以完结衔接外部效劳,而不必知道或许关心它们实际的布置环境。 Adaptor(适配器形式):Adaptor 形式被用来翻译主容器的数据、协议或是所运用的接口,来与外部用户的希望规范对齐。 Adaptor 容器也能够统一化中心效劳的拜访入口,即便它们效劳的用户本来只支撑互不兼容的接口规范。 运用 Configmaps 和 Secrets 来保存装备 尽管运用装备能够被一同打包进容器镜像里,可是让你的组件在运转时坚持可被装备能更好支撑多环境布置以及供给更多办理灵活 性。为了办理运转时的装备参数,Kubernetes 供给了两个目标:ConfigMaps 与 Secrets。 ConfigMaps 是一种用于保存可在运转时暴露给 pods 和其他目标的数据的机制。保存在 ConfigMaps 里的数据能够经过环境变量使 用,或是作为文件挂载到 pod 中。经过将运用规划成从这些位置读取装备后,你能够在运用运转时运用 ConfigMaps 注入装备,并 以此来修正组件行为而不必重新构建整个容器镜像。 Secrets 是一品种似的 Kubernetes 目标类型,它首要被用来安全的保存敏感数据,并依据需求挑选性的的答应 pods 或是其他组 件拜访。Secrets 是一种便利的往运用传递敏感内容的办法,它不必像一般装备相同将这些内容用纯文本存储在能够被轻易拜访到 的当地。从功用性上讲,它们的作业办法和 ConfigMaps 简直彻底共同,所以运用能够用彻底相同的办法从二者中获取数据。 ConfigMaps 和 Secrets 能够帮你防止将装备内容直接放在 Kubernetes 目标界说中。你能够只映射装备的键名而不是值,这样可 以答应你经过修正 CongfigMap 或 Secret 来动态更新装备。这使你能够修正线上 pod 和其他 kubernetes 目标的运转时行为,而 不必修正这些资源本身的界说。 完结“安排妥当检测(Readiness)”与“存活检测(Liveness)”探针 Kubernetes 包含了十分多用来办理组件生命周期的开箱即用功用,它们能够保证你的运用始终坚持健康和可用状况。不过,为了利 用好这些特性,Kubernetes 有必要要理解它应该怎么监控和解说你的运用健康情况。为此,Kubernetes 答应你界说“安排妥当检测探针 (Readiness Probe)”与“存活检测探针(Liveness Probe)”。 “存活检测探针”答应 Kubernetes 来断定某个容器里的运用是否处于存活与运转状况。Kubernetes 能够在容器内周期性的履行一 些指令来检查基本的运用行为,或许能够往特定地址发送 HTTP / TCP 网络恳求来判断进程是否可用、呼应是否符合预期。假如某 个“存活探测指针”失败了,Kubernetes 将会重启容器来测验康复整个 pod 的功用。 “安排妥当检测探针”是一个类似的东西,它首要用来判断某个 Pod 是否现已预备好承受恳求流量了。在容器运用彻底安排妥当,能够承受 客户端恳求前,它们或许需求履行一些初始化进程,或许当接到新装备时需求重新加载进程。当一个“安排妥当检测探针”失败后, Kubernetes 会暂停往这个 Pod 发送恳求,而不是重启它。这使得 Pod 能够完结本身的初始化或许保护使命,而不会影响到整个组 的整体健康状况。 经过结合运用“存活检测探针”与“安排妥当检测探针”,你能够操控 Kubernetes 自动重启 pods 或是将它们从后端效劳组里剔除。 经过装备根底设施来使用好这些特性,你能够让 Kubernetes 来办理运用的可用性和健康状况,而无需履行额定的运维作业。 运用 Deployments 来办理扩展性与可用性 在早些时候讨论 Pod 规划根底时,咱们说到其他 Kubernetes 目标会建立在 Pod 的根底上来供给更高级的功用。而 deployment 这个复合目标,或许是被界说和操作的*多次的 Kubernetes 目标。 Deployments 是一种复合目标,它经过建立在其他 Kubernetes 根底目标之上来供给额定功用。它们为一类名为 replicasets 的中 间目标添加了生命周期办理功用,比方能够施行“翻滚晋级(Rolling updates)”、回滚到旧版别、以及在不同状况间转化的能 力。这些 replicasets 答应你界说 pod 模板并依据它快速拉起和办理多份依据这个模板的副本。这能够协助你便利的扩展根底设 施、办理可用性要求,并在毛病发生时自动重启 Pods。 这些额定特性为相对简略的 pod 笼统供给了一个办理框架和自我修复能力。尽管你界说的作业集终究仍是由 pods 单元来承载,但 是它们却不是你一般应该*多装备和办理的单位。相反,当 pods 由 deployments 这种更高级目标装备时,应该把它们当做能够稳 定运转运用的根底构建块来考虑。 创立 Services 与 Ingress 规矩来办理到运用层的拜访 Deployment 答应你装备和办理可交换的 Pod 集合,以扩展运用以及满足用户需求。可是,怎么将恳求流量路由到这些 pods 则是 破例一码事了。鉴于 pods 会在翻滚晋级的进程中被换出、重启,或许由于机器毛病发生搬运,之前被分配给这个运转组的网络地 址也会发生改变。Kubernetes services 经过保护动态 pods 资源池以及办理各根底设施层的拜访权限,来协助你办理这部分杂乱 性。 在 Kuberntes 里,services 是操控流量怎么被路由到多批 pods 的机制。无论是为外部客户转发流量,仍是办理多个内部组件之 间的衔接,services 答应你来操控流量该怎么活动。然后,Kubernetes 将更新和保护将衔接转发到相关 pods 的一切必需信息, 即使环境或网络条件发生改变也相同。 从内部拜访 Services 为了有效的运用 services,你首要应该断定每组 pods 效劳的目标用户是谁。假如你的 service 只会被布置在同一个 Kubernetes 集群的其他运用所运用,那么 ClusterIP 类型答应你运用一个仅在集群内部可路由的固定 IP 地址来拜访一组 pods。一切布置在 集群上的目标都能够经过直接往这个 service IP 地址发送恳求来与这组 pod 副本通讯。这是*简略的 service 类型,很合适在 内部运用层运用。 Kubernetes 供给了可选的 DNS 插件来为 services 供给姓名解析效劳。这答应 pods 和其他目标能够运用域名来代替 IP 地址进 行通讯。这套机制不会显著改动 service 的用法,但依据域名的标识符能够使衔接组件和界说效劳间交互变得更简略,而不需求提 前知道 service IP 地址。 将 Services 向公网开放 假如你的运用需求被公网拜访,奇迹狐网站那么 “负载均衡器(load balancer)”类型的 service 一般会是你的*佳挑选。它会运用运用所 在的特定云供给商 API 来装备一个负载均衡器,由这个负载均衡器经过一个公网 IP 来效劳一切到 service pods 的流量。这种方 式供给了一个到集群内部网络的可控网络通道,然后将外部流量引进到你的 service pods 中。 由于“负载均衡器”类型会为每一个 service 都创立一个负载均衡器,因而用这种办法来暴露 Kubernetes 效劳或许会有些昂贵。 为了协助缓解这个问题,咱们能够运用 Kubernetes ingress 目标来描绘怎么依据预定规矩集来将不同类型的恳求路由到不同 services。例如,发往 “example.com” 的恳求或许会被指向到 service A,而往 “sammytheshark.com” 的恳求或许会被路由 到 service B。Ingress 目标供给了一种描绘怎么依据预界说形式将混合恳求流别离路由到它们的目标 services 的办法。 Ingress 规矩有必要由一个 ingress controller 来解析,它一般是某种负载均衡器(比方 Nginx),以 pod 的办法布置在集群中, 它完结了 ingress 规矩并依据规矩将流量分发到 Kubernetes serices 上。目前,ingress 资源目标界说依然处于 beta 阶段,但 是市面上现已有好几个能作业的具体完结了,它们能够协助集群一切者*小化需求运转的外部负载均衡器数量。

Kubernetes 之上的架构应用 运用声明式语法来办理 Kubernetes 状况 Kubernetes 在界说和办理布置到集群的资源方面供给了很大灵活性。运用 kubectl 这样的东西,你能够指令式的界说一次性资源 并将其快速布置到集群中。尽管在学习 Kubernetes 阶段,这个办法关于快速布置资源或许很有用,但这种办法也存在许多缺陷, 不合适长周期的出产环境办理。 指令式办理办法的*大问题之一就是它不保存你往集群布置过的改变记录。这使得毛病时康复和跟踪体系内运维改变操作变得十分 困难,乃至不或许。 走运的是,Kubernetes 供给了别的一种声明式的语法,它答应你运用文本文件来完好界说资源,并随后运用 kubectl 指令运用这 些装备或更改。将这些装备文件保存在版别操控体系里,是监控改变以及与你的公司内其他部分的审理进程集成的一种简略办法。 依据文件的办理办法也让将已有形式适配专卖网站到新资源时变得简略,只需求复制然后修正现有资源界说即可。将 Kubernetes 目标界说 保存在版别化目录里答应你保护集群在每个时刻节点的希望集群状况快照。当你需求进行毛病康复、搬迁,或是追踪体系里某些意 料之外的改变时,这些内容的价值是不可估量的。 总结 办理运转运用的根底设施,并学习怎么*好的使用这些现代化编排体系供给的特性,这些事情或许会令人望而生畏。可是,只有当 你的开发与运维进程与这些东西的构建概念共同时,Kubernetes 体系、容器技能供给的优势才能更好的体现出来。遵从 Kubernetes *擅长的那些形式来架构你的体系,以及了解特定功用怎么能缓解由高度杂乱的布置带来的应战,能够协助改进你运转 渠道时的体会。

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速