深入淺出高效能服務發現、配置框架Nacos系列 1: HelloWorld
Nacos是什麼?
引用官方的介紹,他主要提供以下幾個功能點:
- 動態配置服務
- 服務發現及管理
- 動態DNS服務
動態配置服務
就是通過一個系統,管理系統中的配置項,在配置項需要更新的時候,可以通過管理系統去操作更新,更新完了之後,會主動推送到訂閱了這個配置的客戶端
具體的使用場景,例如,在系統中,會有資料庫的連結串,賬號密碼等配置資訊,常規的做法是寫在配置檔案裡面,如果需要修改更新,需要重新打包編譯,如果你是分散式叢集,那成本太大了,通常我們都會將它抽取出來,存放到db,或者一個管理系統,Nacos,就是這個管理系統,Nacos還提供主動通知的能力,DB是沒有的,在自己的系統程式碼裡面,可以監聽某個配置,如果在管理系統上修改了配置項,客戶端的監聽函式,會立刻執行,在裡面,你可以拿到最新的配置,執行自己的業務邏輯
服務發現及管理
這個主要是針對分散式的微服務集群系統,某A叢集提供服務出去,其他應用叢集,需要消費到A叢集的服務,需要一個系統去管理A叢集的ip列表,其他應用叢集,去這個系統才能獲取到A叢集的ip列表,進行呼叫,同時該系統需要能夠自動將A叢集中無法工作的ip進行去除掉,這樣才能保證呼叫方呼叫成功,Nacos就是提供這種能力的一個系統
動態DNS服務
這個理解起來也簡單,我們平常在程式碼裡面 ,訪問一個http的api,通常是帶一個域名的,請求的時候,一般會先去DNS域名伺服器上面尋找該域名對應的ip,再發起http請求,Nacos可以充當這個DNS域名伺服器的角色的,優點是什麼呢?Nacos
Nacos除了能夠解決上面提到的一些場景,大家可以自由發揮,反正它的能力在那裡,至於怎麼用,就靠你們聰明的腦袋了。下面,我們嘗試從Nacos的官方原始碼拉一份下來,進行一個服務的釋出,訂閱的簡單流程,讓大家更有體感去感受下Nacos的功能
下載原始碼
Nacos的程式碼是託管在github上,點選進入關注,開始之前先start關注一下,加上watch,後續的郵件列表也會通知到你,可以關注到的最新實時訊息,及各大牛之間的精彩討論。
我們首先直接下載Nacos的原始碼到本地,下載地址如下圖紅框:
然後,要從github上把程式碼拉下來,命令如下:
git clone [email protected]:alibaba/nacos.git
編譯啟動
下載完後,在本地會有一個nacos的資料夾,進去後,執行編譯打包的命令:
mvn -Prelease-nacos clean install -U -Dmaven.test.skip=true
執行完之後,在nacos/distribution/target資料夾裡面,會生成如下幾個工程檔案:
忽略archive-tmp,將nacos-server-0.2.0.zip或者nacos-server-0.2.0.tar.gz直接copy到你的伺服器上面, 然後解壓開來,得到一個叫nacos的資料夾,裡面的結構如下:
進入bin檔案,裡面有啟動,關閉nacos server的指令碼,我們執行一下啟動指令碼,注意,nacos server的啟動,有2種方式,一種是叢集模式,一種是單機模式,由於叢集模式還需要一些其他的配置才能執行,今天我們就跑單機模式,需要加一個特殊引數,命令如下:
sh startup.sh -m standalone
命令執行完之後,出現提示:
nacos is starting,you can check the /home/caogu.wyp/test/nacos/logs/start.log
我們可以去/nacos/logs/start.log看下啟動日誌,是否有報錯,如果有報錯,自己分析一下,找不到原因,聯絡Nacos管理員 @超哥,他會很熱心的幫你解決問題滴。 啟動成功的日誌如下:
同時, 我們也可以自己check下server的埠是否監聽成功,執行
netstat -ano|grep 8080
現在服務端啟動好了。
釋出一個服務
我們現在來用Java客戶端,釋出和訂閱一個服務,客戶端,我們有2種方式執行,一個是在自己工程裡面,通過maven座標下載進來,另外一種,直接從下載的Nacos原始碼裡面,座標如下:
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>0.1.0</version>
由於我們有程式碼,我就直接在工程裡面進行操作了,工程結構如下,直接在test模組裡面,新建一個helloworld的包:
Pub類裡面,是釋出一條資料,程式碼如下:
public class Pub {
public static void main(String[] args) throws NacosException, InterruptedException {
//釋出的服務名
String serviceName = "helloworld.services";
//構造一個nacos例項,入參是nacos server的ip和服務埠
NamingService naming = NacosFactory.createNamingService("100.81.0.34:8080");
//釋出一個服務,該服務對外提供的ip為127.0.0.1,埠為8888
naming.registerInstance(serviceName, "127.0.0.1", 8888);
Thread.sleep(Integer.MAX_VALUE);
}
}
啟動之後,服務已經發布上去了
訂閱一個服務
下面是Sub的程式碼:
public class Sub {
public static void main(String[] args) throws NacosException, InterruptedException {
//訂閱的服務名
String serviceName = "helloworld.services";
//建立一個nacos例項
NamingService naming = NacosFactory.createNamingService("100.81.0.34:8080");
//訂閱一個服務
naming.subscribe(serviceName, event -> {
if (event instanceof NamingEvent) {
System.out.println("訂閱到資料");
System.out.println(((NamingEvent) event).getInstances());
}
});
System.out.println("訂閱完成,準備等數來");
Thread.sleep(Integer.MAX_VALUE);
}
}
我們嘗試啟動,會訂閱到剛才釋出的資料:
總結
上面流程,就是一個helloworld的服務釋出和訂閱,夠簡單吧,在實際的生產環境中,一個服務下面往往掛有好幾個ip提供服務,在訂閱端,拿到服務下面的所有地址列表後,通過負載均衡策略,例如隨機策略,選擇到一個ip進行呼叫,這樣就完成了一次遠端呼叫。
轉載請聯絡:微訊號(zjjxg2018)