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

前情回顧:java

繼續說說生產環境的Nacos搭建,經過上一篇《Spring Cloud Alibaba基礎教程:Nacos的數據持久化》的介紹,咱們已經知道Nacos對配置信息的存儲原理,在集羣搭建的時候,必需要使用集中化存儲,好比:MySQL存儲。下面順着上一篇的內容,繼續下一去。經過本文,咱們將完成Nacos生產環境的搭建。mysql

集羣搭建

根據官方文檔的介紹,Nacos的集羣架構大體以下圖所示(省略了集中化存儲信息的MySQL):git

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

MySQL數據源配置

對於數據源的修改,在上一篇《Nacos的數據持久》中已經說明原因,若是還不瞭解的話,能夠先讀一下這篇再回來看這裏。spring

在進行集羣配置以前,先完成對MySQL數據源的初始化和配置。主要分如下兩步:sql

  • 第一步:初始化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實例地址配置在這裏。apache

本文以在本地不一樣端點啓動3個Nacos服務端爲例,能夠以下配置:tomcat

127.0.0.1:8841
127.0.0.1:8842
127.0.0.1:8843

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

啓動實例

在完成了上面的配置以後,咱們就能夠開始在各個節點上啓動Nacos實例,以組建Nacos集羣來使用了。

因爲本文中咱們測試學習採用了本地啓動多實例的狀況,與真正生產部署會有一些差別,因此下面分兩種狀況說一下,如何啓動各個Nacos實例。

本地測試

本文中,在集羣配置的時候,咱們設定了3個Nacos的實例都在本地,只是以不一樣的端口區分,因此咱們在啓動Nacos的時候,須要修改不一樣的端口號。

下面介紹一種方法來方便地啓動Nacos的三個本地實例,咱們能夠將bin目錄下的startup.sh腳本複製三份,分別用來啓動三個不一樣端口的Nacos實例,爲了能夠方便區分不一樣實例的啓動腳本,咱們能夠把端口號加入到腳本的命名中,好比:

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

而後,分別修改這三個腳本中的參數,具體以下圖的紅色部分(端口號根據上面腳本命名分配):

這裏咱們經過-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段中,咱們能夠加入下面的配置內容:

這樣,當咱們訪問: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、收藏、轉發給予支持!

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

相關文章
相關標籤/搜索