阿里出品的Nacos作為微服務(wù)注冊(cè)中心,用了都說(shuō)好?。。?/h1>
哈嘍,大家好,我是指北君。
目前國(guó)內(nèi)大部分的公司都會(huì)使用阿里出品的Nacos作為微服務(wù)注冊(cè)中心,配置中心來(lái)使用,今天了不起為大家介紹一下Nacos的基本使用。
一、Nacos簡(jiǎn)介
Nacos的概念和功能
Nacos是一個(gè)面向微服務(wù)架構(gòu)的動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、配置管理和服務(wù)治理平臺(tái),它能夠幫助開(kāi)發(fā)人員和運(yùn)維人員實(shí)現(xiàn)服務(wù)注冊(cè)、配置管理、DNS和負(fù)載均衡等功能。
下面是一些Nacos的主要功能:
- 服務(wù)發(fā)現(xiàn)
- 配置管理
- DNS服務(wù):Nacos支持將服務(wù)名解析為服務(wù)IP和端口號(hào),提供了一種輕量級(jí)的服務(wù)發(fā)現(xiàn)方案,通過(guò)HTTP DNS協(xié)議來(lái)實(shí)現(xiàn)。
- 負(fù)載均衡
- 服務(wù)治理:Nacos通過(guò)服務(wù)治理功能,可以對(duì)服務(wù)實(shí)例進(jìn)行管理和監(jiān)控,包括實(shí)例上下線、心跳檢測(cè)、健康狀態(tài)等。同時(shí),Nacos還支持路由策略、限流、熔斷降級(jí)等功能,提高了服務(wù)的可用性和穩(wěn)定性。
總之,Nacos是一個(gè)強(qiáng)大的服務(wù)注冊(cè)與發(fā)現(xiàn)中心,提供了動(dòng)態(tài)配置管理和服務(wù)治理等功能,幫助開(kāi)發(fā)者輕松構(gòu)建高可用、高性能的微服務(wù)架構(gòu)。
二、安裝使用Nacos
2.1安裝Nacos
Nacos是一個(gè)基于Java開(kāi)發(fā)的應(yīng)用,它可以作為獨(dú)立的服務(wù)運(yùn)行,也可以作為嵌入式組件在Java應(yīng)用程序中使用。以下是Nacos的安裝和使用方法:
- 下載Nacos:https://github.com/alibaba/nacos/releases
- 安裝Nacos:將下載的Nacos壓縮包解壓到指定目錄,進(jìn)入解壓后的目錄,運(yùn)行bin目錄下的startup.sh(Linux/Mac)或startup.cmd(Windows)腳本即可啟動(dòng)Nacos。
- 訪問(wèn)Nacos控制臺(tái):默認(rèn)情況下,Nacos控制臺(tái)的訪問(wèn)地址為 http://localhost:8848/nacos
- 注冊(cè)服務(wù):在Nacos控制臺(tái)中,可以通過(guò)服務(wù)管理界面注冊(cè)服務(wù),輸入服務(wù)名稱和IP地址等信息即可完成服務(wù)注冊(cè)。同時(shí),可以設(shè)置服務(wù)的健康檢查、負(fù)載均衡等屬性。
- 獲取服務(wù):在應(yīng)用程序中,可以通過(guò)Nacos提供的Java SDK或HTTP API獲取已注冊(cè)的服務(wù)信息。
除此之外,Nacos還提供了豐富的配置管理功能,可以幫助開(kāi)發(fā)者管理應(yīng)用程序的配置信息。可以通過(guò)Nacos控制臺(tái)或API等方式實(shí)現(xiàn)配置的動(dòng)態(tài)管理和實(shí)時(shí)更新。
注冊(cè)服務(wù)
Nacos的服務(wù)注冊(cè)和發(fā)現(xiàn)功能是其核心功能之一,下面是一個(gè)簡(jiǎn)單的Java示例,演示如何使用Nacos SDK注冊(cè)服務(wù):
- 添加依賴。在Maven項(xiàng)目中添加以下依賴:
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.0.2</version>
</dependency>
- 創(chuàng)建Nacos服務(wù)注冊(cè)實(shí)例:在Java應(yīng)用程序中,可以通過(guò)以下代碼創(chuàng)建Nacos服務(wù)注冊(cè)實(shí)例,設(shè)置Nacos服務(wù)器的地址和端口號(hào):
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingFactory;
import com.alibaba.nacos.api.naming.NamingService;
public class NacosServiceRegistry {
public static void main(String[] args) throws NacosException {
String serverAddr = "localhost:8848"; // Nacos服務(wù)器的地址和端口號(hào)
NamingService namingService = NamingFactory.createNamingService(serverAddr);
// 注冊(cè)服務(wù)
namingService.registerInstance("my-service", "127.0.0.1", 8080);
// 關(guān)閉Nacos服務(wù)注冊(cè)實(shí)例
namingService.shutdown();
}
}
- 注冊(cè)服務(wù):通過(guò)NamingService對(duì)象的registerInstance()方法注冊(cè)服務(wù),需要指定服務(wù)的名稱、IP地址和端口號(hào)等信息,例如:
namingService.registerInstance("my-service", "127.0.0.1", 8080);
- 關(guān)閉服務(wù)注冊(cè)實(shí)例:在服務(wù)注冊(cè)完成后,需要關(guān)閉NamingService對(duì)象,例
namingService.shutdown();
以上是一個(gè)簡(jiǎn)單的使用Nacos SDK注冊(cè)服務(wù)的示例,當(dāng)然,在實(shí)際使用中,還需要考慮服務(wù)的健康檢查、負(fù)載均衡等問(wèn)題。
配置服務(wù)
Nacos的配置管理功能可以幫助開(kāi)發(fā)者動(dòng)態(tài)管理應(yīng)用程序的配置信息。下面是一個(gè)簡(jiǎn)單的Java示例,演示如何使用Nacos SDK實(shí)現(xiàn)配置服務(wù)的獲取和監(jiān)聽(tīng):
- 添加依賴,在Maven項(xiàng)目中添加以下依賴:
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.0.2</version>
</dependency>
- 創(chuàng)建Nacos配置服務(wù)實(shí)例:在Java應(yīng)用程序中,可以通過(guò)以下代碼創(chuàng)建Nacos配置服務(wù)實(shí)例,設(shè)置Nacos服務(wù)器的地址和端口號(hào):
import com.alibaba.nacos.api.config.ConfigFactory;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.exception.NacosException;
public class NacosConfigService {
public static void main(String[] args) throws NacosException {
String serverAddr = "localhost:8848"; // Nacos服務(wù)器的地址和端口號(hào)
String dataId = "my-config"; // 配置項(xiàng)的ID
String group = "DEFAULT_GROUP"; // 配置項(xiàng)的分組
// 創(chuàng)建Nacos配置服務(wù)實(shí)例
ConfigService configService = ConfigFactory.createConfigService(serverAddr);
// 獲取配置
String config = configService.getConfig(dataId, group, 5000);
System.out.println(config);
// 監(jiān)聽(tīng)配置
configService.addListener(dataId, group, new Listener() {
@Override
public void receiveConfigInfo(String config) {
System.out.println(config);
}
@Override
public Executor getExecutor() {
return null;
}
});
}
}
- 獲取配置:通過(guò)ConfigService對(duì)象的getConfig()方法獲取指定配置項(xiàng)的配置信息,需要指定配置項(xiàng)的ID和分組等信息,例如:
String dataId = "my-config";
String group = "DEFAULT_GROUP";
String config = configService.getConfig(dataId, group, 5000);
System.out.println(config);
- 監(jiān)聽(tīng)配置:通過(guò)ConfigService對(duì)象的addListener()方法監(jiān)聽(tīng)指定配置項(xiàng)的配置變化,需要實(shí)現(xiàn)Listener接口中的receiveConfigInfo()方法,例如:
configService.addListener(dataId, group, new Listener() {
@Override
public void receiveConfigInfo(String config) {
System.out.println(config);
}
@Override
public Executor getExecutor() {
return null;
}
});
以上是一個(gè)簡(jiǎn)單的使用Nacos SDK實(shí)現(xiàn)配置服務(wù)的示例,當(dāng)然,在實(shí)際使用中,還需要考慮配置的加密、灰度發(fā)布等問(wèn)題。
服務(wù)發(fā)現(xiàn)
- 添加依賴,例如在Maven項(xiàng)目中添加以下依賴:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.3.RELEASE</version>
</dependency>
- 配置Nacos Server地址:在application.properties或application.yml中,添加Nacos Server的地址和端口號(hào):
spring.cloud.nacos.discovery.server-addr=localhost:8848
- 添加服務(wù)提供者:在Spring Boot應(yīng)用程序中,添加一個(gè)服務(wù)提供者的REST接口,例如:
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello, world!";
}
}
- 添加服務(wù)消費(fèi)者:在Spring Boot應(yīng)用程序中,添加一個(gè)服務(wù)消費(fèi)者的REST接口,例如:
@RestController
public class HelloConsumerController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/hello")
public String hello() {
String url = "http://my-service/hello";
String result = restTemplate.getForObject(url, String.class);
return result;
}
}
在上面的代碼中,RestTemplate是Spring提供的一個(gè)用于發(fā)送HTTP請(qǐng)求的工具類。在hello()方法中,通過(guò)RestTemplate發(fā)送GET請(qǐng)求,請(qǐng)求URL為http://my-service/hello,其中my-service為服務(wù)提供者的服務(wù)名。
啟動(dòng)服務(wù):分別啟動(dòng)服務(wù)提供者和服務(wù)消費(fèi)者兩個(gè)Spring Boot應(yīng)用程序,可以看到服務(wù)消費(fèi)者通過(guò)服務(wù)發(fā)現(xiàn)機(jī)制自動(dòng)發(fā)現(xiàn)了服務(wù)提供者,從而可以調(diào)用服務(wù)提供者的REST接口。
需要注意的是,Nacos服務(wù)發(fā)現(xiàn)默認(rèn)使用Ribbon進(jìn)行負(fù)載均衡,因此在上面的示例中,如果服務(wù)提供者有多個(gè)實(shí)例,服務(wù)消費(fèi)者將會(huì)自動(dòng)進(jìn)行負(fù)載均衡,請(qǐng)求不同的服務(wù)實(shí)例。
配置中心
確保你已經(jīng)在Nacos中創(chuàng)建了配置,例如:
# application.yml
example:
greeting: Hello, World!
接下來(lái),在Spring Boot項(xiàng)目中添加依賴:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${nacos.config.version}</version>
</dependency>
在Spring Boot的啟動(dòng)類中添加@EnableDiscoveryClient和@RefreshScope注解,它們分別啟用服務(wù)發(fā)現(xiàn)和動(dòng)態(tài)刷新配置:
javaCopy codeimport org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.context.config.annotation.RefreshScope;
@SpringBootApplication
@EnableDiscoveryClient
@RefreshScope
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
最后,在application.yml中添加以下內(nèi)容,告訴Spring Boot如何連接到Nacos服務(wù)器:
spring:
cloud:
nacos:
config:
server-addr: localhost:8848 # Nacos服務(wù)器地址
namespace: your-namespace # 命名空間
現(xiàn)在,你可以在你的代碼中使用@Value注解來(lái)注入Nacos配置中心的值了,如下所示:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
@Value("${example.greeting}")
private String greeting;
@GetMapping("/")
public String index() {
return greeting;
}
}
現(xiàn)在,當(dāng)你更新Nacos中的配置時(shí),Spring Boot應(yīng)用程序?qū)⒆詣?dòng)檢測(cè)到更改并動(dòng)態(tài)地重新加載配置。
監(jiān)控中心
Nacos監(jiān)控中心可以幫助你實(shí)時(shí)監(jiān)控Nacos實(shí)例的運(yùn)行狀態(tài),包括健康狀態(tài)、配置狀態(tài)、元數(shù)據(jù)狀態(tài)等。下面是使用Nacos監(jiān)控中心的步驟:
- 確保Nacos已啟動(dòng)并運(yùn)行正常。
- 在Nacos控制臺(tái)中,點(diǎn)擊左側(cè)導(dǎo)航欄中的“監(jiān)控”按鈕,進(jìn)入監(jiān)控中心頁(yè)面。
- 在監(jiān)控中心頁(yè)面中,你可以看到以下三個(gè)部分:
首頁(yè):顯示Nacos實(shí)例的整體健康狀態(tài),包括Nacos實(shí)例數(shù)、實(shí)例狀態(tài)、服務(wù)數(shù)量、配置數(shù)量、命名空間數(shù)量等。
服務(wù)健康:顯示Nacos實(shí)例中每個(gè)服務(wù)的健康狀態(tài),包括服務(wù)名稱、實(shí)例數(shù)、健康實(shí)例數(shù)、不健康實(shí)例數(shù)、最近一次健康狀態(tài)檢查時(shí)間等。
配置管理:顯示Nacos實(shí)例中每個(gè)配置的狀態(tài),包括配置ID、配置Data ID、配置Group、配置類型、最近一次修改時(shí)間等。
- 如果你想查看更詳細(xì)的監(jiān)控信息,可以點(diǎn)擊“服務(wù)健康”或“配置管理”頁(yè)面中的某個(gè)服務(wù)或配置,進(jìn)入詳細(xì)信息頁(yè)面。
- 在詳細(xì)信息頁(yè)面中,你可以看到該服務(wù)或配置的實(shí)例列表、健康狀態(tài)、元數(shù)據(jù)信息等。
除了使用監(jiān)控中心頁(yè)面,你也可以通過(guò)Nacos提供的API接口獲取監(jiān)控信息。例如,你可以通過(guò)以下API接口獲取服務(wù)健康狀態(tài):
GET /nacos/v1/ns/instance/health?serviceName=<serviceName>
其中,<serviceName>是你要查詢的服務(wù)名稱。該接口將返回該服務(wù)的健康狀態(tài)信息。你也可以使用其他API接口獲取其他監(jiān)控信息,具體請(qǐng)參考Nacos官方文檔。
三、Nacos與Eureka的區(qū)別
- 功能組件的支持程度不同Nacos 提供了服務(wù)注冊(cè)、配置管理、流量控制、DNS 服務(wù)等一系列功能的支持,用來(lái)支持微服務(wù)架構(gòu)的需要;而Eureka 則只提供了服務(wù)的注冊(cè)和發(fā)現(xiàn)功能,缺乏其他全方位的支持。
- 開(kāi)源社區(qū)活躍度不同 相較于Eureka,Nacos 的開(kāi)源社區(qū)更為活躍,且已成為了 Apache 軟件基金會(huì) Top-Level Project,開(kāi)發(fā)進(jìn)展速度更快。 節(jié)約開(kāi)發(fā)成本
基本上,Nacos可以說(shuō)是是一個(gè)功能豐富、易用性強(qiáng)、可擴(kuò)展性好、高可用性的服務(wù)發(fā)現(xiàn)、配置管理和服務(wù)治理平臺(tái)。對(duì)于分布式系統(tǒng)的開(kāi)發(fā)和運(yùn)維來(lái)說(shuō),Nacos是一個(gè)非常好的選擇。