一、安裝Nacos Server
安裝之前請確保Java環境和maven環境正常:
- 64 bit JDK 1.8+;
- Maven 3.2.x+;
1、下載原始碼或者安裝包
我選擇直接下載安裝包:https://github.com/alibaba/nacos/releases下的nacos-server-1.1.3.zip
2、啟動服務
雙擊startup.cmd運行檔案

出現以下界面說明運行成功了

如果啟動失敗有可能是外部資料庫沒配置好,執行一下下面的sql就行:

可以看到已經創建了nacos所需的資料庫:

3、OPEN API 配置管理測驗
啟動nacos成功后,可通過nacos提供的http api驗證nacos服務運行是否正常,我使用的是Postman測驗
3.1、發布配置
如下Post命令表示向nacos發布一個配置:
http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=test_id&group=test_group&content=HelloWorld
3.2、獲取配置
GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=test_id &group=test_group "
通過測驗發現,可以從nacos獲取前邊發布的配置:HelloWorld
3.3、關閉服務器
3.4、外部mysql資料庫支持
二、配置入門基礎
1、發布配置
除了使用open api外,一般都是在nacos控制臺直接配置,瀏覽器訪問 http://127.0.0.1:8848/nacos ,打開nacos控制臺,并點擊選單配置管理->配置串列:
Data ID: hello-nacos.yamlGroup : DEFAULT_GROUP配置格式 : YAML配置內容: someconfig :config1: something
第一步:點擊新增配置

2、nacos客戶端獲取配置
(1)新建一個名為nacos-demo的專案,使用的依賴如下:
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.1.3</version>
</dependency>
(2)撰寫Java類獲取外部化配置
通過ConfigService這個類獲取,完整代碼如下:
public class SimpleDemoMain {
public static void main(String[] args) throws NacosException {
String serverAddr = "127.0.0.1:8848"; //nacos地址
String dataId = "hello-nacos.yaml";
String group = "DEFAULT_GROUP";
Properties properties = new Properties();
properties.put("serverAddr",serverAddr);
ConfigService configService = NacosFactory.createConfigService(properties);
//獲取配置,String dataId, String group, long timeoutMs
String content = configService.getConfig(dataId, group, 5000);
System.out.println(content);
}
}
3、Nacos配置相關概念
Namespace :代表不同 環境 ,如開發、測驗、生產環境,Group :代表某 專案 ,如 XX 醫療專案、 XX 電商專案DataId :每個專案下往往有若干個 工程 ,每個配置集 (DataId) 是一個工程的 主組態檔
1 、 nacos 服務地址,必須指定2 、 namespace ,如不指定默認 public3 、 group ,如不指定默認 DEFAULT_GROUP4 、 dataId ,必須指定
4、配置管理
4.1、 監聽查詢
public class SimpleDemoMainListener {
public static void main(String[] args) throws NacosException {
//nacos 地址
String serverAddr = "127.0.0.1:8848";
String dataId = "hello-nacos.yaml";
String group = "DEFAULT_GROUP";
Properties properties = new Properties();
properties.put("serverAddr",serverAddr);
ConfigService configService = NacosFactory.createConfigService(properties);
String content = configService.getConfig(dataId, group, 5000);
System.out.println(content);
//添加監聽String dataId, String group, Listener listener
configService.addListener(dataId, group, new Listener() {
public Executor getExecutor() {
return null;
}
public void receiveConfigInfo(String s) {
//當配置發生變化時的回應
System.out.println(s);
}
});
// 測驗讓主執行緒不退出,因為訂閱配置是守護執行緒,主執行緒退出守護執行緒就會退出,正式代碼中無需下面代碼
while (true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
當我們點擊運行時和上面的獲取配置效果是一樣的,Java控制臺輸出:

然后我們在Nacos將hello-nacos.yaml修改(something修改為anything),此時可以看到Java控制臺成功監聽到我們的修改動作并且獲取了最新的配置:

三、分布式應用配置管理
- 用戶通過Nacos Server的控制臺集中對多個服務的配置進行管理,
- 各服務統一從Nacos Server中獲取各自的配置,并監聽配置的變化,
1、發布配置
Namespace: 9cd826a1-2bb5-4eeb-a2fb-20cb95ea65f2 #開發環境Data ID: service1.yamlGroup : TEST_GROUP配置格式 : YAML配置內容: common:name: service1 config
service2:
Namespace: 9cd826a1-2bb5-4eeb-a2fb-20cb95ea65f2 #開發環境
Data ID: service2.yamlGroup : TEST_GROUP配置格式 : YAML配置內容: common:name: service2 config
2、創建工程
2.1、創建父工程
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xxx</groupId>
<artifactId>nacos-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>service1</module>
<module>quickstart</module>
</modules>
<packaging>pom</packaging>
<dependencies>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.1.3</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring‐cloud‐alibaba‐dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring‐cloud‐dependencies</artifactId>
<version>Greenwich.RELEASE</version> <type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐dependencies</artifactId>
<version>2.1.3.RELEASE</version> <type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐maven‐plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.2、新建專案service1和service2
<parent>
<artifactId>nacos-demo</artifactId>
<groupId>com.xxx</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>service1</artifactId>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
server:
port: 56010
spring:
cloud:
nacos:
config:
group: TEST_GROUP
server-addr: 127.0.0.1:8848
file‐extension: yaml
namespace: 9cd826a1-2bb5-4eeb-a2fb-20cb95ea65f2
application:
name: service1
dataId: 默認是服務名+擴展名(service1.yml)
@SpringBootApplication
@RestController
public class Service1Bootstrap {
public static void main(String[] args) {
SpringApplication.run(Service1Bootstrap.class, args);
}
@Value("${common.name}")
private String config1;
@GetMapping("service1/config")
public String getConfig1(){
return config1;
}
}
啟動service1通過瀏覽器查看(之前寫成了service1 comfig):

server:
port: 56011
spring:
cloud:
nacos:
config:
group: TEST_GROUP
server-addr: 127.0.0.1:8848
file‐extension: yaml
namespace: 9cd826a1-2bb5-4eeb-a2fb-20cb95ea65f2
application:
name: service2
撰寫啟動類和service1類似,通過瀏覽器訪問:
2.3、支持配置的動態更新
基于2.2的例子,若要實作配置的動態更新,只需要進行如下改造(注入組態檔背景關系):
@SpringBootApplication
@RestController
public class Service2Bootstrap {
public static void main(String[] args) {
SpringApplication.run(Service2Bootstrap.class, args);
}
// @Value("${common.name}")
// private String config1;
//
// @GetMapping("service2/config")
// public String getConfig1(){
// return config1;
// }
// 注入組態檔背景關系
@Autowired
private ConfigurableApplicationContext applicationContext;
@GetMapping("service2/config2")
public String getConfig2(){
return applicationContext.getEnvironment().getProperty("common.name");
}
}
Note 可以通過配置spring.cloud.nacos.confifig.refresh.enabled=false來關閉動態重繪
2.4、自定義擴展的 DataId 配置
通過自定義擴展的 Data Id 配置,既可以解決多個應用間配置共享的問題,又可以支持一個應用有多個組態檔,
新建一個service3子工程,組態檔如下:
server:
port: 56012
spring:
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
namespace: 9cd826a1-2bb5-4eeb-a2fb-20cb95ea65f2
# 1、Data Id 在默認的組 DEFAULT_GROUP,不支持配置的動態重繪
ext-config[0]:
data-id: ext-config-common01.properties
# 2、Data Id 不在默認的組,不支持動態重繪
ext-config[1]:
data-id: ext-config-common02.properties
group: GLOBALE_GROUP
# 3、Data Id 既不在默認的組,也支持動態重繪
ext-config[3]:
data-id: ext-config-common03.properties
group: REFRESH_GROUP
refresh: true
application:
name: service3
上面的組態檔遵循:
- 通過spring.cloud.nacos.config.ext-config[n].data-id 的配置方式來支持多個 Data Id 的配置,
- 通過spring.cloud.nacos.config.ext-config[n].group 的配置方式自定義 Data Id 所在的組,不明確配置的話,默認是 DEFAULT_GROUP,
- 通過 spring.cloud.nacos.config.ext-config[n].refresh 的配置方式來控制該 Data Id 在配置變更時,是否支持應用中可動態重繪, 感知到最新的配置值,默認是不支持的,
Note : spring.cloud.nacos.config.ext - config[n].data - id 的值必須帶檔案擴展名,檔案擴展名既可支持properties,又可以支持 yaml/yml ,此時 spring.cloud.nacos.config.file - extension 的配置對自定義擴展配置的 Data Id 檔案擴展名沒有影響,
上面用到的三個組態檔內容分別如下:



撰寫測驗代碼:
@SpringBootApplication
@RestController
public class Service3Bootstrap {
public static void main(String[] args) {
SpringApplication.run(Service3Bootstrap.class, args);
}
// 注入組態檔背景關系
@Autowired
private ConfigurableApplicationContext applicationContext;
@GetMapping("service3/config3")
public String getConfig2(){
String name = applicationContext.getEnvironment().getProperty("common.name");
String age = applicationContext.getEnvironment().getProperty("common.age");
String adderess = applicationContext.getEnvironment().getProperty("common.address");
return name + " " + age + " " + adderess;
}
}
訪問結果表明可以讀到三個不同的組態檔內容:

2.5、自定義共享 Data Id 配置
spring:
cloud:
nacos:
config:
shared‐dataids: ext-config-common01.properties,ext-config-common02.properties
refreshable‐dataids: ext-config-common01.properties
- 通過spring.cloud.nacos.config.shared-dataids 來支持多個共享 Data Id 的配置,多個之間用逗號隔開,
- 通過spring.cloud.nacos.config.refreshable-dataids 來支持哪些共享配置的 Data Id 在配置變化時,應用中是否可動態重繪, 感知到最新的配置值,多個 Data Id 之間用逗號隔開,如果沒有明確配置,默認情況下所有共享配置的 Data Id 都不支持動態重繪,
2.6、配置的優先級
- A: 通過spring.cloud.nacos.config.shared-dataids 支持多個共享 DataId 的配置,按照配置出現的先后順序,即后面的優先級要高于前面,
- B: 通過spring.cloud.nacos.config.ext-config[n].data-id 的方式支持多個擴展 DataId 的配置,多個DataId 同時配置時,他的優先級關系是 spring.cloud.nacos.config.ext-config[n].data-id 其中 n 的值越大,優先級越高,
- C: 通過內部相關規則(應用名、擴展名 )自動生成相關的 Data Id 配置
2.7、完全關閉配置
通過設定 spring.cloud.nacos.confifig.enabled = false 來完全關閉 Spring Cloud Nacos Confifig
四、Nacos集群部署
1、集群部署
startup ‐m cluster
2、客戶端配置
- 關掉127.0.0.1:8848 nacos Leader實體,發現Leader被成功選舉至127.0.0.1:8850
-
緊接著重新啟動 Provider ,這時馬上請求 consumer 的 /service 出現錯誤,發現 consumer 與 provider 通信已經出現問題,但經過短暫的時間后,通信恢復, 通過測驗,我們可以看到,通過以上的集群部署已經達到了高可用的效果,
3、生產環境部署建議
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/283070.html
標籤:其他
上一篇:從零開始學架構-day04
