Spring Cloud Alibaba基礎教程:Nacos的叢集部署

程式猿DD發表於2019-02-21

繼續說說生產環境的Nacos搭建,通過上一篇《Spring Cloud Alibaba基礎教程:Nacos的資料持久化》的介紹,我們已經知道Nacos對配置資訊的儲存原理,在叢集搭建的時候,必須要使用集中化儲存,比如:MySQL儲存。下面順著上一篇的內容,繼續下一去。通過本文,我們將完成Nacos生產環境的搭建。

叢集搭建

根據官方文件的介紹,Nacos的叢集架構大致如下圖所示(省略了集中化儲存資訊的MySQL):

Spring Cloud Alibaba基礎教程:Nacos的叢集部署

下面我們就來一步步的介紹,我們每一步的搭建細節。

MySQL資料來源配置

對於資料來源的修改,在上一篇《Nacos的資料持久》中已經說明緣由,如果還不瞭解的話,可以先讀一下這篇再回來看這裡。

在進行叢集配置之前,先完成對MySQL資料來源的初始化和配置。主要分以下兩步:

  • 第一步:初始化MySQL資料庫,資料庫初始化檔案:nacos-mysql.sql,該檔案可以在Nacos程式包下的conf目錄下獲得。
  • 第二步:修改conf/application.properties檔案,增加支援MySQL資料來源配置,新增(目前只支援mysql)資料來源的url、使用者名稱和密碼。配置樣例如下:
spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=

更多介紹與思考,可見檢視上一篇《Nacos的資料持久化》

叢集配置

在Nacos的conf目錄下有一個cluster.conf.example,可以直接把example副檔名去掉來使用,也可以單獨建立一個cluster.conf檔案,然後開啟將後續要部署的Nacos例項地址配置在這裡。

本文以在本地不同端點啟動3個Nacos服務端為例,可以如下配置:

127.0.0.1:8841
127.0.0.1:8842
127.0.0.1:8843

注意:這裡的例子僅用於本地學習測試使用,實際生產環境必須部署在不同的節點上,才能起到高可用的效果。另外,Nacos的叢集需要3個或3個以上的節點,並且確保這三個節點之間是可以互相訪問的。

啟動例項

在完成了上面的配置之後,我們就可以開始在各個節點上啟動Nacos例項,以組建Nacos叢集來使用了。

由於本文中我們測試學習採用了本地啟動多例項的情況,與真正生產部署會有一些差異,所以下面分兩種情況說一下,如何啟動各個Nacos例項。

本地測試

本文中,在叢集配置的時候,我們設定了3個Nacos的例項都在本地,只是以不同的埠區分,所以我們在啟動Nacos的時候,需要修改不同的埠號。

下面介紹一種方法來方便地啟動Nacos的三個本地例項,我們可以將bin目錄下的startup.sh指令碼複製三份,分別用來啟動三個不同埠的Nacos例項,為了可以方便區分不同例項的啟動指令碼,我們可以把埠號加入到指令碼的命名中,比如:

  • startup-8841.sh
  • startup-8842.sh
  • startup-8843.sh

然後,分別修改這三個指令碼中的引數,具體如下圖的紅色部分(埠號根據上面指令碼命名分配):

Spring Cloud Alibaba基礎教程:Nacos的叢集部署

這裡我們通過-Dserver.port的方式,在啟動命令中,為Nacos指定具體的埠號,以實現在本機上啟動三個不同的Nacos例項來組成叢集。

修改完3個指令碼配置之後,分別執行下面的命令就可以在本地啟動Nacos叢集了:

sh startup-8841.sh
sh startup-8842.sh
sh startup-8843.sh

生產環境

在實際生產環境部署的時候,由於每個例項分佈在不同的節點上,我們可以直接使用預設的啟動指令碼(除非要調整一些JVM引數等才需要修改)。只需要在各個節點的Nacos的bin目錄下執行sh startup.sh命令即可。

Proxy配置

在Nacos的叢集啟動完畢之後,根據架構圖所示,我們還需要提供一個統一的入口給我們用來維護以及給Spring Cloud應用訪問。簡單地說,就是我們需要為上面啟動的的三個Nacos例項做一個可以為它們實現負載均衡的訪問點。這個實現的方式非常多,這裡就舉個用Nginx來實現的簡單例子吧。

在Nginx配置檔案的http段中,我們可以加入下面的配置內容:

Spring Cloud Alibaba基礎教程:Nacos的叢集部署

這樣,當我們訪問:http://localhost:8080/nacos/的時候,就會被負載均衡的代理到之前我們啟動的三個Nacos例項上了。這裡我們沒有配置upstream的具體策略,預設會使用線性輪訓的方式,如果有需要,也可以配置上更為複雜的分發策略。這部分是Nginx的使用內容,這裡就不作具體介紹了。

這裡提一下我在嘗試搭建時候碰到的一個問題,如果您也遇到了,希望下面的說明可以幫您解決問題。

錯誤資訊如下:

2019-02-20 16:20:53,216 INFO The host [nacos_server] is not valid
 Note: further occurrences of request parsing errors will be logged at DEBUG level.

java.lang.IllegalArgumentException: The character [_] is never valid in a domain name.
    at org.apache.tomcat.util.http.parser.HttpParser$DomainParseState.next(HttpParser.java:926)
    at org.apache.tomcat.util.http.parser.HttpParser.readHostDomainName(HttpParser.java:822)
    at org.apache.tomcat.util.http.parser.Host.parse(Host.java:71)
    at org.apache.tomcat.util.http.parser.Host.parse(Host.java:45)
    at org.apache.coyote.AbstractProcessor.parseHost(AbstractProcessor.java:288)
    at org.apache.coyote.http11.Http11Processor.prepareRequest(Http11Processor.java:809)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:384)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:791)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1417)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)

主要原因是,一開始在配置upstream的時候,用了nacos_server作為名稱,而在Nacos使用的Tomcat版本中不支援_符號出現在域名位置,所以上面截圖給出的upstream的名稱是nacosserver,去掉了_符號。

到這裡,Nacos的叢集搭建就完成了!我們可以通過Nginx配置的代理地址:http://localhost:8080/nacos/來訪問Nacos,在Spring Cloud應用中也可以用這個地址來作為註冊中心和配置中心的訪問地址來配置。讀者可以使用文末的程式碼示例來修改原來的Nacos地址來啟動,看是否可以獲取配置資訊來驗證叢集的搭建是否成功。也可以故意的關閉某個例項,來驗證Nacos叢集是否還能正常服務。

深入思考

在Nacos官方文件的指引下,Nacos的叢集搭建總體上還是非常順暢的,沒有什麼太大的難度。但是值得思考的一個問題跟在上一篇中講資料持久化的思考類似,作為一個註冊中心和配置中心,Nacos的架構是否顯得太過於臃腫?除了Nacos自身之外,還需要依賴更多的中介軟體來完成整套生產環境的搭建,相較於其他的可以用於服務發現與配置的中介軟體來說,就不那麼有優勢了。尤其對於小團隊來說,這樣的複雜度與成本投入,也是在選型的時候需要去考慮的。

程式碼示例

本文介紹內容的客戶端程式碼,示例讀者可以通過檢視下面倉庫中的alibaba-nacos-config-client專案:

如果您對這些感興趣,歡迎star、follow、收藏、轉發給予支援!

前情回顧:

以下專題教程也許您會有興趣

相關文章