Spring Cloud+docker實現微服務負載均衡
網上關於微服務實現負載均衡有不同的實現方式,有用ribbon,也有用zuul的,本文用zuul來實現
一般也稱Spring Cloud Zuul為微服務中的閘道器服務
微服務主要包含註冊與發現服務,路由服務(閘道器服務),配置服務,熔斷服務,降級服務等一系列的服務.
我們用註冊與發現服務,路由服務,應用App來搭建一個比較簡單的實現負載均衡的微服務
下面開始實現微服務負載均衡
1,搭建註冊與發現服務
直接到https://start.spring.io上建立SpringBoot專案,如下圖
然後把專案匯入eclipse之後,在pom.xml檔案中新增相關的jar包,如下
然後在Application啟動類中添加註解,如下
然後在配置檔案application.yml(application.properties)中新增,如下
注意,如果是application.yml檔案,則要留意裡面的縮排都是以2個空格鍵來的,不是以tab鍵
到此,註冊與發現服務就搭建好了,執行專案,瀏覽器輸入localhost:9999,如下
我們的註冊與發現服務已經執行起來了,上圖中紅框內的內容表示發現並註冊的服務,目前還沒有服務註冊進去,所以是空的
2,搭建一個叫microsoftA的應用App
一樣到https://start.spring.io建立SpringBoot專案,匯入到eclipse後修改pom.xml,如下
然後就是application啟動類,如下
注意:這裡不是@SpringBootApplication,而是@SpringCloudApplication
@SpringCloudApplication註解整合了以下多個註解:
@SpringBootApplication、@EnableDiscoveryClient、@EnableCircuitBreaker等
接著配置檔案application.properties,如下
新建一個controller,寫一個介面,如下
然後把這個應用App執行起來,這個時候再看下我們之前的註冊與發現服務頁面,如下
如上所示,我們的microsoftA應用已經註冊了,我們訪問剛才寫的介面,如下
3,搭建一個叫microsoftB的應用App
按照步驟2再新建一個專案,在配置檔案裡新增如下內容
也新建一個controller,如下
然後執行起來,再看下注冊與發現頁面,如下
修改下microsoftA的介面,如下
訪問介面,如下
4,搭建閘道器服務
同樣在https://start.spring.io新建專案,匯入eclipse,修改pom.xml如下
修改application啟動類,如下
修改配置檔案,如下
如上所示,path和serviceId實現了反向代理,那是負載均衡是如何實現的呢
我們按照之前的步驟在新建一個microsoftC應用,修改配置檔案,如下
如上所示,除了埠外,其他的配置都跟microsoftB一模一樣的,然後執行,再看看註冊與服務頁面,如下
上圖所示,新增了閘道器服務,還有一個埠為6000的microsoftB服務
註冊與發現服務會把註冊名稱相同的服務歸到一起,Spring Cloud Zuul閘道器服務,在做反向代理的時候如果發現該服務名稱下面
有多個埠的服務,則會挑選其中一個來訪問
在剛才訪問microsoftA服務介面的頁面修改下介面地址,如下
如上所示,我們訪問的閘道器的埠,返回的依然是microsoftB服務介面返回的資訊
我們再回到microsoftA服務的controller改下訪問microsoftB服務的介面地址,如下
這裡也要換成閘道器的埠,多次訪問microsoftA服務的介面,如下所示
這個時候微服務已經通過負載均衡來返回資料了
5,build成docker映象
把上面幾個專案的配置檔案都加上以下內容
eureka.instance.prefer-ip-address=true
eureka.instance.instance-id=伺服器的IP:埠
不加這兩句的話微服務之間會無法訪問,因為docker做了環境隔離
然後把jar包打成docker映象,具體讓發可以參考
http://blog.csdn.net/wsbgmofo/article/details/79088186
打成映象後把每個映象run成容器執行起來,然後按照上面的步驟把localhost換成伺服器地址埠即可
這裡有個問題,如果要用build成功的映象run多個容器出來,需要設定對應的埠引數
Dockerfile如下
run容器的時候,輸入以下命令
docker run -d -e PARAMS="-Dserver.port=3000 -Deureka.instance.instance-id=xxx:xxx:xxx:xxx:3000" -p 3000:3000 microsoft-d
這樣就可以run多個不同埠的容器註冊到微服務中