GoReplay开源工具使用教程

目录

一、GoReplay环境搭建

1、Mac、Linux安装GoReplay环境

二、GoReplay录制与重播

1、搭建练习接口

2、录制命令

3、重播命令

三、GoReplay单个命令

1、常用命令

2、其他命令

3、命令示例

4、性能测试

5、正则表达式

四、gorepaly组合命令

1、组合命令实例

2、gorepaly注意事项


一、GoReplay环境搭建

1、Mac、Linux安装GoReplay环境

1,项目下载地址:

https://github.com/buger/goreplay/releases/tag/1.3.3

2,mac、Linux可以直接在终端输入

curl -L -O https://github..com/buger/goreplay/releases/download/1.3.3/gor_1.3.3_mac.tar.gz

3,解压压缩包

tar -zxvf gor_1.3.3_mac.tar.gz

4,配置环境变量,mac、Linux修改/ect/profile文件,在末尾添加

# 配置goreplay环境变量
GOR_HOME="yourPath/goreplay"
export PATH="$GOR_HOME:$PATH"

5,验证环境,显示版本号就安装完成

gor version

二、GoReplay录制与重播

1、搭建练习接口

你可以通过调用快速启动服务器gor file-server :8000,这将在端口上启动当前目录的简单文件服务器8000

gor file-server :8000

2、录制命令

1,录制所有http请求,以下命令是录制5000端口全部的http请求,接受之前的录制文件./log/logrequests_0.gor,并且把新的录制文件输出到./log/logrequests.gor文件,请注意,默认情况下 GoReplay 不跟踪响应,您可以使用--output-http-track-response选项启用它们,在文件名中使用日期变量:%Y-%m-%d-%H

sudo gor --input-raw 127.0.0.1:5000 --output-stdout --output-file='./log/logrequests.gor' -output-file-append --output-file-max-size-limit "4294967296"

  • --input-raw- 用于捕获HTTP流量,您应该指定IP地址或接口和应用程序端口。有关捕获和重放流量的更多信息。
  • --input-file- 接受之前使用 录制的文件--output-file。有关从文件保存和重播的更多信息

3、重播命令

1,下列这行命令展示了使用录制的文件重播请求,所有记录的请求都到达第二个服务器,并且它们将以与记录时相同的顺 序和完全相同的时间重播。--input-file参数接受录制的文件,--output-http参数接受需要重播的服务器,出现FileInput: end of file 提示,说明重播完成

gor --input-file='./log/logrequests_0.gor' --output-http='http://127.0.0.1:5000'

三、GoReplay单个命令

1、常用命令

当您需要仅捕获流量的特定部分(例如 API 请求)时,匹配非常有用。可以按 URL、HTTP 标头或 HTTP 方法进行匹配,匹配方式使用正则表达式。

-http-allow-header value 根据请求头匹配,其他内容将被排除
-http-allow-method value 根据请求方式匹配,其他内容将被排除
-http-allow-url value 根据请求url匹配,其他内容将被排除

-http-disallow-header value 根据请求头匹配,其他内容将被记录

-http-disallow-url value 根据请求url匹配,其他内容将被记录

-http-header-limiter value 根据请求头,接受一部分请求
-http-param-limiter value 根据url,接受一部分请求

-http-original-host 保留原始请求头,默认gor会用--output http提供的主机替换Host http头
-http-rewrite-header value 根据匹配的内容重写请求头
-http-rewrite-url value 根据匹配的内容重写请求url
-http-set-header value 向请求中添加额外的请求头
-http-set-param value 设置请求中的param参数,如果已经存在,将会被覆盖
-input-file value 从文件读取请求
-input-file-loop 循环读取文件,一般用于性能测试

-input-raw value 从给定端口捕获流量,需要root权限

-input-tcp-secure 启用TLS证书,需要指定证书跟密钥

-input-tcp-certificate string TLS开启时,指定的证书路

-input-tcp-certificate-key string TLS开启时,指定的密钥路径

-output-file value 将请求写入文件

-output-file-queue-limit int 区块队列的长度。默认值:256

-output-file-size-limit value 每个区块的大小。默认值:32mb

-output-http value  将传入请求转发到给定的http地址

--output-http-track-response 默认情况下 GoReplay 不跟踪响应,加上这个参数跟踪响应

--input-raw-track-response 默认情况下input-raw不拦截响应,仅拦截请求。您可以加这个参数开启响应跟踪。启用后,您将能够访问中间件和output-file

--input-file-dry-run 试运行模式,来预览需要多长时间以及给定文件输入中有多少个请求。它还会告诉您有用的信息,例如请求之间的最短和最长时间,以及第一次请求的时间。

--input-raw-max-wait 跳过大的延迟,选项(以秒为单位),该选项允许跳过录制文件中的长时间停顿。

--input-raw-allow-incomplete  如果打开,Gor将记录丢失数据包的HTTP消息

2、其他命令

-input-raw-engine libpcap 选择libpcap(默认)或者`raw_socket`拦截流量

-output-http-debug  启用http调试输出。

-input-raw-realip-header string 如果不为空,默认在请求头加上实际ip,X-Real-IP

-input-raw-track-response 如果启用,Gor将跟踪请求之外的响应,并且它们将可用于中间件和文件输出

-input-kafka-host string 向Kafka发送请求和响应统计信息
-input-kafka-json-format 启动表示消息是json格式而不是GoReplay格式
-input-kafka-topic string 向Kafka发送请求和响应统计信息

-output-kafka-host string  从Kafka读取请求和响应统计信息

-output-kafka-json-format  如果启用,它将把消息从GoReplay文本格式序列化为JSON

-output-kafka-topic string 从Kafka读取请求和响应统计信息

-input-dummy value 用于测试输出。每1s发出'get /'请求

-output-file-append  刷新的块是否附加到存在文件,只保留一个流量文件

-output-file-flush-interval duration 强制刷新文件缓冲区的时间间隔,默认为1s,一般不需要改动

-output-http-elasticsearch string 向ElasticSearch发送请求和响应统计信息

-output-http-redirects int 启用重定向的频率

-output-http-response-buffer int HTTP响应缓冲区大小,此大小之后的所有数据都将被丢弃

-output-http-stats  每5秒向控制台报告一次http输出队列统计信息

-output-http-timeout duration 指定HTTP请求/响应超时。默认情况下为5s

-output-http-track-response 如果启用,HTTP输出响应将设置为所有输出,如stdout、file等

-output-http-workers int 以多少个协程同时产生http请求,默认是动态,官方文档显示无限制,实际代码中设置了10,这块有争议

-output-null 用于测试输入。删除所有请求

-output-stdout 用于测试输入。只是将来自输入的数据打印到控制台。

-output-tcp value 用于Gor实例之间的内部通信sh

-output-tcp-secure 使用TLS安全连接–另一端的输入文件也应该打开TLS

-output-tcp-stats 每5秒向控制台报告一次TCP输出队列统计信息

-verbose 启用更详细的输出

3、命令示例

命令区分大小写,参数后面的精准匹配的时候不区分大小写,用正则表达式区分大小写

1,提示-bash: !': event not found,输入echo $-显示himBH,原因是确认是由于 H - histexpand 模式打开了导致。命令行下,双引号里面用了 ! 的话,Shell 会以为要执行历史展开,从而导致报错,解决方法:关闭 histexpand,输入set +H,再输入echo $-显示himB就可以了。

2,把双引号替换成单引号

从perf文件读取请求,添加param参数goreplay=1,添加header信息'perf':'yes',保留原始请求头,匹配url为^/user/authgetUserInfo$,输出到perf.log文件

goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host  --output-file='perf.log' --http-allow-url ^/user/authgetUserInfo?.+

试运行模式,您无需执行实际重播即可获取有关文件内容的信息。仅支持goreplay1.3版本以上
例如,它可以告诉您文件中有多少个请求,以及重播这些请求需要多长时间。
报告示例:

gor --input-file=流量文件 --output-stdout --input-file-dry-run

找到的记录:192

格式错误的记录:<nil>

已处理的文件:1

处理的字节数:88512

最大等待时间:71.369ms

最短等待时间:15.884ms

首次等待:55.401ms

以目前的速度重放需要7.82033秒。

找到0条时间戳不正常的记录

添加请求头,goreplay:1

goreplay --input-file='perf' --http-original-host  --output-file='perf.log' --http-set-header 'goreplay:1'

添加param参数,perf=1

goreplay --input-file='perf' --http-original-host --output-file='perf.log' --http-set-param 'goreplay=1'

匹配header的Host字段包含baidu.com

goreplay --input-file='perf' --http-original-host  --output-file='perf.log' --http-allow-header '^Host: .*.baidu.com.*'

匹配url为/user开头的所有接口,后面路径包含空用*,不包含空用+,[^\/]表示除了匹配/所有的字符

goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host  --output-file='perf.log' --http-allow-url ‘^\/user.+’

goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host --output-file='perf.log' --http-allow-url '^\/user/[^\/]'

匹配以getUserInfo结尾的所有接口

goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host  --output-file='perf.log' --http-allow-url ‘^.*getUserInfo?.+’

匹配url为/user开头,排除结尾是/getUserInfo的所有接口,输出到perf.log文件

以下是用--http-allow-url搭配--http-disallow-url参数组合匹配的结果,同时满足a跟b两个条件,可以正常匹配 

goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host  --output-file='perf.log' --http-allow-url ’^\/user.*$' --http-disallow-url '.*getUserInfo$‘

更新头部信息跟param参数,如果参数存在,则更新,如果不存在,则添加,不能删除

goreplay --input-file='perf_0.log' --http-set-param 'goreplay=0' --http-set-header 'perf':'no' --http-original-host  --output-file='perf.log' 

重写请求url,匹配/user开头的url重写为/api/user开头,当重写跟匹配url一起时,先匹配url再重写url,需要匹配的url是重写之前的url

goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host --output-file='perf.log'  --http-rewrite-url '/user/([^\/]+):/api/user/$1' --http-allow-url '^\/user.*$'

重写版本号,user重写为userv2

goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host --output-file='perf.log' --http-rewrite-url '^/user/([^/]):/userv2/$1' --http-allow-url '^/user/[^/]'

匹配/user/orders/detail开头,结尾是大写字母+数字,8到18位的字符串

goreplay --input-file='perf' --http-set-param 'goreplay=1' --http-set-header 'perf':'yes' --http-original-host --output-file='perf.log' --http-allow-url '^/user/orders/detail/[A-Z0-9]{8,15}'

可以同时匹配到,/user/orders/detail/LBL67047,/user/orders/detail/GSHN7W61400M120,用^/user/orders/detail/[a-z0-9]{8,15},不能匹配大写字母

4、性能测试

  • 以50%的速度回放
  • goreplay --input-file='perf'  --http-original-host  --output-tcp '127.0.0.1:5000:50%'  
  • 以秒50的速度回放
  • goreplay --input-file='perf'  --http-original-host  --output-tcp '127.0.0.1:5000|50'  
  • 文件回放完继续循环
  • goreplay --input-file='perf'  --http-original-host  --output-tcp '127.0.0.1:5000'  --input-file-loop
  • 从文件读取输出到http
  • goreplay --input-file 'log_0.log' --output-http '127.0.0.1:5000' --output-stdout 
  • 从文件读取,输出到http,同时指定python中间件处理
  • goreplay --input-file 'log_0.log' --output-http '127.0.0.1:5000' --output-stdout --middleware 'python3 middleware.py'

5、正则表达式

  • 注意:goreplay无论哪个版本都不支持正反向正向预查和负向预查
  • 匹配以/user开头,^/user
  • 匹配以/user结尾,/user$
  • 匹配1个或1个以上,+
  • 匹配0,1或1个以上的,*
  • 匹配0或者1个,最多一个多,?
  • 匹配否定字符,[^]表示匹配任何字符集包括\n,[^abc]表示匹配非a或者b或者c的字符集,匹配u/s/e/r中的任一字符,[user]
  • 匹配a-z区间所有的大小写字母,[a-z][A-Z]
  • 匹配所有的字母下划线,/\w\g
  • 精准匹配以/abt开头/userinfo结尾,^/abt/userinfo$,可以匹配到/abt/userinfo,不能匹配到/abt/userinfo/a, /a/abt/userinfo,/abt/a/userinfo
  • 匹配以/abt开头/userinfo结尾,中间至少一个路径,^/abt/\w+/userinfo$,匹配/abt/aaa/userinfo,不能匹配/abt/userinfo,匹配以/abt开头/userinfo结尾,中间0-1一个路径,^/abt/\w*/userinfo$,匹配abt/aaa/userinfo,abt/userinfo
  • 匹配/user/orders/detail接口结尾是大写字母跟数字16位组合,^/user/orders/detail/[A-Z0-9]+$,/user/orders/detail/GSHN7Q02C002006
  • 匹配以'/user'开头并且不以'/auth/getUserInfo'结尾的任意字符串,^\/user(?!\/auth\/getUserInfo).*$ (不能在gor使用)
  • 匹配,/user/orders/track/GSHN7B38R00NGA4,/user/auth/mc/getKey,/user/auth,排除,/user/auth/getUserInfo

四、gorepaly组合命令

1、组合命令实例

  1. 这里用到了改变速率命令,以500%的速度输出用|500%,以每秒500个请求输出用:500
    如果输出的文件名称跟时间相关,输出的文件名优先级高,比如14跟15点都是同一个快内,但是文件名会拆分成两个
    用--output-file-queue-limit 0设置队列为0
    gor --input-file 'perf|500%' --output-file '%Y-%m-%d-%H.log' --http-disallow-url '^/user/orders/detail/[A-Z0-9]{8,15}$' --http-disallow-url '^/\w.*.html$'  --output-file-queue-limit 0
  2. 用命令匹配url同时允许多个url,允许a-url,同时允许b-url,匹配的结果会包括aurl或者b-url的所有url,url=a+b
    gor --input-file 'perf|2000%' --output-file 'perf.log' --http-allow-url '^/user/[a-zA-Z]+/[a-zA-Z]+?.+$' --http-allow-url '^/[a-zA-Z]+/auth/[a-zA-Z]+?.+$' --output-file-queue-limit 0
  3. 用命令匹配url同时不允许多个url,不允许a-url,不同时允许b-url,匹配的结果会包括除了满足a-url或者b-url的所有url,url=url-(a+b)
  4. gor --input-file 'perf|2000%' --output-file 'perf.log' --http-disallow-url '^/user/[a-zA-Z]+/[a-zA-Z]+?.+$' --http-disallow-url '^/[a-zA-Z]+/auth/[a-zA-Z]+?.+$' --output-file-queue-limit 0
  5. 用命令匹配url一个允许一个不允许,允许a-url,不同时允许b-url,匹配的结果会包括满足a-url减去b-url的所有url,url=a-b
  6. gor --input-file 'perf|2000%' --output-file 'perf.log' --http-allow-url '^/user/[a-zA-Z]+/[a-zA-Z]+?.+$' --http-disallow-url '^/[a-zA-Z]+/auth/[a-zA-Z]+?.+$' --output-file-queue-limit 0
  7. 用命令匹配允许url并且重写url跟header,允许a-url,允许b条件,重写a-url为/api/a-url,重写header为User-Agent: gor,允许处理原始数据,然后处理重写url跟header,输出后的内容,url=/api/a+b,header=重写后的a+重写后的b
  8. gor --input-file 'perf|2000%' --output-file 'perf.log' --http-allow-url '^/user/[a-zA-Z]+/[a-zA-Z]+?.+$' --http-allow-url '^/pdsearch/[0-9a-zA-Z]+/.+$'  --http-rewrite-url '(^/user/[a-zA-Z]+/[a-zA-Z]+?.+$):/api$1' --http-set-header 'User-Agent':'gor' --output-file-queue-limit 0
  9. 从url录制所有的请求,需要root权限
  10. sudo gor -input-raw '127.0.0.1:5000' --output-file 'test.gor'  --output-stdout --output-file-queue-limit 0
  11. gor命令搭配中间件处理
  12. gor --input-file 'test.gor|800%' --output-http '127.0.0.1:5000' --output-stdout --middleware 'python3 middleware.py'

2、gorepaly注意事项

1,gor录制的时候,流量会存在不完整的情况,如果直接使用中间件处理,容易报错或者出现异常,如果出现异常后,没有日志返回结束或者nohup.txt没有返回,但是gor进程已经结束了,这种情况需要手动关闭node中间件进程

2,出现异常流量的时候,建议更换流量文件或者先用gor回放到文件,然后在使用回放后的文件用中间件处理

3,回放时直接使用中间件&gor命令回放到服务器时,会消耗部分性能,比直接从流量文件回放效率低,建议流量文件先使用中间件或者命令回放一次到文件,然后直接使用文件回放到服务器,这样效率较高

4,录制的流量包体过大,需要加参数,--input-raw-override-snaplen

5、 回放流量的时候,有时候会流量波动大,偶尔流量比较小,需要加上参数--input-file-max-wait=200ms,允许跳过录制文件中的超过200ms的延迟

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

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

相关文章

Nginx:ssl

目录 部署ssl前提 nginx部署ssl证书 部署ssl部署建议 部署ssl前提 网站有域名根据域名申请到ssl证书,并下载证书部署到nginx中 部署了ssl证书后,访问的流量是加密的。 nginx部署ssl证书 #80端口跳转到443 server {listen 80;return 302 https://1…

USB 声卡全解析:提升音频体验的得力助手

在当今数字化的时代,音频领域的追求愈发多元。无论是热衷聆听高品质音乐的爱好者,还是在专业音频工作中精雕细琢的人士,亦或是在游戏世界里渴望极致音效沉浸的玩家,都始终在寻觅能让音频体验更上一层楼的妙法。而 USB 声卡&#x…

[TPAMI 2024]Vision-Language Models for Vision Tasks: A Survey

论文网址:Vision-Language Models for Vision Tasks: A Survey | IEEE Journals & Magazine | IEEE Xplore 论文Github页面:GitHub - jingyi0000/VLM_survey: Collection of AWESOME vision-language models for vision tasks 英文是纯手打的&…

深度学习模型:门控循环单元(GRU)详解

本文深入探讨了门控循环单元(GRU),它是一种简化版的长短期记忆网络(LSTM),在处理序列数据方面表现出色。文章详细介绍了 GRU 的基本原理、与 LSTM 的对比、在不同领域的应用以及相关的代码实现,…

HCIA笔记6--路由基础与静态路由:浮动路由、缺省路由、迭代查找

文章目录 0. 概念1.路由器工作原理2. 跨网访问流程3. 静态路由配置4. 静态路由的应用场景4.1 路由备份4.2 浮动路由4.3 缺省路由 5. 迭代路由6 问题6.1 为什么路由表中有的下一跳的地址有接口?6.2 个人电脑的网关本质是什么? 0. 概念 自治系统&#xff…

Spark常问面试题---项目总结

一、数据清洗,你都清洗什么?或者说 ETL 你是怎么做的? 我在这个项目主要清洗的式日志数据,日志数据传过来的json格式 去除掉无用的字段,过滤掉json格式不正确的脏数据 过滤清洗掉日志中缺少关键字段的数据&#xff…

【北京迅为】iTOP-4412全能版使用手册-第三十二章 网络通信-TCP套字节

iTOP-4412全能版采用四核Cortex-A9,主频为1.4GHz-1.6GHz,配备S5M8767 电源管理,集成USB HUB,选用高品质板对板连接器稳定可靠,大厂生产,做工精良。接口一应俱全,开发更简单,搭载全网通4G、支持WIFI、蓝牙、…

【乐企文件生成工程】搭建docker环境,使用docker部署工程

1、自行下载docker 2、自行下载docker-compose 3、编写Dockerfile文件 # 使用官方的 OpenJDK 8 镜像 FROM openjdk:8-jdk-alpine# 设置工作目录 WORKDIR ./app# 复制 JAR 文件到容器 COPY ../lq-invoice/target/lq-invoice.jar app.jar # 暴露应用程序监听的端口 EXPOSE 1001…

介绍下你们电商搜索的整体Java技术架构?

大家好,我是锋哥。今天分享关于【介绍下你们电商搜索的整体Java技术架构?】面试题。希望对大家有帮助; 介绍下你们电商搜索的整体Java技术架构? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在电商平台的搜索系统中…

【趣味】斗破苍穹修炼文字游戏HTML,CSS,JS

目录 图片展示 游戏功能 扩展功能 完整代码 实现一个简单的斗破苍穹修炼文字游戏,你可以使用HTML、CSS和JavaScript结合来构建游戏的界面和逻辑。以下是一个简化版的游戏框架示例,其中包含玩家修炼的过程、增加修炼进度和显示经验值的基本功能。 图片…

永磁同步电机负载估计算法--滑模扰动观测器

一、原理介绍 为了进一步提高永磁同步电机的抗干扰性能,采用SMDO在线估计负载扰动,然后将估计的负载扰动作为前馈信号补偿速度控制器的输出 根据永磁同步电机的运动方程,可以建立滑模观测器的模型如下: 式中l2为观测器的反馈增益…

BiGRU:双向门控循环单元在序列处理中的深度探索

一、引言 在当今的人工智能领域,序列数据的处理是一个极为重要的任务,涵盖了自然语言处理、语音识别、时间序列分析等多个关键领域。循环神经网络(RNN)及其衍生结构在处理序列数据方面发挥了重要作用。然而,传统的 RN…

云服务器重装系统后 一些报错与解决[ vscode / ssh / 子用户]

碰见的三个问题: 1.vscode连接失败 2.登录信息配置 3.新建子用户的一些设置 思考:遇见问题,第一反应 应该如何解决 目录 1. 错误 解决方法 原因 步骤 1:找到known_hosts文件并编辑 步骤 2:通过VSCode终端输入…

QT实战-qt各种菜单样式实现

本文主要介绍了qt普通菜单样式、带选中样式、带子菜单样式、超过一屏幕菜单样式、自定义带有滚动条的菜单样式, 先上图如下: 1.普通菜单样式 代码: m_pmenu new QMenu(this);m_pmenu->setObjectName("quoteListMenu"); qss文…

基于BM1684的AI边缘服务器-模型转换,大模型一体机

介绍 我们属于SoC模式,即我们在x86主机上基于tpu-nntc和libsophon完成模型的编译量化与程序的交叉编译,部署时将编译好的程序拷贝至SoC平台(1684开发板/SE微服务器/SM模组)中执行。 注:以下都是在Ubuntu20.04系统上操…

Redis+Caffeine 多级缓存数据一致性解决方案

RedisCaffeine 多级缓存数据一致性解决方案 背景 之前写过一篇文章RedisCaffeine 实现两级缓存实战,文章提到了两级缓存RedisCaffeine可以解决缓存雪等问题也可以提高接口的性能,但是可能会出现缓存一致性问题。如果数据频繁的变更,可能会导…

计算机网络——不同版本的 HTTP 协议

介绍 HTTP,即超文本传输协议(HyperText Transfer Protocol),是应用层的一个简单的请求-响应协议,它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。本文将介绍 HTTP 协议各个版本。 HTTP/1.0 HTTP/1…

【ArkTS】使用AVRecorder录制音频 --内附录音机开发详细代码

系列文章目录 【ArkTS】关于ForEach的第三个参数键值 【ArkTS】“一篇带你读懂ForEach和LazyForEach” 【小白拓展】 【ArkTS】“一篇带你掌握TaskPool与Worker两种多线程并发方案” 【ArkTS】 一篇带你掌握“语音转文字技术” --内附详细代码 【ArkTS】技能提高–“用户授权”…

P1319 压缩技术 P1320 压缩技术(续集版)

题目传送门 P1319 压缩技术 P1320 压缩技术(续集版) P1319 压缩技术 输入格式 数据输入一行,由空格隔开的若干个整数,表示压缩码。 其中,压缩码的第一个数字就是 N N N,表示这个点阵应当是 N N N\t…

【CSS】一篇掌握CSS

不是因为有了希望才去坚持,而是坚持了才有了希望 目录 一.导入方式 1.行内样式 2.内部样式 3.外部样式(常用) 二.选择器 1.基本选择器(常用) 1.1标签选择器 1.2类选择器 1.3id选择器 2.层次选择器 2.1后代选择器 2.2子选择器 2.3相邻兄弟选择器 2.4通用兄弟选择器…