在MacBook Pro(M1芯片)上部署Apinto開源網(wǎng)關(guān)

最近在學(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)行诵闭。如下圖

image.png

上圖僅展示了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锌俱,容器啟動失敗。

image.png

執(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é)果

image.png

訪問控制臺

image.png

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)行正常

image.png

Apinto-Dashboard綁定Apinto

雖然程序全部部署完成,但我發(fā)現(xiàn)好像兩個程序沒有交互唉窃,怎么保證Dashboard的配置能同步到Apinto呢耙饰?

為此,我再查了一下相關(guān)文檔纹份,發(fā)現(xiàn)還需要再新建集群并綁定節(jié)點榔幸,再花些時間在此記錄。

1矮嫉、點擊導(dǎo)航欄的基礎(chǔ)設(shè)施 -> 集群管理削咆,點擊新建集群

image.png

2、編輯集群配置后點擊測試

image.png

當(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)了援岩,先體驗一波再說歼狼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市享怀,隨后出現(xiàn)的幾起案子羽峰,更是在濱河造成了極大的恐慌,老刑警劉巖添瓷,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梅屉,死亡現(xiàn)場離奇詭異,居然都是意外死亡鳞贷,警方通過查閱死者的電腦和手機(jī)坯汤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搀愧,“玉大人惰聂,你說我怎么就攤上這事≡凵福” “怎么了搓幌?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長眷蚓。 經(jīng)常有香客問我鼻种,道長,這世上最難降的妖魔是什么沙热? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任叉钥,我火速辦了婚禮罢缸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘投队。我一直安慰自己枫疆,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布敷鸦。 她就那樣靜靜地躺著息楔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪扒披。 梳的紋絲不亂的頭發(fā)上值依,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機(jī)與錄音碟案,去河邊找鬼愿险。 笑死,一個胖子當(dāng)著我的面吹牛价说,可吹牛的內(nèi)容都是我干的辆亏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鳖目,長吁一口氣:“原來是場噩夢啊……” “哼扮叨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起领迈,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤彻磁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后惦费,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體兵迅,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年薪贫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刻恭。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡瞧省,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鳍贾,到底是詐尸還是另有隱情鞍匾,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布骑科,位于F島的核電站橡淑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏咆爽。R本人自食惡果不足惜梁棠,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一置森、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧符糊,春花似錦凫海、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至模闲,卻和暖如春建瘫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背尸折。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工啰脚, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人翁授。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓拣播,卻偏偏與公主長得像,于是被迫代替她去往敵國和親收擦。 傳聞我的和親對象是個殘疾皇子贮配,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容