【云原生】Docker Cgroups资源控制管理

news/2024/12/22 15:33:15/

目录

一、cgroups简介

cgroups有四大功能:

二、cpu时间片的概念

三、对CPU使用的限制

3.1 设置CPU使用率上限

(1)查看容器的默认CPU使用限制

(2)进行压力测试

(3)创建容器时设置CPU使用时间限制

(4)对已存在的容器进行CPU限制

3.2 设置CPU资源占用比(设置多个容器时才有效)

(1)创建两个容器,设置CPU资源占用比

(2)分别进入两个容器,进行压力测试

(3)查看容器运行状态,观察CPU使用占比

3.3 设置容器绑定指定的CPU(绑核)

四、对内存使用的限制

4.1 限制容器可以使用的最大内存

4.2 限制容器可用的swap 大小

五、对磁盘IO的配置控制(blkio)的限制

5.1 创建容器,不限制写速度

5.2 创建容器,并限制写速度

六、清除docker占用的磁盘空间

总结

1.对cpu的限制参数

2.对内存的限制

3.对磁盘IO的限制


一、cgroups简介

cgroups,是一个非常强大的linux内核工具,他不仅可以限制被namespace 隔离起来的资源,还可以 为资源设置权重、计算使用量、操控进程启停等等。所以cgroups (Control groups) 实现了对资源的配额和度量。

cgroups有四大功能:

  • 资源限制:可以对任务使用的资源总额进行限制。
  • 优先级分配:通过分配的cpu时间片数量以及磁盘IO带宽大小,实际上相当于控制了任务运行优先级。
  • 资源统计:可以统计系统的资源使用量,如cpu时长,内存用量等。
  • 任务控制: cgroup可以对任务 执行挂起、恢复等操作。

二、cpu时间片的概念

时间片即CPU分配给各个程序的时间,每个线程被分配一个时间段,称作它的时间片,即该进程允许运行的时间,使各个程序从表面上看是同时进行的。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。而不会造成CPU资源浪费。

在宏观上:我们可以同时打开多个应用程序,每个程序并行不悖,同时运行。但在微观上:由于只有一个CPU,一次只能处理程序要求的一部分,如何处理公平,一种方法就是引入时间片,每个程序轮流执行。

三、对CPU使用的限制

3.1 设置CPU使用率上限

Linux通过CFS (Completely Fair Scheduler, 完全公平调度器)来调度各个进程对CPU的使用。CFS默认的调度周期是100ms

我们可以设置每个容器进程的调度周期,以及在这个周期内各个容器最多能使用多少CPU时间。

使用 --cpu-period 即可设置调度周期,使用 --cpu-quota 即可设置在每个周期内容器能使用的CPU时间。两者可以配合使用。

CFS周期的有效范围是1ms ~ 1s, 对应的 --cpu-period 的数值范围是 1000 ~1000000 (单位微秒)。

而容器的CPU配额必须不小于1ms,即 --cpu-quota 的值必须 >= 1000。

(1)查看容器的默认CPU使用限制

#创建并启动容器[root@yuji ~]# docker run -itd --name test1 centos:7 /bin/bashWARNING: IPv4 forwarding is disabled. Networking will not work.059823a1abbe2ac6ed35599ca0d3d68049e49263ff9add8f65cc55daa094ec08#查看容器状态[root@yuji ~]# docker ps -aCONTAINER ID   IMAGE      COMMAND       CREATED          STATUS          PORTS     NAMES059823a1abbe   centos:7   "/bin/bash"   12 seconds ago   Up 10 seconds             test1​#切换到cgroup下针对容器的相关配置目录[root@yuji ~]# cd /sys/fs/cgroup/cpu/docker/[root@yuji docker]# ls059823a1abbe2ac6ed35599ca0d3d68049e49263ff9add8f65cc55daa094ec08  cpu.cfs_quota_uscgroup.clone_children                                             cpu.rt_period_uscgroup.event_control                                              cpu.rt_runtime_uscgroup.procs                                                      cpu.sharescpuacct.stat                                                      cpu.statcpuacct.usage                                                     notify_on_releasecpuacct.usage_percpu                                              taskscpu.cfs_period_us##切换到test1容器的目录[root@yuji docker]# cd 059823a1abbe2ac6ed35599ca0d3d68049e49263ff9add8f65cc55daa094ec08[root@yuji 059823a1abbe2ac6ed35599ca0d3d68049e49263ff9add8f65cc55daa094ec08]# lscgroup.clone_children  cgroup.procs  cpuacct.usage         cpu.cfs_period_us  cpu.rt_period_us   cpu.shares  notify_on_releasecgroup.event_control   cpuacct.stat  cpuacct.usage_percpu  cpu.cfs_quota_us   cpu.rt_runtime_us  cpu.stat    tasks##查看test1容器的CPU使用限额。即每个调度周期内可占用的CPU时间(单位:微秒)[root@yuji 059823a1abbe2ac6ed35599ca0d3d68049e49263ff9add8f65cc55daa094ec08]# cat cpu.cfs_quota_us-1                            #默认为-1,表示不限制##查看CPU调度周期(单位:微秒)[root@yuji 059823a1abbe2ac6ed35599ca0d3d68049e49263ff9add8f65cc55daa094ec08]# cat cpu.cfs_period_us100000                        #单位微秒,即100毫秒,0.1秒​#cpu.cfs_period_us:分配的周期(微秒,所以文件名中用u),默认为100000。#cpu.cfs_quota_us:表示该cgroups限制占用的时间(微秒),默认为-1,表示不限制。#cpu.cfs_quota_us 如果设为50000,表示占用 50000/100000=50%的CPU。

1-1.png

1-2.png

(2)进行压力测试

[root@yuji ~]# docker exec -it test1 bash     #进入容器[root@059823a1abbe /]# vi /cpu.sh         #写个死循环脚本#!/bin/bashi=0while truedolet i++done[root@059823a1abbe /]# chmod +x cpu.sh    #给脚本权限[root@059823a1abbe /]# ./cpu.sh           #运行脚本​#再开一个终端,查看cpu.sh进程的cpu使用率[root@localhost ~]# top                  #可以看到使用率接近100%PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND3328 root      20   0   11688   1100    916 R  99.7  0.1   7:04.44 cpu.sh#之后在容器中使用ctrl+c,停止脚本的执行,再top观察CPU使用率

1-3.png

1-4.png

1-5.png

1-6.png

(3)创建容器时设置CPU使用时间限制

#创建容器test2,并限制CPU使用时间为50000微秒,表示最多占用50%的CPU。[root@yuji ~]# docker run -itd --name test2 --cpu-quota 50000 centos:7WARNING: IPv4 forwarding is disabled. Networking will not work.8e7ba758a231b29dad1f668ba83092e8f637d2a9785999c6d23b27c60935b12b#查看CPU限额文件[root@yuji ~]# cd /sys/fs/cgroup/cpu/docker/[root@yuji docker]# ls059823a1abbe2ac6ed35599ca0d3d68049e49263ff9add8f65cc55daa094ec08  cpuacct.usage         cpu.shares8e7ba758a231b29dad1f668ba83092e8f637d2a9785999c6d23b27c60935b12b  cpuacct.usage_percpu  cpu.statcgroup.clone_children                                             cpu.cfs_period_us     notify_on_releasecgroup.event_control                                              cpu.cfs_quota_us      taskscgroup.procs                                                      cpu.rt_period_uscpuacct.stat                                                      cpu.rt_runtime_us[root@yuji docker]# cd 8e7ba758a231b29dad1f668ba83092e8f637d2a9785999c6d23b27c60935b12b[root@yuji 8e7ba758a231b29dad1f668ba83092e8f637d2a9785999c6d23b27c60935b12b]# cat cpu.cfs_quota_us50000​#登录容器test2,写个死循环脚本并运行[root@yuji ~]# docker exec -it test2 bash[root@8e7ba758a231 /]#  vi /cpu.sh#!/bin/bashi=0while truedolet i++done[root@8e7ba758a231 /]# chmod +x cpu.sh[root@8e7ba758a231 /]# ./cpu.sh ​#再开一个终端,查看cpu使用率[root@yuji ~]# top                  #CPU使用率在50%左右PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND3746 root      20   0   11688   1096    916 R  50.0  0.1   1:55.26 cpu.sh​​#容器的CPU使用时间限制设为50000,而调度周期为100000,表示容器占用50000/100000=50%的CPU。

1-7.png

1-8.png

1-9.png

(4)对已存在的容器进行CPU限制

直接修改 /sys/fs/cgroup/cpu/docker/容器id/cpu.cfs_quota_us 文件即可

#进入test1容器目录,修改CPU使用时间限制[root@yuji ~]# cd /sys/fs/cgroup/cpu/docker/[root@yuji docker]# ls059823a1abbe2ac6ed35599ca0d3d68049e49263ff9add8f65cc55daa094ec08  cpuacct.usage         cpu.shares8e7ba758a231b29dad1f668ba83092e8f637d2a9785999c6d23b27c60935b12b  cpuacct.usage_percpu  cpu.statcgroup.clone_children                                             cpu.cfs_period_us     notify_on_releasecgroup.event_control                                              cpu.cfs_quota_us      taskscgroup.procs                                                      cpu.rt_period_uscpuacct.stat                                                      cpu.rt_runtime_us[root@yuji docker]# cd 059823a1abbe2ac6ed35599ca0d3d68049e49263ff9add8f65cc55daa094ec08#修改CPU使用时间限制[root@yuji 059823a1abbe2ac6ed35599ca0d3d68049e49263ff9add8f65cc55daa094ec08]# echo "33000" >cpu.cfs_quota_us[root@yuji 059823a1abbe2ac6ed35599ca0d3d68049e49263ff9add8f65cc55daa094ec08]# cat cpu.cfs_quota_us33000​#此时再进入test1容器执行之前创建好的脚本,进行压力测试[root@yuji ~]# docker exec -it test1 bash[root@059823a1abbe /]# ./cpu.sh​#再开一个终端,查看cpu使用率[root@localhost ~]# topPID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND4635 root      20   0   11688   1096    916 R  33.3  0.1   1:27.62 cpu.sh​​#容器的CPU使用时间限制设为33000,而调度周期为100000,表示容器占用33000/100000=33%的CPU。

1-10.png

1-11.png

1-12.png

3.2 设置CPU资源占用比(设置多个容器时才有效)

Docker 通过 --cpu-shares 指定CPU份额,默认值为1024,值为1024的倍数。

(1)创建两个容器,设置CPU资源占用比

#先删除所有容器[root@yuji ~]# docker rm -f $(docker ps -aq)9c48e09ea1567c7e024b557e​#创建两个容器为c1和c2#只有这2个容器的情况下,cpu资源分摊给这两个容器,512:1024等于1:2,一个占1/3,一个占2/3。[root@yuji ~]# docker run -itd --name c1 --cpu-shares 512 centos:7WARNING: IPv4 forwarding is disabled. Networking will not work.300b50f13ebef4921029e352f5850b1c81f8f8e28827a8d11f20e55eec94642b[root@yuji ~]# docker run -itd --name c2 --cpu-shares 1024 centos:7WARNING: IPv4 forwarding is disabled. Networking will not work.7a999b00c9eef7fdb916c2914087809e7eba55b1c52aaaabeeda16a4006f57a9[root@yuji ~]# docker ps -aCONTAINER ID   IMAGE      COMMAND       CREATED         STATUS         PORTS     NAMES7a999b00c9ee   centos:7   "/bin/bash"   4 seconds ago   Up 3 seconds             c2300b50f13ebe   centos:7   "/bin/bash"   6 seconds ago   Up 5 seconds             c1

2-1.png

(2)分别进入两个容器,进行压力测试

#宿主机开启路由转发功能,使容器能够连通外网[root@yuji ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf[root@yuji ~]# sysctl -pnet.ipv4.ip_forward = 1​#进入c1容器,进行压力测试docker exec -it c1 bashyum install -y epel-release    #下载epel源yum install -y stress          #安装stress工具stress -c 4   #产生四个进程,每个进程都反复不停地计算随机数的平方根​#进入c2容器,进行压力测试docker exec -it c2 bashyum install -y epel-release    #下载epel源yum install -y stress          #安装stress工具stress -c 4   #产生四个进程,每个进程都反复不停的计算随机数的平方根

2-2.png

进入c1容器,进行压力测试:

2-3.png

2-4.png

2-5.png

进入c2容器,进行压力测试:

2-6.png

2-7.png

2-8.png

(3)查看容器运行状态,观察CPU使用占比

#再打开一个终端,查看容器运行状态(动态更新)[root@yuji ~]# docker stats     #可以看到CPU使用占比大约是1:2CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT     MEM %     NET I/O          BLOCK I/O        PIDS7a999b00c9ee   c2        266.52%   188.9MiB / 1.938GiB   9.52%     32.8MB / 152kB   1.91MB / 50MB    7300b50f13ebe   c1        133.03%   203.1MiB / 1.938GiB   10.24%    33.7MB / 603kB   108MB / 51.4MB   7​#因为宿主机有4核,所以CPU总百分比是400%。#c1:c2 = 133.03%:266.52% ≈ 1:2

2-9.png

3.3 设置容器绑定指定的CPU(绑核)

注意:CPU编号从0开始。 编号1、3代表第二个核和第四个核 。

#先为虚拟机分配4个CPU核数​#创建容器c3时,绑定1号和3号这两个CPU[root@yuji ~]# docker run -itd --name c3 --cpuset-cpus 1,3 centos:7 /bin/bash​#进入容器,进行压力测试docker exec -it c3 bashyum install -y epel-release    #下载epel源yum install -y stress          #安装stress工具stress -c 4   #产生四个进程,每个进程都反复不停地计算随机数的平方根​#退出容器,执行top命令再按1查看CPU使用情况[root@yuji ~]# top    #可以看到CPU1和CPU3占满,其他CPU使用率为0top - 01:12:49 up  4:01,  3 users,  load average: 3.47, 2.96, 2.49Tasks: 183 total,   6 running, 177 sleeping,   0 stopped,   0 zombie%Cpu0  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st%Cpu1  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st%Cpu2  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st%Cpu3  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 stKiB Mem :  2031912 total,   150852 free,   635800 used,  1245260 buff/cacheKiB Swap:  4194300 total,  4194236 free,       64 used.  1138692 avail Mem

3-1.png

3-2.png

3-3.png

3-4.png

四、对内存使用的限制

4.1 限制容器可以使用的最大内存

-m (或--memory=)选项用于限制容器可以使用的最大内存

#-m(--memory=)选项用于限制容器可以使用的最大内存。​#创建容器c4,并限制容器可以使用的最大内存为512m[root@yuji ~]# docker run -itd --name c4 -m 512m centos:7 /bin/bash​#查看容器状态,可以看到c4可以使用的最大内存是512M[root@yuji ~]# docker statsCONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT     MEM %     NET I/O          BLOCK I/O         PIDS437180fc6266   c4        0.00%     396KiB / 512MiB       0.08%     648B / 0B        0B / 0B           1ebcc06da3a03   c3        0.00%     174.2MiB / 1.938GiB   8.78%     32.8MB / 196kB   47.7MB / 50.6MB   17a999b00c9ee   c2        0.00%     101.7MiB / 1.938GiB   5.13%     32.9MB / 152kB   1.91MB / 50MB     2300b50f13ebe   c1        0.00%     113MiB / 1.938GiB     5.69%     33.7MB / 603kB   108MB / 51.4MB    1

4-1.png

4-2.png

4.2 限制容器可用的swap 大小

#限制可用的swap 大小,--memory-swap●强调一下, --memory-swap是必须要与 --memory(或-m)一起使用的。●正常情况下, --memory-swap 的值包含容器可用内存和可用swap 。●所以 -m 300m --memory-swap=1g 的含义为:容器可以使用300M 的物理内存,并且可以使用700M (1G - 300M)的swap。​设置为0或者不设置,则容器可以使用的 swap 大小为 -m 值的两倍。如果 --memory-swap 的值和 -m 值相同,则容器不能使用swap。如果 --memory-swap 值为 -1,它表示容器程序使用的内存受限,而可以使用的swap空间使用不受限制(宿主机有多少swap 容器就可以使用多少)。

示例:

#--memory-swap 的值包含容器可用内存和可用swap,减去-m的值才是可用swap的值。#表示容器可以使用512M的物理内存,并且可以使用512M的swap。因为1g减去512m的物理内存,剩余值才是可用swap。docker run -itd --name yy01 -m 512m --memory-swap=1g centos:7 bash​​#--memoryswap值和 -m 的值相同,表示容器无法使用swapdocker run -itd --name yy02 -m 512m --memory-swap=512m centos:7 bash​​# --memory-swap 的值设置为0或者不设置,则容器可以使用的 swap 大小为 -m 值的两倍。docker run -itd --name yy03 -m 512m centos:7 bash​​# --memory-swap 值为 -1,它表示容器程序使用的内存受限,但可以使用的swap空间使用不受限制(宿主机有多少swap 容器就可以使用多少)。docker run -itd --name yy04 -m 512m --memory-swap=-1 centos:7 bash

4-3.png

五、对磁盘IO的配置控制(blkio)的限制

--device-read-bps:限制某个设备上的读速度bps ( 数据量),单位可以是kb、mb (M)或者gb。

--device-write-bps : 限制某个设备上的写速度bps ( 数据量),单位可以是kb、mb (M)或者gb。

--device-read-iops :限制读某个设备的iops (次数)

--device-write-iops :限制写入某个设备的iops ( 次数)

 

--device-read-bps:限制某个设备上的读速度bps ( 数据量),单位可以是kb、mb (M)或者gb。
 例: docker run -itd --name test9 --device-read-bps /dev/sda:1M centos:7 /bin/bash
 #表示该容器每秒只能读取1M的数据量
 ​
 --device-write-bps : 限制某个设备上的写速度bps ( 数据量),单位可以是kb、mb (M)或者gb。
 例: docker run -itd --name test10 --device-write-bps /dev/sda:1mb centos:7 /bin/bash
 #表示该容器每秒只能写入1M的数据量
 ​
 --device-read-iops :限制读某个设备的iops (次数)
 --device-write-iops :限制写入某个设备的iops ( 次数)

5.1 创建容器,不限制写速度

 

#创建容器tt01,不限制写入速度
 docker run -it --name tt01 centos:7 /bin/bash
 ​
 #通过dd来验证写速度,拷贝50M的数据
 dd if=/dev/zero of=/opt/test.out bs=10M count=5 oflag=direct   #添加oflag参数以规避掉文件系统cache
 ​
 #创建容器tt01,不限制写入速度
 [root@yuji ~]# docker run -it --name tt01 centos:7 /bin/bash
 #通过dd来验证写速度,拷贝50M的数据到容器中
 [root@a62f5b811e58 /]# dd if=/dev/zero of=/opt/test.out bs=10M count=5 oflag=direct   #添加oflag参数以规避掉文件系统cache
 5+0 records in
 5+0 records out
 52428800 bytes (52 MB) copied, 0.0948474 s, 553 MB/s
 ​
 #没有限制写速度的情况下,写入很快,0.09秒的时间内已写入50M的数据,写入速度为553M/s。

5-1.png

5.2 创建容器,并限制写速度

 

#创建容器,并限制写入速度为1MB/s,即每秒只能写入1MB的数据量。
 [root@yuji ~]# docker run -it --name tt02 --device-write-bps /dev/sda:1mb centos:7 bash
 #通过dd来验证写速度,拷贝50M的数据到容器中
 [root@655f6cca0175 /]# dd if=/dev/zero of=/opt/test.out bs=10M count=5 oflag=direct  #添加oflag参数以规避掉文件系统cache
 5+0 records in
 5+0 records out
 52428800 bytes (52 MB) copied, 50.0048 s, 1.0 MB/s
 ​
 #写入50M的数据,需要50s左右,因为限制了容器的写速度是 1.0 MB/s。

5-2.png

六、清除docker占用的磁盘空间

docker system prune -a 可用于清理磁盘,删除关闭的容器、无用的数据卷和网络。

示例:

 

#查看容器
 [root@yuji ~]# docker ps -a
 CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS                      PORTS     NAMES
 655f6cca0175   centos:7   "bash"        10 minutes ago   Exited (0) 4 minutes ago              tt02
 a62f5b811e58   centos:7   "/bin/bash"   19 minutes ago   Exited (0) 11 minutes ago             tt01
 437180fc6266   centos:7   "/bin/bash"   36 minutes ago   Up 36 minutes                         c4
 ebcc06da3a03   centos:7   "/bin/bash"   50 minutes ago   Up 50 minutes                         c3
 #清理磁盘,删除关闭的容器、无用的数据卷和网络。
 [root@yuji ~]# docker system prune -a
 WARNING! This will remove:                                   #提示
   - all stopped containers                                   #删除清理所有停止的容器
   - all networks not used by at least one container          #删除未被使用的网络
   - all images without at least one container associated to them  #未被使用的镜像
   - all build cache                                         #删除已建立的缓存
 ​
 Are you sure you want to continue? [y/N] y                #是否确定删除
 Deleted Containers:
 655f6cca01754d27a080e01b64aa26c4f96642ab5b5931b186ad04082a98430f
 a62f5b811e584cc6e8d344830d5df9ddcbdd72761966989245b0c52f6abb9a4a
 ......
 Total reclaimed space: 451MB

 ​
 #再次查看容器,只剩下启动中的容器
 [root@localhost ~]# docker ps -a
 CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS          PORTS     NAMES
 525d77ff7423   centos:7   "/bin/bash"   3 minutes ago    Up 3 minutes              c6
 fb2ee21e0468   centos:7   "/bin/bash"   12 minutes ago   Up 12 minutes             c4
 81e3ea8f526e   centos:7   "/bin/bash"   18 minutes ago   Up 18 minutes             c3

6-1.png

6-2.png

总结

1.对cpu的限制参数

 

docker run -cpu-period     #设置调度周期时间1000~1000000
            -cpu-quota      #设置容器进程的CPU占用时间,要与调度周期时间成比例
            --cpu-shares    #设置多个容器之间的CPU资源占用比
            --cpuset-cpus   #绑核(第一个CPU编号从0开始)

2.对内存的限制

 

-m 物理内存 [--memory-swap=总值]

3.对磁盘IO的限制

 

--device-read-bps 设备文件:1mb/1M     #限制读速度
 --device-write-bps 设备文件:1mb/1M    #限制写速度
 --device-read-iops                   #限制读次数
 --device-write-iops                  #限制写次数
 ​
 docker system prune -a    #清理磁盘,删除关闭的容器、无用的数据卷和网络。


http://www.ppmy.cn/news/1050650.html

相关文章

【从零学习python 】56. 异常处理在程序设计中的重要性与应用

文章目录 异常的概念读取文件异常try...except语句try...else语句try...finally语句 进阶案例 异常的概念 在程序运行过程中,由于编码不规范或其他客观原因,可能会导致程序无法继续运行,此时就会出现异常。如果不对异常进行处理,…

Linux Kernel 4.12 或将新增优化分析工具

到 7 月初,Linux Kernel 4.12 预计将为修复所有安全漏洞而奠定基础,另外新增的是一个分析工具,对于开发者优化启动时间时会有所帮助。 新的「个别任务统一模型」(Per-Task Consistency Model)为主要核心实时修补&#…

XXX程序 详细说明

用于记录理解PC程序的程序逻辑 1、程序的作用 根据原作者的说明(文件说明.txt),该程序 (PC.py) 的主要作用是提取某一个文件夹中的某个设备 (通过config中的信息看出来是Ag_T_8) 产生的日志文件,然后提取其中某些需要的数据&…

开源在线图片设计器,支持PSD解析、AI抠图等,基于Puppeteer生成图片

Github 开源地址: palxiao/poster-design 项目速览 git clone https://github.com/palxiao/poster-design.git cd poster-design npm run prepared # 快捷安装依赖指令 npm run serve # 本地运行将同时运行前端界面与图片生成服务(3000与7001端口),合成图片时…

SOFARPC(笔记)

文章目录 一、快速开始1.1 SOFARPC1.2 基于SOFABoot 二、注册中心三、通讯协议2.1 Bolt基本发布调用方式超时控制协议泛化调用序列化协议自定义线程池 2.2 RESTful基本使用 2.3 其他协议四、架构 附录 官方样例下载地址-sofa-boot-guides 可查看 SOFARPC 方式快速入门 一、快…

快速解决Spring Boot跨域困扰:使用CORS实现无缝跨域支持

跨域问题 什么是跨域? 跨域(Cross-Origin Issue)的存在是因为浏览器的安全限制,它防止恶意网站利用跨域请求来获取用户的敏感信息或执行恶意操作。浏览器通过实施同源策略来限制网页在不同源之间进行资源访问或交互的情况。当一…

小说作者分享:如何利用爱校对使我的作品更出彩?

在创作小说的过程中,校对和修改是至关重要的步骤。许多作家已经开始利用“爱校对”这一工具,有效地提高他们作品的质量。本篇文章将通过实际案例,展示一些小说作者是如何成功地利用爱校对来精雕细琢他们的文字,并将作品提升到一个…

如何实现element UI中table操作栏更多按钮的展示与折叠?

解决思路: ​ 直接使用elementUI文档上Popover 弹出框组件 废话不多说,直接上代码吧 <el-table :data="locationList" v-loading="loading" border class="table" ref="multipleTable" @selection-change="handleSelecti…