随着微服務應用架構的興起,目前很多使用者在開發測試生産上已經采用微服務的理念進行應用的架構設計及部署。常用的架構比如dubbo,springcloud等都已經在大規模進行使用了。目前kubernetes雲原生應用的最佳部署平台,如何将線下的微服務應用遷移到kubernetes成為使用者的一個難題,本文将以springboot+dubbo為例進行遷移的方案介紹。
1 典型的spring+dubbo例子
1.1 環境及工具
運作環境:JDK 8,Maven 3.3
技術棧:springboot 2.0,dubbo 2.6,zookeeper 3.3
工具:IntelliJ IDEA
1.2 Springboot快速內建dubbo的挂件依賴
Dubbo采用全Spring配置方式,透明化接入應用,對應用沒有任何API侵入,隻需用Spring加載Dubbo的配置即可,Dubbo基于Spring的Schema擴充進行加載。
本例中dubbo采用zookeeper作為注冊中心。Dubbo及zookeeper的安裝方式請參考官方指導。
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
1.3 服務提供者和消費者示例代碼
1.3.1 dubbo服務注冊及消費流程
在使用dubbo的時候需要清除服務提供者(provider)和服務消費者(consumer)。流程如下:
1.
服務提供者在服務啟動的時候向注冊中心注冊自己提供的服務;
2.
服務消費者在啟動的時候向注冊中心注冊自己所需的服務;
3.
注冊中心傳回服務提供者位址清單給消費者,如果有變更,注冊中心将基于長連接配接推送變更資料給消費者;
4.
服務消費者,從提供者位址清單中,基于軟負載均衡算法,選一台提供者進行調用,如果調用失敗,再選另一台調用;
5.
服務消費者和提供者,在記憶體中累計調用次數和調用時間,定時每分鐘發送一次統計資料到監控中心。
1.3.2 目錄結構
Dubbo-api裡面定義了服務接口,由服務提供者和服務消費者共同調用;
Dubbo-consumer中定義了一個提供外部url通路的類,并且在該類中實作了從dubbo中的消費接口。
Dubbo-provider中定義了向dubbo注冊的服務。
1.3.3 定義服務接口
定義的服務接口在服務提供者和服務消費者中共同使用。
1.3.4 服務提供方
在服務提供方實作服務接口,該接口的實作方式對消費者是隐藏的。簡單來說就是将上面接口的實作方法(稱之為服務)注冊到zookeeper上,并暴露端口供其他消費者消費。@Service裡面的一些資訊就是服務具體的注冊位址。
服務提供方與dubbo的配置如下;
1.3.5 服務消費方
服務消費方主要完成服務接口的調用,調用方式與本地調用是一樣的,但是服務的位址來自于注冊在dubbo上的遠端位址。
服務消費方的配置與服務提供方的配置基本一緻:
1.3.6 啟動服務提供者和服務消費者
在本示例中,服務提供者接收到調用請求會傳回 "Hello, " + 傳入的字元串 + " (from Spring Boot)"。服務消費者會提供一個url通路方式,并在url中擷取調用服務使用的字元串。
操作:
1、運作dubbo-provider中的DemoServiceImpl和dubbo-consumer中的DemoConsumerController兩個類;
2、此時服務消費方提供一個url通路接口,在浏覽器中輸入
http://localhost:9091/sayHello/HelloWorld2 遷移到kubernetes的方案
2.1 dubbo注冊中心部署
dubbo的注冊中心有很多種,主流的用法是将zookeeper作為dubbo的注冊中心。Dubbo的注冊中心可以放在叢集内部部署也可以放在叢集外部部署。
在這裡考慮到注冊中心是有狀态的服務,我們可以在kubernetes上部署,也可以在叢集外的ECS上部署。
2.1.1 在叢集外部部署
如果dubbo部署在叢集之外,需要叢集中的部署的應用(服務提供者和服務消費者)需要能夠通路dubbo所在的網絡即可。
2.1.2 在叢集内部部署
如果dubbo部署在叢集内部需要做以下事情:
i.
制作dubbo的相關鏡像并部署在kubernetes平台;
ii.
為dubbo應用建立service,可以為clusterIP和LoadBalancer類型,如果用到LoadBalancer類型,可以建立内網slb;
iii.
應用可以通過dubbo的service name、clusterIP或者内網SLB位址進行通路。
2.2 服務提供者和服務消費者全部在叢集内調用
應用改造及部署
在該種情況下,應用不需要進行改造,在application.properties檔案中需要更改下dubbo.registry.address中dubbo的位址。如下圖:
同時在該種情況下,應用不需要關心自己注冊到dubbo中的位址,因為在同一個叢集中所有的pod位址預設是通的,并且該預設情況下,應用會将pod的位址作為注冊位址。
2.3 服務提供者需要提供服務給叢集外部的服務消費者
2.3.1 服務提供者與kubernetes叢集都部署在阿裡雲上
2.3.1.1 在同一VPC中
如果服務消費者與kubernetes叢集在同一個VPC,那麼隻需要将将兩者放到一個安全組中,保證能夠互相通路即可。此時,部署在kubernetes叢集上的應用是将pod IP位址注冊在dubbo上。
注意,此時pod的IP位址規劃不能與其他VPC環境的IP段沖突。
2.3.1.2 在不同VPC中或線下IDC
如果服務消費者與kubernetes叢集不在同一個VPC中,則需要先打通兩者的VPC環境,使兩方的應用能夠互通即可,顯現IDC同理。此時,部署在kubernetes叢集上的應用也是将pod IP位址注冊在dubbo上。
注意,此時pod的IP位址規劃不能與其他VPC環境或者線下IDC環境的IP段沖突。
2.3.2 線下IDC内網(無法與VPC打通)應用改造及部署
首先,在該種情況下,應用不需要進行改造,在application.properties檔案中需要更改下dubbo.registry.address中dubbo的位址。如果dubbo部署在叢集内,應用應該根據情況填寫能夠通路到的位址。
其次,在部署應用前,需要先為該應用建立外網LoadBalancer類型的service,以便先擷取到外網SLB的位址,在下面注冊位址到dubbo的時候需要用。
最後,由于存在叢集外部的應用互動調用,是以作為服務提供者不能使用pod位址,需要使用外網LoadBalancer類型service的位址。需要在application.properties中進行注冊IP位址的更改。
以上兩步如下圖所示:
參考文檔:
本文中使用的代碼見GitHub:https://github.com/xiaoze-smirk/dubbo-springboot