Docker+Dubbo+Zookeeper+Nginx+Springboot負載均衡整合記錄

上一篇博客提到第一個考覈任務是做一個發送短信的接口,接口要求防刷,也就是防止被短信轟炸軟件來調用

我所想到的策略和實現在上一篇博客中寫到了,經過第一次答辯後,又提出了一些新的要求和問題

大致如下:

1.Redis做緩存 掛掉了怎麼辦 所以還是要走數據庫 我的解決是在調用接口時 ping一下redis 如果連接正常會回pong 這樣就走緩存 不然就走數據庫 但是感覺有點呆  改成了try中走redis catch中走mysql 然後設置

spring.redis.timeout 稍微短一點

不然在redis掛掉之後 一條請求來會多次重新連接redis 處理速度很慢 

2.短信發送可以做成一個服務提供者 供不同的消費者來調用 比如註冊時 修改密碼時等等 這個在之前已經做了 但是不夠完善

3.在上一步的基礎上 將服務集羣化 部署2個以上的服務提供者 用docker搭載 然後做負載均衡

還有一些其他的代碼 接口 日誌不是很規範的問題

所以這周的主要任務就是:Docker+Dubbo+Zookeeper+Nginx+Springboot全部都要整合到一起

剛開始的時候我確實是wdnmd我不打了我崩潰了 因爲除了springboot在學校裏自己做項目的時候用到過 別的這些名詞只是大致知道是幹什麼用的 把他們之間的作用、關係理清楚 最後成功跑起來 還因爲這周有很多的歡迎活動...所以一共差不多就3天的寫代碼和學習時間 讓我這個混子感覺到了巨大的壓力 

之前所有對於“分佈式”“微服務”的瞭解 都只是偶爾看到幾篇博客 還有李智慧的那本《大型網站》 看的時候也是當個科普書籍看的

說了很多廢話 下面還是直接進入正題 我會記錄一些關鍵步驟和我當時參考的其他博客 後續的代碼會發到github上

 

在整合之前首先還是要搞清楚他們之間的作用和整合的順序

首先項目是用Springboot編寫的 緩存使用Redis 數據庫MySQL 用了一個消息隊列 不過這個不關鍵

接下來是dubbo和zk這兩個的整合

具體的步驟是:

1.編寫公共的接口項目 其中實體類記得要繼承序列化接口

2.將這個項目 先用maven install打成jar包 之後用maven把這個jar包註冊到本地倉庫(關鍵) 指令是

mvn install:install-file -Dfile=XXXX.jar -DgroupId=XXXX -DartifactId=XXXXX -Dversion=XXXX -Dpackaging=jar

其中Dfile 如果你在這個jar的目錄下使用mvn指令 那就只用輸入jar包的名字交了 剩下的groupid artifactid 版本 都是後續你引入這個jar包時的標誌

這一部分具體可以參考:

https://www.cnblogs.com/darling2047/p/9681181.html

https://blog.csdn.net/lixiaoxiong55/article/details/85936260

注意點是 引入了公共接口的實體類和服務後 記得把原來項目中import自身的依賴全部改成公共接口項目的依賴

因爲很多人都是先寫好一個項目之後再改造成服務提供者 還有就是 暴露服務的Service註解 引入的是dubbo裏的依賴 不要引入成spring裏面的註解 將這個接口用dubbo的service註解暴露後 就不能再直接訪問這個服務了 

3.編寫好項目後 把項目放到docker上 這一步我的操作是需要先將寫好的這個項目(包括提供者也包括消費者)打成jar包 所以最好一次到位 不然改一下又要重新打- -

這裏要注意的點是:假如單獨把一個springboot項目放到docker上 而不把使用到的redis mysql 消息隊列中心 等等需要寫ip和端口的組件放到docker上 即:試圖讓docker中運行的項目去訪問宿主機上的信息 那麼ip肯定不能寫localhost 也不能寫127.0.0.1 因爲這會讓項目去訪問容器自身 解決辦法可以百度“docker訪問宿主機” 

不過由於公司滴電腦我是不關的 所以可以有一個最簡單的解決辦法 就是直接ipconfig獲取本機ip 然後在所有填寫ip的地方填寫該ip 這一做法是親測有效的

接下來要注意的就是mysql需要開啓遠程連接 百度一下兩步就行

4.放到docker上的項目註冊到zookeeper  記得把springboot對dubbo配置中的zk地址改好 再跑到docker上

這裏我使用的是idea自帶的docker來操作的 因爲更方便看到控制檯 

按照這篇博客即可:https://www.cnblogs.com/hsz-csy/p/9183946.html

最後可以先不用把idea裏的鏡像停掉 繼續下一步

5.接下來是負載均衡 dubbo已經在服務層面上做了負載均衡 可以跑2個同樣的provider 稍微做一點標記 比如provider1被調用 就在控制檯輸出1 或者打到日誌裏 然後用1個消費者去調用 會發現dubbo自己會選擇一個provider來服務

而nginx是在http web層就進行了負載均衡

關於nginx的入門可以參考https://www.cnblogs.com/memoryXudy/p/7778101.html

這篇博客裏面的配置文件除了第一行的

是顯示錯誤 其他的可以完全拷貝過去 覆蓋原config文件

另外建議每次更改config之後 直接任務管理器關掉nginx的進程再重啓 因爲我用reload指令總是沒用 我也不知道爲什麼

6.最後的構成是:

2個provider 運行在docker中 並在dubbo中註冊 這兩個provider 除了名字和一點標誌性的輸出不一樣外都是一樣的

這個consumer1 其實是兩個同名的消費者 

然後用nginx來分配他們兩個端口

我使用的是:

前者是docker映射端口 後者是本機端口

nginx配置的是前者 

之後測試:

我在dubboadmin中配置了我這個服務的負載策略是輪詢 所以每4次調用的順序是 con1pro1 con2pro1 con1pro2 con2pro2這樣

最後是這麼多東西的打開順序

1.先開zk 我用的是3.5.5版本的 管理員cmd下進入bin 然後zkServer

2.再開dubboadmin 我直接是java -jar來開那個jar包的 

3.開兩個provider 之後看一下dubboadmin中提供者數量是否正確

4.開兩個consumer consumer要在provider之後開啓 不然會找不到服務提供者 在之前用maven打包的時候

 也可以用mvn package -DskipTests來打包 我在直接打包的時候Test是無法通過的 因爲此時provider在容器內 而consumer沒有進入docker 所以提示找不到服務 這裏直接跳過test就好了 跑到docker上之後是沒問題的

5.開nginx 最後測試即可

高強度四處抄作業 真滴累

代碼實在有點亂 稍微整理一下再放到github上

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章