什麼是Nacos
是 Dynamic Naming and Configuration Service的首字母簡稱,一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平臺。
是構建以“服務”爲中心的現代應用架構 (例如微服務範式、雲原生範式) 的服務基礎設施。
環境與版本
Linux:CentOS 8.0 64bit
Nacos:2.0.4
一、安裝java jdk
1、安裝包:yum install java-1.8.0-openjdk* 2、查看版本:java -version
二、單機版下載&解壓/安裝Nacos
1、安裝Nacos方式有兩種:
第一種:通過wget命令直接安裝(可自行百度)
第二種:是通過git地址去下載安裝包,然後用遠程鏈接工具上傳到linux服務器文件夾,此次由於版本問題,我採用了第二種下載包的方式(https://github.com/alibaba/nacos/releases/tag/2.0.4),
由於第一次學習安裝是使用的2.0.3版本,但是後面創建的時候一直無法創建服務,所有又切換到2.0.4版本,所以截圖說明都是基於2.0.3版本進行的。
下載完成後可以在linux中opt或者usr文件夾下創建新的文件夾便於識別。創建成功後,上傳壓縮包到文件夾,然後解壓壓縮文件。
解壓命令:tar -xvf nacos-server-2.0.4.tar.gz
2、配置mysql查找到nacos-mysql
進入解壓文件下的conf文件夾,查找到nacos-mysql.sql文件,打開文件並執行裏面的sql語句
或者工具中查看
3、執行sql
4、conf文件夾下找到application.properties修改數據庫鏈接配置,可以通過vim方式修改,也可以通過工具直接進行修改保存
5、修改完成後進入進入nacos的bin目錄下
cd /xxxx/xxxx/xxxx/nacos/bin
6、啓動/停止nacos,啓動命令(standalone代表着單機模式運行,非集羣模式)
啓動:sh bin/startup.sh -m standalone
停止:sh bin/shutdown.sh
7、啓動成功後,在nacos的logs文件夾下有一個start.out文件,可查看服務啓動結果
提示指向8848端口成功並且提示successfully表示部署成功。
啓動完成後輸入 http://服務器IP:8848/nacos 即可進入nacos控制檯,賬號nacos,密碼nacos
三、Nacos部署集羣
1、#進入安裝目錄conf
例如:cd /opt/cloud/nacos/conf
2、cp application.properties.example 爲 application.properties
#複製文件cluster.conf.example重新命名爲cluster.conf
cp cluster.conf.example cluster.conf
3、進入cluster.conf文件新定義集羣訪問IP
4、若爲Nacos集羣,需要部署多份文件,可直接通過工具或者命令拷貝一份文件。進入文件的conf文件夾找到application.properties,修改端口
5、啓動集羣,集羣啓動方式和單機啓動方式有一點區別,集羣啓動方式是切換到nacos文件夾的bin目錄執行命令
啓動命令:sh startup.sh
停止命令:sh shutdown.sh
到此爲止,集羣部署完畢,可以通過start.out日誌查看各個集羣啓動 狀態。若都啓動成功,即可訪問。
四、.NET 6接入Nacos
1、進入nacos後臺管理添加命名空間,用於項目創建服務時使用
2、添加依賴包
dotnet add package nacos-sdk-csharp.AspNetCore dotnet add package nacos-sdk-csharp.Extensions.Configuration dotnet add package nacos-sdk-csharp.YamlParser dotnet add package nacos-sdk-csharp.IniParser
3、配置appsettings.json,在appsettings.json中新增nacos節點
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*", /*---Nacos配置(開始)---*/ //"NacosConfig": { // "Listeners": [ // { // "Optional": false, // "DataId": "", //nacos上面的 Data Id // "Group": "DEFAULT_GROUP" //nacos上面的 Group 名 // } // ], // "Namespace": "059ae542-419f-4299-ae71-38a63b9a235a", //nacos上面的 Namespace 名 // "ServerAddresses": ["http://ip:8848","http://ip:8850"], //nacos上的ip節點,可以配置多個,用逗號隔開 // "UserName": "", //可以不填 // "Password": "", //可以不填 // "AccessKey": "", // "SecretKey": "", // //"EndPoint": "acm.aliyun.com",//如果nacos上面的配置詳情的配置內容是空的json內容,例如:{} ,這裏如果填了值,代碼就會報錯,這個一個大坑,被坑哭了。最好把它註釋掉,留空既不會影響本地,也不會影響nacos上的,也會優先讀取nacos上的json文件。 // "ConfigFilterAssemblies": [ "YouPrefix.AssemblyName" ], //官方文檔默認複製過來的 // "ConfigFilterExtInfo": "some ext infomation" //官方文檔默認賦值過來的 //}, "nacos": { "EndPoint": "", //和上面的解釋一樣,最好留空,不然很容易報錯。 "ServerAddresses": [ "http://ip:8848"],//可多個,正常情況一個也夠使用 "DefaultTimeOut": 15000, "Namespace": "61c8ea59-f314-4926-84ae-22e580398678",//新增的命名空間ID "ListenInterval": 10000, "ServiceName": "nacostest", //往nacos服務註冊的服務名,自己定義的,喜歡用那個名字就用哪個 "GroupName": "DEFAULT_GROUP", "ClusterName": "DEFAULT", "Ip": "服務器ip", //項目部署IP如,多個項目集羣部署時修改IP和端口 "PreferredNetworks": "", // select an IP that matches the prefix as the service registration IP "Port": 8852, //往nacos服務註冊的服務端口 "Weight": 100, "RegisterEnabled": true, "InstanceEnabled": true, "Ephemeral": true, "Secure": false, "AccessKey": "", "SecretKey": "", "UserName": "nacos", "Password": "chennacos", "ConfigUseRpc": true, "NamingUseRpc": false, "NamingLoadCacheAtStart": "", "LBStrategy": "WeightRandom", //WeightRandom WeightRoundRobin "Metadata": { "aa": "bb", "cc": "dd" } } /*---Nacos配置(結束)---*/ }
4、添加配置服務,nacos爲appsettings.json中的配置節點
5、啓動項目即自動創建服務
進入服務詳情,可以看到當前服務的IP和端口信息,注意,無論是服務列表還是服務詳情裏面的IP信息列表:淡綠色爲正常服務,淡黃色爲不正常服務
非正常服務
四、.NET 6讀取Nacos服務
1、新增控制器,控制器名稱自定義,實現INacosNamingService接口
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Nacos.V2; namespace NacosTest.Controllers { [Route("api/[controller]")] [ApiController] public class NacosController : ControllerBase { private readonly INacosNamingService _nacosNamingService; public NacosController(INacosNamingService nacosNamingService) { _nacosNamingService = nacosNamingService; } [HttpGet] public string Get() { return "Ok~" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:ffff"); } /// <summary> /// 從nacos中獲取服務並選一個調用 /// </summary> /// <returns></returns> [HttpGet("test")] public async Task<string> Test() { // 獲取服務配置nacostest-服務名稱,DEFAULT_GROUP-服務默認組 var instance = await _nacosNamingService.SelectOneHealthyInstance("nacostest", "DEFAULT_GROUP"); //拼接服務IP和端口 var host = $"{instance.Ip}:{instance.Port}"; //拼接完整路徑 var baseUrl = instance.Metadata.TryGetValue("secure", out _) ? $"https://{host}" : $"http://{host}"; if (string.IsNullOrWhiteSpace(baseUrl)) { return "empty"; } //拼接接口 var url = $"{baseUrl}/api/nacos"; //請求測試代碼 using var client = new HttpClient(); var result = await client.GetAsync(url); return await result.Content.ReadAsStringAsync(); } } }
到此爲止,Nacos初步嘗試已經完成,需要注意的是,一個服務可以注入添加到多個服務器裏面,在appsettings.json的nacos節點ServerAddresses中數組以逗號的方式隔開注入。
同時若一個項目需要註冊多個Nacos,只需要修改在appsettings.json的nacos節點的IP和Port即可,服務名稱和其他信息不變。