最近在學(xué)習(xí)API網(wǎng)關(guān)的知識,查詢資料了解到了Apinto開源網(wǎng)關(guān),抱著學(xué)習(xí)的態(tài)度部署Apinto開源網(wǎng)關(guān)來玩一下。
看官方介紹推薦部署在Linux服務(wù)器奄抽,成本太高,先部署在本地玩玩吧甩鳄,在此做一些記錄逞度。
部署步驟
從github上,了解到我們需要部署兩個產(chǎn)品
Apinto:API開源網(wǎng)關(guān)節(jié)點娩贷,提供OpenAPI進(jìn)行網(wǎng)關(guān)配置第晰,負(fù)責(zé)代理請求等核心網(wǎng)關(guān)功能。
Apinto-Dashboard:Apinto可視化控制臺彬祖,通過OpenAPI與Apinto進(jìn)行配置交互茁瘦。
部署Apinto-Dashboard
在這里,我使用docker-compose
進(jìn)行一鍵部署储笑,官方提供的docker-compose.yml
文件內(nèi)容如下
version: '3'
services:
mysql:
image: mysql:5.7.21
privileged: true
restart: always
container_name: apinto_mysql
hostname: apinto_mysql
ports:
- "33306:3306"
environment:
- MYSQL_ROOT_PASSWORD={MYSQL_PWD}
- MYSQL_DATABASE=apinto
volumes:
- /var/lib/apinto/mysql:/var/lib/mysql
networks:
- apinto
apinto-dashboard:
image: eolinker/apinto-dashboard
container_name: apinto-dashboard
privileged: true
restart: always
networks:
- apinto
ports:
- "18080:8080"
depends_on:
- mysql
- redis_cluster
environment:
- MYSQL_USER_NAME=root
- MYSQL_PWD={MYSQL_PWD}
- MYSQL_IP=apinto_mysql
- MYSQL_PORT=3306 #mysql端口
- MYSQL_DB="apinto"
- ERROR_DIR=/apinto-dashboard/work/logs # 日志放置目錄
- ERROR_FILE_NAME=error.log # 錯誤日志文件名
- ERROR_LOG_LEVEL=info # 錯誤日志等級,可選:panic,fatal,error,warning,info,debug,trace 不填或者非法則為info
- ERROR_EXPIRE=7d # 錯誤日志過期時間甜熔,默認(rèn)單位為天,d|天突倍,h|小時, 不合法配置默認(rèn)為7d
- ERROR_PERIOD=day # 錯誤日志切割周期腔稀,僅支持day盆昙、hour
- REDIS_ADDR=172.100.0.1:7201,172.100.0.1:7202,172.100.0.1:7203,172.100.0.1:7204,172.100.0.1:7205,172.100.0.1:7206 #Redis集群地址 多個用,隔開
- REDIS_PWD={REDIS_PWD} # Redis密碼
volumes:
- /var/log/apinto/apinto-dashboard/work:/apinto-dashboard/work #掛載log到主機(jī)目錄
redis_cluster:
container_name: redis_cluster
image: eolinker/cluster-redis:6.2.7
hostname: redis_cluster
privileged: true
restart: always
environment:
- REDIS_PWD={REDIS_PWD}
- PORT=7201
- HOST={HOST}
volumes:
- /var/lib/apinto/redis-cluster/data:/usr/local/cluster_redis/data
network_mode: host
networks:
apinto:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.100.0.0/24
在Mac M1上運(yùn)行docker,有幾點我們需要注意
1焊虏、新增配置platform: linux/amd64
由于鏡像的基礎(chǔ)運(yùn)行架構(gòu)是linux/amd64
淡喜,在文件配置時,我們需要加上platform: linux/amd64
才能保證鏡像在Mac M1上運(yùn)行诵闭。如下圖
上圖僅展示了apinto-dashboard的修改炼团,剩余兩個容器也應(yīng)該做此修改。
2疏尿、將容器掛載目錄改為當(dāng)前用戶可讀寫的目錄
由于Mac文件夾權(quán)限的限制瘟芝,防止鏡像啟動失敗,我們需要修改容器的掛載目錄為當(dāng)前用戶可讀寫的目錄褥琐。
掛載路徑如下:
mysql容器:
./apinto/mysql:/var/lib/mysql
apinto-dashboard容器:
./apinto/apinto-dashboard/work:/apinto-dashboard/work
redis_cluster容器:
./apinto/redis-cluster/data:/usr/local/cluster_redis/data
部署遇到的問題
若按照官方教程部署鏡像mysql:5.7.21
锌俱,容器啟動失敗。
執(zhí)行命令查看報錯:
docker logs apinto_mysql
報錯信息如下:
runtime: failed to create new OS thread (have 2 already; errno=22)
fatal error: newosproc
runtime stack:
runtime.throw(0x524da0, 0x9)
/usr/local/go/src/runtime/panic.go:527 +0x90
runtime.newosproc(0xc82002a000, 0xc820039fc0)
/usr/local/go/src/runtime/os1_linux.go:150 +0x1ab
runtime.newm(0x555ce8, 0x0)
/usr/local/go/src/runtime/proc1.go:1105 +0x130
runtime.main.func1()
/usr/local/go/src/runtime/proc.go:48 +0x2c
runtime.systemstack(0x5c4300)
/usr/local/go/src/runtime/asm_amd64.s:262 +0x79
runtime.mstart()
/usr/local/go/src/runtime/proc1.go:674
goroutine 1 [running]:
runtime.systemstack_switch()
/usr/local/go/src/runtime/asm_amd64.s:216 fp=0xc820024770 sp=0xc820024768
runtime.main()
/usr/local/go/src/runtime/proc.go:49 +0x62 fp=0xc8200247c0 sp=0xc820024770
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1696 +0x1 fp=0xc8200247c8 sp=0xc8200247c0
runtime: failed to create new OS thread (have 2 already; errno=22)
fatal error: newosproc
runtime stack:
runtime.throw(0x524da0, 0x9)
/usr/local/go/src/runtime/panic.go:527 +0x90
runtime.newosproc(0xc82002a000, 0xc820039fc0)
/usr/local/go/src/runtime/os1_linux.go:150 +0x1ab
runtime.newm(0x555ce8, 0x0)
/usr/local/go/src/runtime/proc1.go:1105 +0x130
runtime.main.func1()
/usr/local/go/src/runtime/proc.go:48 +0x2c
runtime.systemstack(0x5c4300)
/usr/local/go/src/runtime/asm_amd64.s:262 +0x79
runtime.mstart()
/usr/local/go/src/runtime/proc1.go:674
goroutine 1 [running]:
runtime.systemstack_switch()
/usr/local/go/src/runtime/asm_amd64.s:216 fp=0xc820024770 sp=0xc820024768
runtime.main()
/usr/local/go/src/runtime/proc.go:49 +0x62 fp=0xc8200247c0 sp=0xc820024770
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1696 +0x1 fp=0xc8200247c8 sp=0xc8200247c0
runtime: failed to create new OS thread (have 2 already; errno=22)
fatal error: newosproc
runtime stack:
runtime.throw(0x524da0, 0x9)
/usr/local/go/src/runtime/panic.go:527 +0x90
runtime.newosproc(0xc82002a000, 0xc820039fc0)
/usr/local/go/src/runtime/os1_linux.go:150 +0x1ab
runtime.newm(0x555ce8, 0x0)
/usr/local/go/src/runtime/proc1.go:1105 +0x130
runtime.main.func1()
/usr/local/go/src/runtime/proc.go:48 +0x2c
runtime.systemstack(0x5c4300)
/usr/local/go/src/runtime/asm_amd64.s:262 +0x79
runtime.mstart()
/usr/local/go/src/runtime/proc1.go:674
goroutine 1 [running]:
runtime.systemstack_switch()
/usr/local/go/src/runtime/asm_amd64.s:216 fp=0xc820024770 sp=0xc820024768
runtime.main()
/usr/local/go/src/runtime/proc.go:49 +0x62 fp=0xc8200247c0 sp=0xc820024770
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1696 +0x1 fp=0xc8200247c8 sp=0xc8200247c0
runtime: failed to create new OS thread (have 2 already; errno=22)
fatal error: newosproc
runtime stack:
runtime.throw(0x524da0, 0x9)
/usr/local/go/src/runtime/panic.go:527 +0x90
runtime.newosproc(0xc82002a000, 0xc820039fc0)
/usr/local/go/src/runtime/os1_linux.go:150 +0x1ab
runtime.newm(0x555ce8, 0x0)
/usr/local/go/src/runtime/proc1.go:1105 +0x130
runtime.main.func1()
/usr/local/go/src/runtime/proc.go:48 +0x2c
runtime.systemstack(0x5c4300)
/usr/local/go/src/runtime/asm_amd64.s:262 +0x79
runtime.mstart()
/usr/local/go/src/runtime/proc1.go:674
goroutine 1 [running]:
runtime.systemstack_switch()
/usr/local/go/src/runtime/asm_amd64.s:216 fp=0xc820024770 sp=0xc820024768
runtime.main()
/usr/local/go/src/runtime/proc.go:49 +0x62 fp=0xc8200247c0 sp=0xc820024770
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1696 +0x1 fp=0xc8200247c8 sp=0xc8200247c0
runtime: failed to create new OS thread (have 2 already; errno=22)
fatal error: newosproc
runtime stack:
runtime.throw(0x524da0, 0x9)
/usr/local/go/src/runtime/panic.go:527 +0x90
runtime.newosproc(0xc82002a000, 0xc820039fc0)
/usr/local/go/src/runtime/os1_linux.go:150 +0x1ab
runtime.newm(0x555ce8, 0x0)
/usr/local/go/src/runtime/proc1.go:1105 +0x130
runtime.main.func1()
/usr/local/go/src/runtime/proc.go:48 +0x2c
runtime.systemstack(0x5c4300)
/usr/local/go/src/runtime/asm_amd64.s:262 +0x79
runtime.mstart()
/usr/local/go/src/runtime/proc1.go:674
goroutine 1 [running]:
runtime.systemstack_switch()
/usr/local/go/src/runtime/asm_amd64.s:216 fp=0xc820024770 sp=0xc820024768
runtime.main()
/usr/local/go/src/runtime/proc.go:49 +0x62 fp=0xc8200247c0 sp=0xc820024770
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1696 +0x1 fp=0xc8200247c8 sp=0xc8200247c0
頭疼.....M1芯片好多怪事......應(yīng)該是版本不兼容敌呈,那換一個最新的鏡像試試贸宏,將mysql鏡像改成了mysql:5.7.34
重啟執(zhí)行docker-compose命令
docker-compose up -d
運(yùn)行docker ps
命令查看執(zhí)行結(jié)果
訪問控制臺
Docker-Compose完整配置
docker-compose.yml
完整文件示例如下
version: '3'
services:
mysql:
image: mysql:5.7.34
privileged: true
platform: linux/amd64
restart: always
container_name: apinto_mysql
hostname: apinto_mysql
ports:
- "33306:3306"
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=apinto
volumes:
- ./apinto/mysql:/var/lib/mysql
networks:
- apinto
apinto-dashboard:
image: eolinker/apinto-dashboard
container_name: apinto-dashboard
privileged: true
platform: linux/amd64
restart: always
networks:
- apinto
ports:
- "18080:8080"
depends_on:
- mysql
- redis_cluster
environment:
- MYSQL_USER_NAME=root
- MYSQL_PWD=123456
- MYSQL_IP=apinto_mysql
- MYSQL_PORT=3306 #mysql端口
- MYSQL_DB="apinto"
- ERROR_DIR=/apinto-dashboard/work/logs # 日志放置目錄
- ERROR_FILE_NAME=error.log # 錯誤日志文件名
- ERROR_LOG_LEVEL=info # 錯誤日志等級,可選:panic,fatal,error,warning,info,debug,trace 不填或者非法則為info
- ERROR_EXPIRE=7d # 錯誤日志過期時間,默認(rèn)單位為天驱富,d|天锚赤,h|小時, 不合法配置默認(rèn)為7d
- ERROR_PERIOD=day # 錯誤日志切割周期,僅支持day褐鸥、hour
- REDIS_ADDR=172.100.0.1:7201,172.100.0.1:7202,172.100.0.1:7203,172.100.0.1:7204,172.100.0.1:7205,172.100.0.1:7206 #Redis集群地址 多個用,隔開
- REDIS_PWD=123456 # Redis密碼
volumes:
- ./apinto/apinto-dashboard/work:/apinto-dashboard/work #掛載log到主機(jī)目錄
redis_cluster:
container_name: redis_cluster
image: eolinker/cluster-redis:6.2.7
platform: linux/amd64
hostname: redis_cluster
privileged: true
restart: always
environment:
- REDIS_PWD=123456
- PORT=7201
- HOST=127.0.0.1
volumes:
- ./apinto/redis-cluster/data:/usr/local/cluster_redis/data
network_mode: host
networks:
apinto:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.100.0.0/24
部署Apinto
官方提供了安裝包和docker兩種方式部署,我這里還是繼續(xù)選擇使用安裝包來部署Apinto節(jié)點赐稽。
1叫榕、下載Apinto安裝包并解壓
由于Mac M1芯片是ARM64
架構(gòu),因此我這里選擇下載apinto_v0.12.4_darwin_arm64.tar.gz
wget https://github.com/eolinker/apinto/releases/download/v0.12.4/apinto_v0.12.4_darwin_arm64.tar.gz && tar -zxvf apinto_v0.12.4_darwin_arm64.tar.gz && cd apinto
更多版本安裝包可以訪問網(wǎng)址:https://github.com/eolinker/apinto/releases/tag 進(jìn)行獲取
2姊舵、編輯運(yùn)行配置文件apinto.yml
執(zhí)行編輯文件命令
vi apinto.yml
文件內(nèi)容
# 數(shù)據(jù)文件放置目錄
data_dir: ./work/data
# pid文件放置地址
pid_dir: ./work/run
# 日志放置目錄
log_dir: ./work/log
# socket放置目錄
socket_dir: ./work/socket
# apinto運(yùn)行配置地址
config: config.yml
# 擴(kuò)展倉庫目錄
extends_dir: ./work/extenders/
# 錯誤日志文件名
error_log_name: error.log
# 錯誤日志等級
error_log_level: error
# 錯誤日志過期時間晰绎,默認(rèn)單位為天,d|天括丁,h|小時
error_log_expire: 7d
# 錯誤日志切割周期荞下,僅支持day、hour
error_log_period: day
編輯完成后史飞,保存到當(dāng)前目錄尖昏。
3、編輯配置文件config.yml
執(zhí)行編輯文件命令
vi config.yml
文件內(nèi)容
version: 2
#certificate: # 證書存放根目錄
# dir: /etc/apinto/cert
client:
#advertise_urls: # open api 服務(wù)的廣播地址
#- http://127.0.0.1:9400
listen_urls: # open api 服務(wù)的監(jiān)聽地址
- http://0.0.0.0:9400
#certificate: # 證書配置构资,允許使用ip的自簽證書
# - cert: server.pem
# key: server.key
gateway:
#advertise_urls: # 轉(zhuǎn)發(fā)服務(wù)的廣播地址
#- http://127.0.0.1:9400
listen_urls: # 轉(zhuǎn)發(fā)服務(wù)的監(jiān)聽地址
- https://0.0.0.0:8099
- http://0.0.0.0:8099
peer: # 集群間節(jié)點通信配置信息
listen_urls: # 節(jié)點監(jiān)聽地址
- http://0.0.0.0:9401
#advertise_urls: # 節(jié)點通信廣播地址
# - http://127.0.0.1:9400
#certificate: # 證書配置抽诉,允許使用ip的自簽證書
# - cert: server.pem
# key: server.key
編輯完成后,保存到當(dāng)前目錄吐绵。
4迹淌、啟動程序
./apinto start
查看執(zhí)行結(jié)果
ps -ef | grep apinto
得到下圖所示結(jié)果河绽,運(yùn)行正常
Apinto-Dashboard綁定Apinto
雖然程序全部部署完成,但我發(fā)現(xiàn)好像兩個程序沒有交互唉窃,怎么保證Dashboard的配置能同步到Apinto呢耙饰?
為此,我再查了一下相關(guān)文檔纹份,發(fā)現(xiàn)還需要再新建集群并綁定節(jié)點榔幸,再花些時間在此記錄。
1矮嫉、點擊導(dǎo)航欄的基礎(chǔ)設(shè)施
-> 集群管理
削咆,點擊新建集群
2、編輯集群配置后點擊測試
當(dāng)測試通過后點擊保存蠢笋,集群便新建完成拨齐。
注意:由于Dashboard是容器運(yùn)行,Apinto是在宿主機(jī)上運(yùn)行昨寞,因此Dashboard需要使用docker.for.mac.host.internal
才可以訪問宿主機(jī)的端口
總結(jié)
雖然因為Mac M1的奇奇怪怪的兼容問題瞻惋,安裝部署花了點時間,接下來就可以繼續(xù)深入使用Apinto開源網(wǎng)關(guān)了援岩,先體驗一波再說歼狼。