2025-01-02 18:37:24
whisper是一个由openai开发的通用语言识别模型,我们可以使用它来为视频自动创建字幕。
为了加速,我们需要使用GPU来进行计算,因此需要安装基于CUDA的pytorch。首先我们需要安装Miniconda,这里安装的时候直接点击下一步即可。
安装完毕之后,我们需要创建一个新的环境,这里我们创建一个名为whisper
的环境:
conda create -n whisper python=3.8conda activate whisper
安装好了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.94
和CUDA 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
根据自己下载的CUDA来选择对应版本的cuDNN,下载地址在这里。下载完毕之后解压到CUDA的安装目录下,一般来说是C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA{版本号}
,如果有重名的文件直接替换即可。
之后进入extras\demo_suite
目录,执行如下命令:
bandwidthTest.exedeviceQuery.exe
如果出现了PASS的字样,说明安装成功。
切换到我们之前创建的whisper
环境,使用如下命令安装CUDA版本的pytorch:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
安装之后执行python命令进入python环境,执行如下代码:
1 |
import torch |
如果显示True则说明CUDA版本的pytorch安装成功。
切换到我们之前创建的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 |
import whisper |
如上代码表示使用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视频合并、格式转换、截图
2024-06-18 18:13:25
1 |
find *.mp4 | sed 's:\ :\\\ :g'| sed 's/^/file /' > fl.txt |
1 |
// 视频使用h.264编码,声音使用aac编码 |
crf越小,视频质量越高;crf越大,视频文件越小
编码参数也可以简写,从-vcodec
和-acodec
改为-c:v
和-c:a
:
1 |
ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4 |
其中AVC/H264
和HEVC/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 |
合并视频和声音,视频使用原始编码,声音改为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 |
ffmpeg -i image.jpeg -vf scale=413:626 2寸.jpeg |
将一个音频重复10次
1 |
ffmpeg -stream_loop 10 -i input.m4a -c copy output.m4a |
2024-01-24 19:27:14
我们在日常工作中经常会使用到很多的开源项目,开源也是一个在工作和学习中都离不开的内容。一般来说,开源项目可以选择直接开源,也可以选择捐赠给某些基金会,例如Linux Foundation、CNCF和ASF等等。以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了。一般来说开源项目都会有多种类型的改动,以apisix为例,它限制了PR可以为固定的几种类型:
featfixdocsstylerefactorperftestbuildcichorerevertchange
包含了文档修改、新功能、bug修复等等,我们选择比较简单的文档修改作为第一个PR。我在使用APISIX的过程中,发现它证书相关的文档中存在一个错误
在上图中,这里的地址不应该是/hello
而应该是/get
,因此我们可以在本地仓库新建一个分支并对这个问题作出修改。修改后我们将这次改动提交(为了使提交更加的清晰和安全,建议合并commit并对commit进行签名)并push到我们自己的远程仓库,随后在GitHub上面创建一个针对原始仓库的Pull Request。一般项目在创建一个PR的时候都会有模板信息,照着模板信息进行填写即可,填写完毕就可以提交PR并等待项目的成员进行处理了
在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了。
apisix使用GitHub的workflow进行CI执行测试,以redhat-ci.yaml为例,它会在多个平台上执行多个文件夹内的测试。
1 |
jobs: |
如上所示,GitHub action中的matrix默认会对其下面的的多个选项进行合并,例如redhat-ci.yaml
的events_module
和test_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_pkey
和aes_decrypt_pkey
方法中的field
字段去掉。我一开始在写代码的时候就发现这个字段去掉会导致数据加解密过程中ssl
和data
的行为不一致,可能导致错误。不过管理员让我放心删,没问题,本着信任的态度我就把参数删除掉了
但是删除掉了之后测试却怎么也跑不过,我因为非常信任社区管理员也没有怀疑是因为ssl
和data
逻辑不一致导致的,而是从其它地方入手进行排查。最终花了大量的时间经过了很多**的排查之后,发现其实就是因为ssl
和data
的行为逻辑不一致导致的。我随后询问了管理员,并且把field
参数加了回来
把field
参数加回来之后,所有的test cases就都能跑过了
所有测试用例通过,一段时间之后PR被review没有问题,就会被合并到master分支了
Revolution OS
S04E00-吴晟:开源项目进入 Apache 孵化器意味着什么
Apache 是如何运作的?
新手如何快速参与开源项目
如何从小白成长为 Apache Committer?
在执行install-dependencies.sh
脚本的时候,会下载golang的依赖,比如gRPC-Go,这里需要保证网络能够顺畅访问golang的官方仓库。
为了保证test-nginx正常安装,需要网络顺畅,能够正常访问相关资源。
2024-01-06 06:00:22
最近需要远程访问一台虚拟机内的Linux,因为虚拟机没有公网IP,因此选择使用frp转发ssh流量的方式来实现远程访问。首先访问frp的release页面并根据操作系统和CPU下载相应的版本,之后解压得到frpc
和frps
文件。
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个配置
ssh代表了进行ssh转发的设置,它的含义如下
有了如上的配置之后,我们可以在远程主机上使用该配置启动frps
./frps -c ./frps.ini
需要注意远程主机的10625和10626端口需要关闭防火墙的设置,以保证可以通过外部进行访问。之后启用本地的客户端
./frpc -c ./frpc.ini
本地机器如果没有安装ssh服务,则需要先安装ssh服务。启动了服务端和客户端之后,可以在服务端看到客户端成功连接的日志信息,之后通过
ssh [email protected] -p 10626
命令就可以成功访问虚拟机内Linux的ssh服务了,整个网络流程大致如下
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)
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个容器,分别是:
接下来我们可以测试一下apisix
~ curl http://127.0.0.1:9180/apisix/admin/routes -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' {"total":0,"list":[]}
如上命令用于查看apisix的所有路由信息,使用默认的API-KEY
。
路由用于通过规则匹配客户端的请求,并根据请求加载相应的插件,最后将请求转发到指定的上游服务。由此可知路由由三部分组成
method
、host
、uri
等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)
~ 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
的效果和前面是一样的。
apisix还可以使用Dashboard来管理路由,浏览器访问http://127.0.0.1:9000即可
默认的用户名和密码都是admin
。登录之后我们就可以进行管理了,例如要新建一个路由
我们依次设置路由的名称、path、method以及上游信息
创建完成之后就可以在路由列表看到我们刚刚创建的路由了
之后访问我们刚刚创建的路由,和使用AdminAPI创建的效果是一样的
~ curl http://127.0.0.1:9080/web2hello web2