MoreRSS

site iconDerobukal修改

博客名:御坂研究所,一个偏软件开发和技术实践的博客。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

Derobukal的 RSS 预览

利用whisper为视频自动生成字幕

2025-01-02 18:37:24

whisper是一个由openai开发的通用语言识别模型,我们可以使用它来为视频自动创建字幕。

环境安装

为了加速,我们需要使用GPU来进行计算,因此需要安装基于CUDA的pytorch。首先我们需要安装Miniconda,这里安装的时候直接点击下一步即可。

安装完毕之后,我们需要创建一个新的环境,这里我们创建一个名为whisper的环境:

conda create -n whisper python=3.8conda activate whisper

1. 安装CUDA

安装好了Miniconda之后,我们需要安装CUDA,执行nvidia-smi

$ nvidia-smiThu Jan  2 11:49:53 2025+-----------------------------------------------------------------------------------------+| NVIDIA-SMI 560.94                 Driver Version: 560.94         CUDA Version: 12.6     ||-----------------------------------------+------------------------+----------------------+| GPU  Name                  Driver-Model | Bus-Id          Disp.A | Volatile Uncorr. ECC || Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. ||                                         |                        |               MIG M. ||=========================================+========================+======================||   0  NVIDIA GeForce GTX 1060 6GB  WDDM  |   00000000:01:00.0  On |                  N/A ||  0%   39C    P8             10W /  120W |     505MiB /   6144MiB |      0%      Default ||                                         |                        |                  N/A |+-----------------------------------------+------------------------+----------------------+

通过这个命令可以看到Driver Version: 560.94CUDA Version: 12.6,因此我们需要安装12.6版本的CUDA,更加详细的版本对照表在这里。在安装的时候可以选择自定义安装选项,一般来说只要勾选CUDA下的 Development和Runtime即可。

安装完毕之后执行命令nvcc -V查看CUDA版本:

$ nvcc -Vnvcc: NVIDIA (R) Cuda compiler driverCopyright (c) 2005-2024 NVIDIA CorporationBuilt on Thu_Sep_12_02:55:00_Pacific_Daylight_Time_2024Cuda compilation tools, release 12.6, V12.6.77Build cuda_12.6.r12.6/compiler.34841621_0

2. 安装cuDNN

根据自己下载的CUDA来选择对应版本的cuDNN,下载地址在这里。下载完毕之后解压到CUDA的安装目录下,一般来说是C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA{版本号},如果有重名的文件直接替换即可。

之后进入extras\demo_suite目录,执行如下命令:

bandwidthTest.exedeviceQuery.exe

如果出现了PASS的字样,说明安装成功。

3. 安装pytorch

切换到我们之前创建的whisper环境,使用如下命令安装CUDA版本的pytorch:

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

安装之后执行python命令进入python环境,执行如下代码:

1
2
import torch
torch.cuda.is_available()

如果显示True则说明CUDA版本的pytorch安装成功。

4. 安装whisper

切换到我们之前创建的whisper环境,执行如下命令安装whisper:

pip install -U openai-whisperpip install setuptools-rust

安装完毕之后执行如下命令就可以使用whisper了:

whisper 'C:/Users/raymond/Desktop/voice.aac' --language zh --model turbo

如上命令表示对C:/Users/raymond/Desktop/voice.aac文件进行中文语言的识别,使用turbo模型。第一次执行该命令会下载模型文件,模型文件较大,下载时请确保网络通畅。执行结果如下

[00:00.000 --> 00:03.060] 提到肉毒毒素[00:03.060 --> 00:04.540] 你会想到什么[00:04.540 --> 00:10.820] 你真的了解它吗[00:10.820 --> 00:12.540] 2017年[00:12.540 --> 00:14.180] 肉毒毒素以万能药标签[00:14.180 --> 00:15.500] 登上时代周刊方面[00:15.500 --> 00:17.280] 目前它在全球[00:17.280 --> 00:18.960] 已被应用于几十种适应症[00:18.960 --> 00:20.560] 仅在2019年[00:20.560 --> 00:23.000] 接受注射的就已超过620万例[00:23.000 --> 00:24.880] 但不要忘了[00:24.880 --> 00:26.780] 肉毒毒素更是一种神经毒素[00:26.780 --> 00:29.000] 还曾被当作生化武器使用... 省略 ...

生成字幕

我们可以使用ffmpeg将音频从视频中提取出来,然后使用whisper生成字幕,最后使用ffmpeg将字幕添加到视频中。

使用如下命令提取音频:

ffmpeg -i input.mp4 -vn -acodec copy output.aac

然后使用whisper生成字幕,我们先在pycharm中创建一个test-whisper项目,并且把python解释器设置为Miniconda创建的whisper环境。创建一个main.py文件,写入如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import whisper
from whisper.utils import get_writer

root = 'E:/'

# 使用turbo模型
model = whisper.load_model('turbo')
prompt = '如果使用了中文,请使用简体中文来表示文本内容'

# 选择声音文件,识别中文,并且打印详细信息
result = model.transcribe(root + 'output.aac', language='zh', initial_prompt=prompt, verbose=True)
print(result['text'])

# 保存字幕文件
writer = get_writer('srt', root)
writer(result, 'output.srt')

如上代码表示使用turbo模型,识别中文,打印详细信息,并且保存字幕文件。执行完毕之后我们可以在E:/目录下看到生成的字幕文件。

最后我们使用ffmpeg将字幕添加到视频中:

ffmpeg -i input.mp4 -i output.srt -c:s mov_text -c:v copy -c:a copy output.mp4

之后我们在播放这个视频的时候就会有字幕了。

参考

video-subtitle-generator
基于Anaconda的pytorch-cuda
CUDA与cuDNN的安装与配置
ffmpeg视频合并、格式转换、截图

ffmpeg笔记

2024-06-18 18:13:25

合并一个文件夹内的所有视频
1
2
3
4
5
find *.mp4 | sed 's:\ :\\\ :g'| sed 's/^/file /' > fl.txt
ffmpeg -f concat -i fl.txt -c copy output.mp4
// 忽略错误信息
ffmpeg -safe 0 -f concat -i fl.txt -c copy output.mp4
rm fl.txt

参考资源

视频压缩
1
2
3
4
5
6
// 视频使用h.264编码,声音使用aac编码
ffmpeg -i input.mp4 -vcodec h264 -acodec aac output.mp4
// 视频使用h.265编码,压缩到更小文档
ffmpeg -i input.mp4 -vcodec libx265 -crf 28 output.mp4
// 视频使用h.264编码,保留更好的质量
ffmpeg -i input.mp4 -vcodec libx264 -crf 20 output.mp4

crf越小,视频质量越高;crf越大,视频文件越小

编码参数也可以简写,从-vcodec-acodec改为-c:v-c:a

1
2
3
ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4
ffmpeg -i input.mp4 -c:v libx265 -crf 28 output.mp4
ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 31 -b:v 0 output.mkv

参考资源

其中AVC/H264HEVC/H265都是软件编码,速度很慢。可以选择英伟达的硬件编码:hevc_nvenc与h264_nvenc,它们使用硬件加速,速度很快。

参考资源

使用英伟达显卡进行编码:

1
ffmpeg -i video.mp4 -c:v hevc_nvenc -crf 28 output.mp4

将视频从H.264转码到H.265,花了55分钟,视频体积从3.8GB减小到430MB,效果立竿见影。转码命令:ffmpeg -i 1.mp4 -c:v libx265 -vtag hvc1 -c:a copy 1_hevc.mp4

在win10可以用scoop安装ffmpeg,更新Windows上面通过scoop安装的所有程序
scoop list | foreach { scoop update $_.Name }

将视频以同样的编码,按照指定时间进行裁剪

1
ffmpeg -ss 00:05 -to 08:53.500 -i ./input.mp4 -c copy video.mp4

利用ffmpeg快速剪辑视频

1
ffmpeg -ss 07:18 -to 13:45 -i ./aaa.mkv -c copy bbb.mkv
  • -ss表示开始时间
  • -to表示结束时间
  • -i是输入文档
  • -c表示使用被剪辑视频一样的编码
  • bbb是输出文档的名称

合并视频和声音,视频使用原始编码,声音改为aac编码

1
ffmpeg -i 1.mp4 -i 1.opus -c:v copy -c:a aac output.mp4

将PNG格式图片转为JPG格式图片

1
ffmpeg -i image.png -preset ultrafast image.jpg

修改图片的尺寸

1
2
ffmpeg -i image.jpeg -vf scale=413:626 2寸.jpeg
ffmpeg -i image.jpeg -vf scale=390:567 1寸.jpeg

将一个音频重复10次

1
ffmpeg -stream_loop 10 -i input.m4a -c copy output.m4a

如何参与Apache顶级开源项目

2024-01-24 19:27:14

我们在日常工作中经常会使用到很多的开源项目,开源也是一个在工作和学习中都离不开的内容。一般来说,开源项目可以选择直接开源,也可以选择捐赠给某些基金会,例如Linux FoundationCNCFASF等等。以ASF为例,如果一个项目想要成为顶级项目,则需要先通过孵化器孵化,孵化结束毕业才能成为顶级项目。最近我因为一些原因参与了云原生网关APISIX开源项目,这里做一下介绍。

搭建环境

首先我们需要下载源代码并且构建开发流程,根据官网介绍,我们把项目代码fork到自己的仓库并clone到本地,随后在本地仓库中将原始的项目设置为上游upstream,之后新建分支进行开发即可

~ git clone [email protected]:RitterHou/apisix.git~ cd apisix~ git remote -v~ git remote add upstream https://github.com/apache/apisix.git~ git config --global user.name "derobukal"~ git config --global user.email "[email protected]"~ git fetch upstream~ git checkout master~ git rebase upstream/master~ git push origin master~ git checkout -b issue-10484~ cd ..

根据官方教程,我们还需要安装APISIX的开发环境注1

~ export https_proxy="http://192.168.65.100:7890"~ export http_proxy="http://192.168.65.100:7890"~ wget https://raw.githubusercontent.com/apache/apisix/master/utils/install-dependencies.sh~ APISIX_RUNTIME='1.1.1' bash install-dependencies.sh~ cd apisix~ make deps~ sudo mkdir /usr/local/apisix~ sudo mkdir /usr/local/apisix/logs~ sudo chown raymond:raymond /usr/local/apisix -R~ sudo make install

以及安装和启动etcd

~ ETCD_VERSION='3.4.18' wget https://github.com/etcd-io/etcd/releases/download/v${ETCD_VERSION}/etcd-v${ETCD_VERSION}-linux-amd64.tar.gz && tar -xvf etcd-v${ETCD_VERSION}-linux-amd64.tar.gz && cd etcd-v${ETCD_VERSION}-linux-amd64 && sudo cp -a etcd etcdctl /usr/bin/~ cd ..~ etcd

最简单的PR

搭建好了环境之后,就可以修改代码并提交PR了。一般来说开源项目都会有多种类型的改动,以apisix为例,它限制了PR可以为固定的几种类型

featfixdocsstylerefactorperftestbuildcichorerevertchange

包含了文档修改、新功能、bug修复等等,我们选择比较简单的文档修改作为第一个PR。我在使用APISIX的过程中,发现它证书相关的文档中存在一个错误

在上图中,这里的地址不应该是/hello而应该是/get,因此我们可以在本地仓库新建一个分支并对这个问题作出修改。修改后我们将这次改动提交(为了使提交更加的清晰和安全,建议合并commit并对commit进行签名)并push到我们自己的远程仓库,随后在GitHub上面创建一个针对原始仓库的Pull Request。一般项目在创建一个PR的时候都会有模板信息,照着模板信息进行填写即可,填写完毕就可以提交PR并等待项目的成员进行处理了

修复issue中的问题

在APISIX中有着很多的ISSUE

我们可以关注这些ISSUE看有没有自己能解决的问题。一般来说,带有good first issue标签的都是比较简单并且适合新人的,我们可以优先从这些issue中寻找自己能解决的问题

在确定了issue之后,我们可以请求管理员将这个issue分配给自己,防止别人也会去解决这个问题从而浪费时间。当然,有的时候issue即使已经被分配给别人了,但是如果他一直没有解决这个问题,我们仍然可以请求将这个issue分配给自己

搭建测试环境

对于issue-10484,因为涉及到代码更改,因此需要执行测试。APISIX使用了test-nginx框架来执行测试,官方有关于如何进行测试的介绍

我们需要安装测试框架注2

sudo cpan Test::Nginx

并下载依赖测试模块

➜  apisix git:(issue-10484) git clone https://github.com/api7/test-toolkit/ t/toolkit

修改完代码之后可以执行相关的测试

~ PATH=/usr/local/openresty/nginx/sbin:/usr/bin PERL5LIB=.:$PERL5LIB FLUSH_ETCD=1 prove -Itest-nginx/lib -r t/admin/ssl2.tt/admin/ssl2.t .. ok    All tests successful.Files=1, Tests=52, 11 wallclock secs ( 0.06 usr  0.01 sys +  3.61 cusr  1.05 csys =  4.73 CPU)Result: PASS

如果测试没有问题就可以提交PR了。

通过CI的测试

apisix使用GitHub的workflow进行CI执行测试,以redhat-ci.yaml为例,它会在多个平台上执行多个文件夹内的测试。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
jobs:
test_apisix:
name: run ci on redhat ubi
runs-on: ubuntu-20.04
timeout-minutes: 90
strategy:
fail-fast: false
matrix:
events_module:
- lua-resty-worker-events
- lua-resty-events
test_dir:
- t/plugin/[a-k]*
- t/plugin/[l-z]*
- t/admin t/cli t/config-center-yaml t/control t/core t/debug t/discovery t/error_page t/misc
- t/node t/pubsub t/router t/script t/secret t/stream-node t/utils t/xds-library

如上所示,GitHub action中的matrix默认会对其下面的的多个选项进行合并,例如redhat-ci.yamlevents_moduletest_dir组合起来就会构成8个执行脚本

lua-resty-worker-events t/plugin/[a-k]*lua-resty-worker-events t/plugin/[l-z]*lua-resty-worker-events t/admin t/cli t/config-center-yaml t/control t/core t/debug t/discovery t/error_page t/misclua-resty-worker-events t/node t/pubsub t/router t/script t/secret t/stream-node t/utils t/xds-librarylua-resty-events t/plugin/[a-k]*lua-resty-events t/plugin/[l-z]*lua-resty-events t/admin t/cli t/config-center-yaml t/control t/core t/debug t/discovery t/error_page t/misclua-resty-events t/node t/pubsub t/router t/script t/secret t/stream-node t/utils t/xds-library

github的CI会对这些所有的任务执行测试。如果测试执行失败了,需要重点关注失败的日志,并在本地调试直到可以通过测试。如果遇到数据不对的问题,可以重新对数据进行初始化

apisix quit && apisix init && apisix init_etcd && apisix start

社区交流

在代码提交并创建了PR之后,我们可能会收到一些反馈,这时候我们就需要针对这些反馈作出回应。以#10771为例

我在提交了代码之后,管理员认为需要将aes_encrypt_pkeyaes_decrypt_pkey方法中的field字段去掉。我一开始在写代码的时候就发现这个字段去掉会导致数据加解密过程中ssldata的行为不一致,可能导致错误。不过管理员让我放心删,没问题,本着信任的态度我就把参数删除掉了

但是删除掉了之后测试却怎么也跑不过,我因为非常信任社区管理员也没有怀疑是因为ssldata逻辑不一致导致的,而是从其它地方入手进行排查。最终花了大量的时间经过了很多**的排查之后,发现其实就是因为ssldata的行为逻辑不一致导致的。我随后询问了管理员,并且把field参数加了回来

field参数加回来之后,所有的test cases就都能跑过了

所有测试用例通过,一段时间之后PR被review没有问题,就会被合并到master分支了

参考

Revolution OS
S04E00-吴晟:开源项目进入 Apache 孵化器意味着什么
Apache 是如何运作的?
新手如何快速参与开源项目
如何从小白成长为 Apache Committer?

  1. 在执行install-dependencies.sh脚本的时候,会下载golang的依赖,比如gRPC-Go,这里需要保证网络能够顺畅访问golang的官方仓库。

  2. 为了保证test-nginx正常安装,需要网络顺畅,能够正常访问相关资源。

使用frp实现内网ssh穿透

2024-01-06 06:00:22

最近需要远程访问一台虚拟机内的Linux,因为虚拟机没有公网IP,因此选择使用frp转发ssh流量的方式来实现远程访问。首先访问frp的release页面并根据操作系统和CPU下载相应的版本,之后解压得到frpcfrps文件。

frps是服务端版本,它需要部署在一台拥有公网IP的主机上,它的配置frps.ini如下

[common]bind_port = 10625token = y9XBLEu2ymW1s5N3W7OuDPhUG4IohVmQ

其中bind_port代表了它所监听的端口号,而token则是客户端连接时需要用到的验证信息。

frpc是客户端版本,它的配置frpc.ini如下

[common]server_addr = 100.26.21.285server_port = 10625authentication_method = token token = y9XBLEu2ymW1s5N3W7OuDPhUG4IohVmQ[ssh]type = tcplocal_ip = 127.0.0.1 local_port = 22remote_port = 10626

common代表通用配置,它包含了4个配置

  1. 作为服务端的远程主机的公网IP
  2. frps在远程主机所监听的端口号
  3. 验证方式,这里是通过token进行验证
  4. 验证的token值

ssh代表了进行ssh转发的设置,它的含义如下

  1. 转发的方式,这里是tcp协议
  2. 本地主机的地址,因为访问的就是当前机器,设为127.0.0.1
  3. 本地ssh服务所监听的端口,默认端口22
  4. 远程(服务端)进行ssh流量转发时所监听的端口

有了如上的配置之后,我们可以在远程主机上使用该配置启动frps

./frps -c ./frps.ini

需要注意远程主机的10625和10626端口需要关闭防火墙的设置,以保证可以通过外部进行访问。之后启用本地的客户端

./frpc -c ./frpc.ini

本地机器如果没有安装ssh服务,则需要先安装ssh服务。启动了服务端和客户端之后,可以在服务端看到客户端成功连接的日志信息,之后通过

ssh [email protected] -p 10626

命令就可以成功访问虚拟机内Linux的ssh服务了,整个网络流程大致如下

  1. 客户端提前通过服务端的10625端口已经创建好了客户端与服务端的连接
  2. 用户访问远程主机frps的10626端口
  3. 远程主机上的frps通过与客户端的连接将流量发给frpc
  4. frpc将流量转发给本地的ssh服务
  5. 用户最终可以操作本地的ssh

参考

使用frp端口映射实现内网穿透(SSH、HTTP服务)

安装并使用zsh

2023-10-19 00:18:09

首先我们安装zsh,并切换默认的shell为zsh,之后重启进入zsh

sudo apt-get install zshchsh -s /bin/zshsudo shutdown -r now

之后我们安装oh-my-zsh,因为网络的原因所以设置了代理

wget -e https_proxy=192.168.65.100:7890 https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.shchmod +x install.sh./install.sh

然后再安装zsh命令自动补全插件zsh-autosuggestions

git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions

之后编辑~/.zshrc文件,修改ZSH_THEME="simple",并且在plugins里面添加zsh-autosuggestions配置

ZSH_THEME="simple"plugins=(git zsh-autosuggestions)

APISIX的使用

2023-10-13 03:22:36

APISIX是一款基于Openresty的动态、实时、高性能API网关,它提供了负载均衡、服务熔断等丰富的功能。

安装服务

https://github.com/apache/apisix-docker中提供了很多很便利的docker配置,可以很方便的启动APISIX的相关服务。

~ git clone [email protected]:apache/apisix-docker.git~ cd apisix-docker/example/~ docker-compose upStarting example_etcd_1             ... doneStarting example_grafana_1          ... doneStarting example_apisix-dashboard_1 ... doneStarting example_web2_1             ... doneStarting example_web1_1             ... doneStarting example_prometheus_1       ... doneStarting example_apisix_1           ... doneAttaching to example_grafana_1, example_etcd_1, example_apisix-dashboard_1, example_web1_1, example_web2_1, example_prometheus_1, example_apisix_1

如上启动了7个容器,分别是:

  • 配置中心:etcd
  • 展示prometheus的指标:grafana
  • apisix的管理控制台:apisix-dashboard
  • 测试服务:web2
  • 测试服务:web1
  • 采集apisix的指标:prometheus
  • apisix本体

接下来我们可以测试一下apisix

~ curl http://127.0.0.1:9180/apisix/admin/routes -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' {"total":0,"list":[]}

如上命令用于查看apisix的所有路由信息,使用默认的API-KEY

使用Admin API管理路由

路由用于通过规则匹配客户端的请求,并根据请求加载相应的插件,最后将请求转发到指定的上游服务。由此可知路由由三部分组成

  1. 客户端请求的匹配规则:包含methodhosturi
  2. 插件,例如流控、安全认证等等,插件是可选的
  3. 上游服务

APISIX的Admin接口都采用了Restful风格,路由资源的地址为/apisix/admin/routes/{id},它的操作接口如下

方法 路径 功能
GET /apisix/admin/routes 获取资源列表
GET /apisix/admin/routes/{id} 获取指定资源
PUT /apisix/admin/routes/{id} 根据指定id创建资源
POST /apisix/admin/routes 创建资源,id自动生成
DELETE /apisix/admin/routes/{id} 删除指定id的资源

接下来我们创建一个上游为web1的路由

~ curl -X PUT http://127.0.0.1:9180/apisix/admin/routes/1 \    -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -i -d '{    "methods": ["GET"],    "uri": "/web1",    "upstream": {        "type": "roundrobin",        "nodes": {            "web1:80": 1        }    }}'HTTP/1.1 201 Created...{"key":"/apisix/routes/1","value":{"status":1,"methods":["GET"],"id":"1","priority":0,"uri":"/web1","update_time":1706606490,"upstream":{"scheme":"http","hash_on":"vars","type":"roundrobin","nodes":{"web1:80":1},"pass_host":"pass"},"create_time":1706606490}}

返回201表示创建成功,之后我们可以访问这个新建的路由接口

~ curl http://127.0.0.1:9080/web1hello web1

上游(Upstream)

除了直接使用服务之外,为了方便,我们还可以把服务的资源直接定义为一个上游(Upstream)

~ curl -X PUT http://127.0.0.1:9180/apisix/admin/upstreams/1 \    -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -i -d '{    "type": "roundrobin",    "nodes": {        "web1:80": 1    }}'HTTP/1.1 201 Created...{"key":"/apisix/upstreams/1","value":{"scheme":"http","create_time":1706606769,"hash_on":"vars","id":"1","type":"roundrobin","update_time":1706606769,"pass_host":"pass","nodes":{"web1:80":1}}}

如上我们把web1这个服务定义为上游(Upstream)1,之后我们可以直接使用这个上游构建路由

~ curl -X PUT http://127.0.0.1:9180/apisix/admin/routes/1 \    -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -i -d '{    "methods": ["GET"],    "uri": "/web1",    "upstream_id": "1"}'HTTP/1.1 200 OK...{"key":"/apisix/routes/1","value":{"upstream_id":"1","methods":["GET"],"status":1,"priority":0,"uri":"/web1","update_time":1706606904,"id":"1","create_time":1706606490}}

之后访问地址还是一样的效果

~ curl http://127.0.0.1:9080/web1                          hello web1

查看我们刚刚创建的路由和上游

~ curl http://127.0.0.1:9180/apisix/admin/upstreams -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'{"total":1,"list":[{"key":"/apisix/upstreams/1","value":{"scheme":"http","create_time":1706607099,"hash_on":"vars","nodes":{"web1:80":1},"type":"roundrobin","id":"1","pass_host":"pass","update_time":1706607099},"createdIndex":35,"modifiedIndex":35}]}~ curl http://127.0.0.1:9180/apisix/admin/routes -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'  {"total":1,"list":[{"key":"/apisix/routes/1","value":{"create_time":1706607103,"methods":["GET"],"id":"1","priority":0,"uri":"/web1","upstream_id":"1","update_time":1706607103,"status":1},"createdIndex":36,"modifiedIndex":36}]}

我们还可以删除我们刚刚创建的路由和上游

~ curl -X DELETE http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' {"key":"/apisix/routes/1","deleted":"1"}~ curl -X DELETE http://127.0.0.1:9180/apisix/admin/upstreams/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' {"key":"/apisix/upstreams/1","deleted":"1"}

插件

APISIX支持很多插件,以常见的流控插件为例

~ curl -X PUT http://127.0.0.1:9180/apisix/admin/routes/1 \     -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -i -d '{    "methods": ["GET"],    "uri": "/web1",    "plugins": {        "limit-count": {            "count": 2,            "time_window": 10,            "rejected_code": 503,            "key": "remote_addr"        },        "prometheus": {}    },    "upstream": {        "type": "roundrobin",        "nodes": {            "web1:80": 1        }    }}'HTTP/1.1 200 OK...

如上创建了一个路由,它使用了插件limit-count,参数表示每个远程地址每10秒钟最多请求两次,否则就会得到503错误。我们测试可以看到请求两次之后就开始报503错误,等待一会儿之后服务又恢复了

~ curl http://127.0.0.1:9080/web1                                                                hello web1%~ curl http://127.0.0.1:9080/web1hello web1%~ curl http://127.0.0.1:9080/web1<html><head><title>503 Service Temporarily Unavailable</title></head><body><center><h1>503 Service Temporarily Unavailable</h1></center><hr><center>openresty</center><p><em>Powered by <a href="https://apisix.apache.org/">APISIX</a>.</em></p></body></html>~ curl http://127.0.0.1:9080/web1<html><head><title>503 Service Temporarily Unavailable</title></head><body><center><h1>503 Service Temporarily Unavailable</h1></center><hr><center>openresty</center><p><em>Powered by <a href="https://apisix.apache.org/">APISIX</a>.</em></p></body></html>~ curl http://127.0.0.1:9080/web1hello web1%

与上游类似,我们也可以定义一个插件配置,之后在路由中直接使用

~ curl http://127.0.0.1:9180/apisix/admin/plugin_configs/1 \-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -i -d '{    "desc": "enable limit-count plugin",    "plugins": {        "limit-count": {            "count": 2,            "time_window": 10,            "rejected_code": 503        }    }}'HTTP/1.1 201 Created...{"key":"/apisix/plugin_configs/1","value":{"create_time":1706607965,"desc":"enable limit-count plugin","plugins":{"limit-count":{"count":2,"time_window":10,"key_type":"var","rejected_code":503,"policy":"local","allow_degradation":false,"show_limit_quota_header":true,"key":"remote_addr"}},"id":"1","update_time":1706607965}}

如上定义了一个id为1的插件,之后我们使用它构建一个路由

~ curl -X PUT http://127.0.0.1:9180/apisix/admin/routes/1 \    -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -i -d '{    "methods": ["GET"],    "uri": "/web1",    "upstream_id": "1",    "plugin_config_id": "1"}'HTTP/1.1 200 OK...{"key":"/apisix/routes/1","value":{"create_time":1706607103,"plugin_config_id":"1","priority":0,"update_time":1706608060,"methods":["GET"],"uri":"/web1","upstream_id":"1","status":1,"id":"1"}}

之后访问地址http://127.0.0.1:9080/web1的效果和前面是一样的。

Dashboard

apisix还可以使用Dashboard来管理路由,浏览器访问http://127.0.0.1:9000即可

默认的用户名和密码都是admin。登录之后我们就可以进行管理了,例如要新建一个路由

我们依次设置路由的名称、path、method以及上游信息

创建完成之后就可以在路由列表看到我们刚刚创建的路由了

之后访问我们刚刚创建的路由,和使用AdminAPI创建的效果是一样的

~ curl http://127.0.0.1:9080/web2hello web2

参考

APISIX 使用小记
https://apisix.apache.org/docs/apisix/admin-api/