天天看點

springboot連接配接基于docker搭建的redis叢集

祝願明天考研的同學都能考上

環境:win10 /Docker for windows/docker redis叢集

由于redis叢集每次重新cluster nodes會更新spring boot配置的spring.redis.cluster.nodes。docker容器與本地主控端不在同一個網段下面,更新會導緻nodes不可達,是以需要在路由表裡面加一個路由。

實作容器内網通過獨立ip直接通路

如何在docker for windows的環境下搭建redis叢集,

然後,我開始我的正文

上次在​​docker for windows的環境下搭建redis的叢集​​裡面,我是建立了一個docker network,然後将叢集放到裡面。這次我做了一點修改,直接在預設的docker環境中搭建好了叢集,搭建的叢集預設的ip網段是172.17.0.0/16 。為了和上述教程保持一緻,是以做了這一個修改。

簡單描述一下建構過程:假定根據docker for windows的環境下搭建redis的叢集教程,已經建立了兩個自定義的docker image

springboot連接配接基于docker搭建的redis叢集

然後可以使用下面的指令,建立一個基于docker預設網段172.17.0.0/16的redis叢集

# 建立6個redis節點 和 叢集排程節點(ruby2)
docker run -d -p 7001:6379 --name r1 redis-cluster
docker run -d -p 7002:6379 --name r2 redis-cluster
docker run -d -p 7003:6379 --name r3 redis-cluster
docker run -d -p 7004:6379 --name r4 redis-cluster
docker run -d -p 7005:6379 --name r5 redis-cluster
docker run -d -p 7006:6379 --name r6 redis-cluster
docker run --name ruby2 -i -d ruby-redis      
# 進入ruby2容器的shell界面中
docker exec -it ruby2 /bin/bash      
# 安裝redis的ruby插件
gem install redis --version 3.0.7      

然後進入windows環境執行 docker inspect 容器名,檢視6個節點在網段中的ip,用于Ruby2容器打開對redis叢集的監管。

springboot連接配接基于docker搭建的redis叢集

得到6個節點的ip位址之後,切換到ruby2容器的shell指令操作台

# 6379端口号是redis服務的預設端口号
./redis-trib.rb  create --replicas 1  172.17.0.3:6379 172.17.0.9:6379 172.17.0.7:6379 172.17.0.6:6379 172.17.0.5:6379 172.17.0.4:6379      

此時,沒有密碼的叢集就搭建好了。為了能讓springboot能夠有效連接配接到redis,我們需要給redis叢集設定密碼。分别使用下列指令,進入6個節點:

# 進入6個 redis 節點
docker exec -it r1 /bin/bash
docker exec -it r2 /bin/bash
docker exec -it r3 /bin/bash
docker exec -it r4 /bin/bash
docker exec -it r5 /bin/bash
docker exec -it r6 /bin/bash      

均執行

# 進入redisclient
redis-cli -c
# 修改密碼,注意每個節點的密碼應該保持相等
config set masterauth kexuejia123
config set requirepass kexuejia123
auth kexuejia123
config rewrite      

進入到ruby2容器,前往配置檔案修改叢集密碼:

docker exec -it ruby2 /bin/bash
apt-get update
apt-get install vim
# 查找配置檔案client.rb所在目錄
find / -name 'client.rb'
# 進入client.rb所在目錄,然後執行
vi client.rb      

将password那一項修改成你的密碼,我的就是 password = “kexuejia123”。

然後 ESC,wq 儲存退出。

然後前往spring boot的配置檔案配置:

# redis叢集相關
spring.redis.password=kexuejia123
spring.redis.database=0
spring.redis.cluster.nodes=127.0.0.1:7001,127.0.0.1:7002,127.0.0.1:7003,127.0.0.1:7004,127.0.0.1:7005,127.0.0.1:7006
spring.redis.timeout=6000ms      

現在打開服務,用postman調用接口,可以發現連接配接逾時。引起的原因是 spring-boot-starter-data-redis 包在每次查詢節點的時候會将 執行cluster nodes後的ip和端口更新到 spring.redis.cluster.nodes 中,進而使得配置的 spring.redis.cluster.nodes 失效,讓我們來看看,如果執行 cluster nodes會傳回什麼結果

springboot連接配接基于docker搭建的redis叢集

傳回的ip位址是在docker預設網段中的ip:port ,例如,當windows環境中去請求新的 spring.redis.cluster.nodes 中的 172.17.0.3:6379時候,就找不到172.17.0.3 這個 ip到底在哪裡,是以這裡必須得給windows一個指引,也就是向路由表裡面寫入一條路由。我們知道,docker在建立的時候,暴露了一張網卡給我們

springboot連接配接基于docker搭建的redis叢集

看見一個名為:DockerNAT的網絡擴充卡就是docker 内部網段和宿主之間的橋梁了。

# 添加一條路由資訊,使得windows發出的172.17.0.0/16的包會丢到docker 中
route -p add 172.17.0.0 MASK 255.255.255.0 10.0.75.2      

然後使用 route print -4 檢視目前的路由表資訊

springboot連接配接基于docker搭建的redis叢集

發現已經添加進去了,然後 用 ping 指令檢視

springboot連接配接基于docker搭建的redis叢集

可以 ping 通了

然後打開項目和postman,測試登入接口:

springboot連接配接基于docker搭建的redis叢集

到叢集節點檢視

springboot連接配接基于docker搭建的redis叢集

已經插入進入了。然後再次發起請求:

springboot連接配接基于docker搭建的redis叢集

繼續閱讀