Docker Swarm 是 Docker 官方提供的容器编排和集群管理工具,用于构建和管理多个 Docker 容器节点组成的集群。通过 Docker Swarm,用户可以将多台主机(物理机或虚拟机)组成一个统一的集群,从而实现容器的集中调度、部署和管理。
关键特性包括:
总之,Docker Swarm 提供了一种简单但强大的方式来管理容器化应用程序的部署和扩展,在生产环境中被广泛应用于构建容器集群,并为应用程序的高可用性和可扩展性提供支持。
[root@centos-7 ~]# docker swarm --help
Usage: docker swarm COMMAND
Manage Swarm
Commands:
ca Display and rotate the root CA
init Initialize a swarm
join Join a swarm as a node and/or manager
join-token Manage join tokens
leave Leave the swarm
unlock Unlock swarm
unlock-key Manage the unlock key
update Update the swarm
Run 'docker swarm COMMAND --help' for more information on a command.
可以看到其中有一个 init的命令,这就是初始化一个Swarm,我们再看看这个init的参数:
[root@centos-7 ~]# docker swarm init --help
Usage: docker swarm init [OPTIONS]
Initialize a swarm
Options:
--advertise-addr string Advertised address (format: <ip|interface>[:port])
--autolock Enable manager autolocking (requiring an unlock
key to start a stopped manager)
--availability string Availability of the node
("active"|"pause"|"drain") (default "active")
--cert-expiry duration Validity period for node certificates
(ns|us|ms|s|m|h) (default 2160h0m0s)
--data-path-addr string Address or interface to use for data path traffic
(format: <ip|interface>)
--data-path-port uint32 Port number to use for data path traffic (1024 -
49151). If no value is set or is set to 0, the
default port (4789) is used.
--default-addr-pool ipNetSlice default address pool in CIDR format (default [])
--default-addr-pool-mask-length uint32 default address pool subnet mask length (default 24)
--dispatcher-heartbeat duration Dispatcher heartbeat period (ns|us|ms|s|m|h)
(default 5s)
--external-ca external-ca Specifications of one or more certificate signing
endpoints
--force-new-cluster Force create a new cluster from current state
--listen-addr node-addr Listen address (format: <ip|interface>[:port])
(default 0.0.0.0:2377)
--max-snapshots uint Number of additional Raft snapshots to retain
--snapshot-interval uint Number of log entries between Raft snapshots
(default 10000)
--task-history-limit int Task history retention limit (default 5)
可以看到它有很多的参数,其中第一个就是将本机的地址添加进去,让自己成为一个Manager节点,这样其它的节点都可以知道这个节点的存在。
在此之前我们应该先知道自己本机的ip,以便于--advertise-addr string 这个参数使用,查看本机ip:
然后就可以初始化Manager节点:
[root@centos-7 ~]# docker swarm init --advertise-addr=192.168.0.108
Swarm initialized: current node (sz7bfcmk637qhqfvzqhdnk3t2) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-0zzpk3xqq2ykb5d5jcd6hqeimckhrg5qu82xs7nw2wwnwyjmzg-9tmof9880m9r92vz5rygaa42e 192.168.0.108:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
可以看到已经创建了一个swarm manager节点--advertise-addr参数的值192.168.0.108是自己的ip,相当于将自己加入到swarm中。它也说明了其它worker加入的方式。
另外再开启一台虚拟机,将这台机器加入到swarm中成为worker节点:
[root@localhost ~]# docker swarm join --token SWMTKN-1-0zzpk3xqq2ykb5d5jcd6hqeimckhrg5qu82xs7nw2wwnwyjmzg-9tmof9880m9r92vz5rygaa42e
192.168.0.108:2377
This node joined a swarm as a worker.
可以看到已经成功了。
注意的是查看节点状态只能在manager节点那台机器上查看,普通节点无法执行查看命令:
[root@centos-7 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
sz7bfcmk637qhqfvzqhdnk3t2 * centos-7 Ready Active Leader 19.03.5
89tezea9ltn6mqek7b48gtve7 localhost.localdomain Ready Active 18.09.7
可以看到有两台机器了。
上面我们已经将节点创建好了,现在可以在这些节点上创建容器了,那么就需要看看docker service 的帮助信息:
[root@centos-7 ~]# docker service --help
Usage: docker service COMMAND
Manage services
Commands:
create Create a new service
inspect Display detailed information on one or more services
logs Fetch the logs of a service or task
ls List services
ps List the tasks of one or more services
rm Remove one or more services
rollback Revert changes to a service's configuration
scale Scale one or multiple replicated services
update Update a service
Run 'docker service COMMAND --help' for more information on a command.
可以看到有create这个命令,可以这样理解,docker server create 相当于docker run 就是创建容器,只不过在swarm中是不同的表现方式。
[root@centos-7 docker]# docker service create --name demo busybox /bin/sh -c "while true; do sleep 3600; done "
image busybox:latest could not be accessed on a registry to record
its digest. Each node will access busybox:latest independently,
possibly leading to different nodes running different
versions of the image.
edqgwqjka7ceyym9tg4gr9uim
overall progress: 1 out of 1 tasks
1/1: running
verify: Service converged
可以查看是否创建成功:
[root@centos-7 docker]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
edqgwqjka7ce demo replicated 1/1 busybox:latest
可以具体看这个service的内容:
[root@centos-7 docker]# docker service ps demo
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
lshgq4gfi3cv demo.1 busybox:latest localhost.localdomain Running Running 2 minutes ago
之前接触或scale,它可以帮助我们创建多个service,这里也是可行的:
[root@centos-7 docker]# docker service scale demo=5
demo scaled to 5
overall progress: 5 out of 5 tasks
1/5: running
2/5: running
3/5: running
4/5: running
5/5: running
verify: Service converged
已经有5个demo服务的容器正在运行了。可以先看看serverice:
[root@centos-7 docker]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
edqgwqjka7ce demo replicated 5/5 busybox:latest
再看看具体的容器数量:
[root@centos-7 docker]# docker service ps demo
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
lshgq4gfi3cv demo.1 busybox:latest localhost.localdomain Running Running 3 hours ago
vvxl3f5p1w40 demo.2 busybox:latest centos-7 Running Running 3 hours ago
q5imz8pqygbv demo.3 busybox:latest centos-7 Running Running 3 hours ago
ih6e2bhzzru2 demo.4 busybox:latest localhost.localdomain Running Running 3 hours ago
l32ziu7ygoqw demo.5 busybox:latest centos-7 Running Running 3 hours ago
可以看到5个容器在不同的节点上,其中有3个容器在manager节点,有两个在worker节点上。
当然,每一个节点都可以自己查看自己目前运行的容器,比如worker节点查看自己运行容器的数量:
[root@centos-7 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fbf77922d24c busybox:latest "/bin/sh -c 'while t…" 3 hours ago Up 3 hours demo.5.l32ziu7ygoqwapu4rbazqhyej
51e0e953688f busybox:latest "/bin/sh -c 'while t…" 3 hours ago Up 3 hours demo.3.q5imz8pqygbv5fw1r2wyt84ps
6f2b6d5f670c busybox:latest "/bin/sh -c 'while t…" 3 hours ago Up 3 hours demo.2.vvxl3f5p1w40oc82wvm2yq01q
只需要通过docker ps命令即可。
scale在swarm中除了水平扩展外,还有一个作用,那就是修复作用,比如将某一个节点中的容器删除掉,那么很快swarm中发觉并进行修复,数量保持原先的样子。
假如现在删除worker中的一个容器:
[root@localhost ~]# docker rm -f a8c8e6a95978
a8c8e6a95978
我们在manager节点中查看容器情况:
[root@centos-7 docker]# docker service ps demo
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
lshgq4gfi3cv demo.1 busybox:latest localhost.localdomain Running Running 3 hours ago
vvxl3f5p1w40 demo.2 busybox:latest centos-7 Running Running 3 hours ago
q5imz8pqygbv demo.3 busybox:latest centos-7 Running Running 3 hours ago
zkoywf8h19p1 demo.4 busybox:latest localhost.localdomain Running Starting less than a second ago
ih6e2bhzzru2 \_ demo.4 busybox:latest localhost.localdomain Shutdown Failed 23 seconds ago "task: non-zero exit (137)"
l32ziu7ygoqw demo.5 busybox:latest centos-7 Running Running 3 hours ago
可以看到红色就是我们删掉的容器,但是后面它又马上补充了一个,保持了整个系统的稳定性。
如何使用Swarm进行部署wordpress呢?wordpress涉及到数据库容器以及wordpress应用容易,那么这两个容器很有可能是不在一台机器的,也就是使用Swarm中两个容器是分配到不同的节点之上的。
首先,将之前的service进行移除:
[root@centos-7 docker]# docker service rm demo
demo
需要将这些service部署在一个overlay网络中,所以需要有个overlay网络。所以现在manager节点上创建这个网络:
[root@centos-7 docker]# docker network create -d overlay demo
xcjljjqcw26b2xukuirgpo6au
可以查看:
[root@centos-7 docker]# docker network ls
NETWORK ID NAME DRIVER SCOPE
xcjljjqcw26b demo overlay swarm
值得注意的是其他节点上现在并没有这个网络,那么其它节点又是怎么连上这个网络的呢?
[root@centos-7 docker]# docker service create --name mysql --env MYSQL_ROOT_PASSWORD=root --env MYSQL_DATABASE=wordpress --network demo
--mount type=volume,source=mysql-data,destination=/var/lib/mysql mysql:5.7.24
eirarnex6suqa4uqzgowncigv
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
可以看看这个服务的详情以及位于哪一个节点上:
[root@centos-7 docker]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
eirarnex6suq mysql replicated 1/1 mysql:5.7.24
[root@centos-7 docker]# docker service ps mysql
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
c4a4lggjmvuf mysql.1 mysql:5.7.24 centos-7 Running Running about a minute ago
接着在manager节点上启动wordpress服务
[root@centos-7 docker]# docker service create --name wordpress -p 80:80 --env WORDPRESS_DB-PASSWORD=root \
--env WORDPRESS_DB_HOST=mysql --network demo \
--mount type=volume,source=wordpress-config,destination=/var/www/html wordpress
上述中 --mount参数将容器中的配置等一系列的文件映射出来了,是方便修改容器中配置文件,修复数据库连接不上的错误,详情查看:
https://www.cnblogs.com/shenjianping/p/12268190.html
现在可以进行访问本机的80端口进行测试了
这种部署方式就是使用docker-compose.yml文件来进行部署应用,而上面那种方式就是每次手动单启容器。
[root@centos-7 wordpress-stack]# docker stack --help
Usage: docker stack [OPTIONS] COMMAND
Manage Docker stacks
Options:
--orchestrator string Orchestrator to use (swarm|kubernetes|all)
Commands:
deploy Deploy a new stack or update an existing stack
ls List stacks
ps List the tasks in the stack
rm Remove one or more stacks
services List the services in the stack
Run 'docker stack COMMAND --help' for more information on a command.
可以看到docker stack 的命令不是很多,第一个就是部署服务,一个docker-compose.yml就是一个服务,当然这个文件里面可能包含多个service。下面以实例来说明:
version: '3'
services:
web:
image: wordpress
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_PASSWORD: root
networks:
- my-network
depends_on:
- mysql
deploy:
mode: replicated
replicas: 3 #开启3个web服务
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
update_config:
parallelism: 1
delay: 10s
mysql:
image: mysql:5.7.24
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wordpress
volumes:
- mysql-data:/var/lib/mysql
networks:
- my-network
deploy:
mode: global #只能有一个mysql的服务
placement:
constraints:
- node.role==manager #服务只能部署在manager节点上
volumes:
mysql-data:
networks:
my-network:
driver: overlay #注意这里可能服务在不同的主机上,需要使用overlay网络
[root@centos-7 wordpress-stack]# docker stack deploy wordpress --compose-file=docker-compose.yml
Creating network wordpress_my-network
Creating service wordpress_web
Creating service wordpress_mysql
[root@centos-7 wordpress-stack]# docker stack ls
NAME SERVICES ORCHESTRATOR
wordpress 2 Swarm
[root@centos-7 wordpress-stack]# docker stack ps wordpress
[root@centos-7 wordpress-stack]# docker stack rm wordpress
Removing service wordpress_mysql
Removing service wordpress_web
Removing network wordpress_my-network
总结
Docker Swarm 是 Docker 官方提供的容器编排和集群管理工具,用于构建和管理多个 Docker 容器节点组成的集群。它提供集群管理、服务发现、负载均衡、滚动更新和安全等关键特性,使得用户能够轻松地部署、扩展和管理容器化应用程序,从而实现高可用性、高性能和高效率的运行环境。下一篇文章我将介绍 K8s相关的内容,希望大家关注更新!我会分享更多云原生相关的内容
月26日晚,crytek突然发文,官宣《孤岛危机4》项目正式启动。这款烧机软件终于迭代更新了!如今的4代的发售,能否还能像多年前的初代一样,引发业界的轰动与玩家议论硬件的热潮?
我依稀记得,2012年第一次玩《孤岛危机2》的时候,其画面和cg给我带来的巨大冲击,一切都那么栩栩如生,仿佛这就是画面的极致,已经再难提升。至于游戏的剧情,那实在是很次要的事情。与朋友聊天交流,都会因为自家的电脑能够带动这款游戏,而收获羡慕的目光。当时进入游戏的logo和EA的标志,也给我留下了深刻的印象,只是在这之后就没有见到了。
这只大眼睛,其实就是大名鼎鼎的cry engine(简称“CE”),由crytek开发。创立于97年的crytek,从诞生伊始就致力于游戏引擎的研发,目标十分明确:“要做出一款无缝切换室内外场景,光影和互动都十分顶级的引擎。”
在1999年的E3展会上,crytek展示了一款名叫“恐龙岛”的demo,用于展现他们新研发引擎强大的渲染能力,也借此寻求合作伙伴。凭借着其他引擎望尘莫及的远景渲染和水面反射,这款demo在当时的E3展上的表现惊艳一众产商。提供给他们展位的英伟达直接和他们签约合作,并提供技术支持。Crytek这开局可谓是顺风顺水,入行两年,就抱上英伟达的大腿了。
“恐龙岛”demo画面
在得到英伟达提供的技术和资金支持后,我们的老朋友育碧也找到了他们,表示想要将E3演示demo“恐龙岛”做成一个完整的游戏。在这款游戏中,cry engine正式登场,这款游戏也就是日后大名鼎鼎的《孤岛惊魂(farcry)》。初代《孤岛惊魂》的光影和水面效果,是名副其实的业界顶尖。在有着优秀大场景的同时,FPS中的粒子效果、枪械细节也得以兼顾。《孤岛惊魂》作为《孤岛危机》的精神前作,在遥远的2004年,理所当然地成为了一代硬件杀手。
在crytek的官网就能看到,最早的游戏就是《孤岛惊魂》
同样是在2004年,EA向crytek抛出了橄榄枝,美国的大款和法国的穷鬼你选谁?Crytek爽快干脆地加入了EA,准备干一票大的:他们会将当前所有的引擎技术投入到下一款作品中,为此他们需要开创一个崭新的IP,于是直接将《孤岛惊魂》卖给了育碧。而自己则在EA的支持下,投入到了《孤岛危机》这个全新系列的开发中。
需要注意的是,EA并非是将crytek收购,二者是合作关系(不然crytek已经倒闭了(* ̄▽ ̄)):EA为crytek提供资金支持,但要求他们的作品交由EA发行。直到今天,crytek仍然是独立工作室,不过在全球各地开分部的工作室确实也很少见。
一般的第一方游戏工作室都会考虑到游戏登陆多平台的可能性,在主机性能有限的前提下,会刻意地控制图形技术的使用,以保证不同平台的体验趋于平衡。但crytek这帮技术宅并没有这么想,他们只是想做出来一款划时代的游戏。很多的图形技术玩家们都是第一次听说:容积云、动态软光影、实时环境贴图、视差贴图、光束效果,这些名词带来超越时代画面的同时,也意味着2007年,市面上根本没有家用pc能够在特效全开的情况下流畅运行这款游戏。至于ps和xbox平台?想都别想!他们根本就没做主机版。
《孤岛危机》游戏画面
《生化奇兵》游戏画面
《光环3》游戏画面
《半条命2》游戏画面
《孤岛危机》是一款划时代的游戏,不仅有着当时最好的画面,也有着优良的物理效果,细节方面,载具有着部位伤害、叶片经过时会产生物理碰撞。这样优秀的物理互动和DICE的寒霜倒是有异曲同工之妙。但EA自家招牌的寒霜引擎直到次年的《战地:叛逆连队》中才正式亮相。
“寒霜引擎”的初登场:《战地:叛逆连队》
优秀的游戏并不意味着优秀的销量,如此高的运行门槛让众多玩家望而却步。加上当时的互联网刚刚普及,游戏的数字版还未流行,2007年成为了盗版游戏泛滥的一年,而《孤岛危机》则“荣膺”当年“盗版最多游戏”的桂冠。游戏的销量并不好,首发半个月才卖出8万套。然而是金子总会发光,在这样的环境下,凭借着自身过硬的素质以及新硬件的迭代更新,游戏的销量在三年后也达到了300万份,这些都是后话了。
2021年推出的《孤岛危机》重制版
作为crytek真正意义上的第一款游戏,《孤岛危机》无疑是成功的,虽然因为盗版问题,市场损失不小,但还是大赚一笔,更是凭着当时“最强游戏画面”的名头打响了IP、甚至公司的知名度。
在2008年到2011年这段时间里,除了将自家的cry engine升级到3.0版本、继续招牌《孤岛危机》的续作开发外,crytek还在全球各地陆陆续续开设了六家工作室。与此同时,已经有十余家上市公司在使用他们的引擎。相较于2.0,CE3.0少了很多黑科技,更注重对上一代引擎的优化。《孤岛危机2》也确实展现了他们努力的结果:只要你电脑带得动,那么从头到尾都不会卡。
2011年的《孤岛危机2》让我们看到了crytek的改变——为了兼顾大部分的pc玩家和主机平台,相较于一代,物理效果反而有所下降,游戏的过程更加线性,场景从海岛换成了纽约的钢铁森林,有了更多的COD式的大场面演出。这种取舍可以理解,毕竟是要吃饭的嘛,开了这么多工作室,最后如果还像一代那样曲高和寡,那就要喝西北风了。
这一转变十分成功,《孤岛危机2》交出的成绩十分优秀,仅仅用时3个月就达到了第一代3年的销量,当然,续作也继续蝉联了当年“盗版最多游戏”的“殊荣”。Crytek凭着这些钱将自己的分部扩张到了9个,并同时进行了3款游戏的开发。
《孤岛危机2》还推出了“限量版”,包含了一些独特的游戏道具
2013年,前文提到的三款游戏同时发售,分别是《战脸》《罗马之子》和《孤岛危机3》,款式虽多,却没有爆款。《战脸》不温不火,《罗马之子》由于预算问题,从原来的体感操作变成了QTE,而《孤岛危机3》也未达到EA的预期。游戏的场景和框架几乎没有改变,只是多了弓箭、黑客这些细枝末节的系统。放眼望去,能让人眼前一亮的,还是那超越时代的画面。但比起07年时一代给玩家的震撼,2013年的《孤岛危机3》确实没有那种打开新世界大门的感觉了。
自上而下,《战脸》《罗马之子》和《孤岛危机3》
2013年可以说是crytek的转折点。一系列的扩张和三部作品平平无奇的成绩让crytek入不敷出,在2014年就出现了拖欠员工工资的情况,之后更是陷入了裁员、关闭分部、卖版权这样的窘境,一度濒临破产的边缘。关键时期还是靠亚马逊注资拉了一把,但就在这之后,crytek也传出过拖欠员工工资的情况。如今只剩下了总部和两个分部。在褪下最强游戏画面的光环后,crytek的境遇似乎有些凄惨。当初引以为傲的引擎画面,在这些年也被re、寒霜这些后起之秀迎头赶上,crytek似乎已经逐渐“堕入凡尘”。
Cry engine曾经的优势面对后来者已经荡然无存
13年之后,crytek基本上没有什么大动作,除了在2016年的VR投资热中出了两款VR游戏,最近唯一为玩家所知的便是《猎杀:对决》,以及《孤岛危机》的新引擎重置,其实也就是换成了高p画面,玩法并没有任何的创新。
《猎杀:对决》
正因这漫长的“蛰伏期”,最近官宣的《孤岛危机4》立刻引起玩家们的关注,上一部系列新作不知不觉已经快要十年了。在画质趋同的如今,各大游戏引擎成熟。crytek已经失去了过去最大的倚仗,也不可能再像过去一样,最高画质在pc上俯瞰众生,游戏必将登陆全平台。如果要在画面上再次实现飞跃,VR也许是唯一的途径。无论如何,游戏最终还是需要依靠自身的游戏性才能撑起一片天,crytek现在需要的也许并不是程序员,而是一位优秀的游戏设计师。
景
由于现在不断提倡网络安全甚至已经成为一个国家的政策性要求,出台网络安全法,推出网络安全等级保护制度,可见安全的重要性。而网站作为中小型企业对外提供服务的一个入口,重要性就不容小觑,另外目前网络上出现了很多安全方面的工具,网站漏扫的门槛越来越低,随便一个开源的工具就可以对站点进行漏扫,若发现漏洞进而利用就可能导致比较重大的安全事故。所以针对中小型站点的安全保卫战就需要提上日程,增加一些措施手段保障站点的安全性,WAF就是一种比较合适的加固方案。
什么是WAF
Web应用程序防火墙,Web Application Firewall,简称WAF。是一种提供保护Web站点免受恶意攻击和数据泄露作用的产品,它通常位于Web应用程序和网络之间,监控和过滤HTTP流量,以便检测和阻止潜在的攻击。WAF主要有以下三种载体或者说方式提供服务
硬件WAF一般不适合中小型站点,投入成本较高,云WAF比较多跟云的场景结合现阶段也是成本比较高的选择,软件WAF的方式现在市面上有基础免费版和按需增值版供选择,比较适合中小型站点,可以选择基础免费版提高站点的安全门槛而不是在网络世界里裸奔,后续视业务的发展情况按需调整为更安全能力更强的收费版。
软件WAF简介
调研了市面上面的产品,从出品方的角度有专业公司和个人在运营的产品,主要有以下几种:
安装实践
主要对前三种软件南墙、雷池、宝塔WAF进行实际安装体验,整个体验过程主要基于事前、事中、事后三个逻辑环节进行。
安装前相关文档获取,三款软件官网均具备完善的文档介绍,产品均在持续迭代更新版本,还提供了沟通交流反馈的渠道如微信群,宝塔和雷池还提供了demo站提前体验。
三款软件均提供一键安装脚本,都是通过容器的方式运行,需要具备容器运行环境和80、443端口未被其他程序占用。安装简单官方文档介绍翔实就不做过多介绍。
从后台功能点的角度
相同点:三款软件均提供了站点整体的运行情况如访问量、拦截量、QPS等运行数据和针对站点进行防护策略的配置;都有免费版和其他收费版本的差异。免费版的差异点:
从实际防护效果角度
1、简单手动模拟构建异常攻击请求,均能被拦截,如下面这些请求,
模拟 SQL 注入攻击: https://站点地址/?id=1+and+1=2+union+select+1
模拟 XSS 攻击: https://站点地址/?id=
模拟路径穿越攻击: https://站点地址/?id=../../../../etc/passwd
模拟代码注入攻击: https://站点地址/?id=phpinfo();system('id')
2、利用BlazeHTTP工具进行评测
针对同一个站点,依次经过雷池、宝塔、南墙WAF进行防护后,利用BlazeHTTP工具进行扫描的结果如下,从结果上来看雷池准确率最高,宝塔最低。
总结
*请认真填写需求信息,我们会在24小时内与您取得联系。