注冊中心Nacos詳解


1. Nacos簡介

Nacos:由Spring Cloud Alibaba 提供的。 Nacos致力於幫助您發現、配置和管理微服務。Nacos提供了一組簡單易用的特性集,幫助您快速實現動態服務發現、服務配置、服務元數據及流量管理。

nacos集成了netflix公司的ribbon,支持負載均衡(默認:輪詢)。

naocos對於CAP的支持:它支持AP和CP模式的切換。

Nacos官方網址:https://nacos.io/zh-cn/



2. Nacos作為注冊中心使用

2.1 添加依賴

<!-- nacos注冊中心依賴包 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 監控檢查-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2.2 添加配置文件

spring:
  application:
    name: nacos-web
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.200.128:8848

server:
  port: 9100

#健康檢查
management:
  endpoints:
    web:
      exposure:
        include: "*"

2.3 啟動類

@SpringBootApplication
@EnableDiscoveryClient   //服務發現注解   用於注冊中心能夠發現,掃描到改服務   如果選用的注冊中心是eureka,那么就推薦@EnableEurekaClient,如果是其他的注冊中心,那么推薦使用@EnableDiscoveryClient
public class NacosWebApplication {
​
    public static void main(String[] args) {
        SpringApplication.run(NacosWebApplication.class,args);
    }
}

2.4 創建一個控制器

@RestController
public class InfoController {
​
    @Value("${server.port}")
    private String port;
​
    @Value("${key:''}")
    private String key;
​
    @GetMapping(value = "/echo/{message}")
    public String echo(@PathVariable(value = "message") String message) {
        return "Hello Nacos Discovery " + message + ", i am from port " + port;
    }
​
    @GetMapping(value = "/config")
    public String config() {
        return "Hello Nacos Config get "+key ;
    }
}

2.5 啟動服務查看效果





3. Nacos作為配置中心使用

3.0 補充配置中心數據模型

Nacos數據模型由三元組確定,Namespace,Group,DataID。

3.1 添加依賴

<!-- nacos配置中心依賴包 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

3.2 添加配置文件

# 注意:配置文件必須是bootstrap.properties或者bootstrap.yml,如果配置application.properties或者application.yml會導致加載不到配置。

spring:
  application:
    name: nacos-web
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.200.140:8848
      config:
        server-addr: 192.168.200.140:8848 #指定配置中心地址
        file-extension: yaml #指定nacos配置中心的文件擴展名,默認為properties。支持:TEXT JSON XML YAML HTML Properties

server:
  port: 9100

#全局健康檢查
management:
  endpoints:
    web:
      exposure:
        include: "*"

3.3 創建配置

配置文件格式:默認是properties,如果項目使用yml,則需要指定為yml【3.2步驟 file-extension: yml #指定文件擴展名,默認為properties

Data ID:

Data ID Nacos 中的某個配置集的 ID。默認需要與所在服務的實例名一致。
Data ID 通常用於組織划分系統的配置集。一個系統或者應用可以包含多個配置集,每個配置集都可以被一個有意義的名稱標識。

Data ID 后綴默認是properties,如果你在配置文件不指定后綴,他默認就去找你服務實例名.properties配置文件。

你可以通過配置來  指定你想加載的配置文件前綴與后綴。

spring:
  application:
    name: springcloud-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
      config:
        server-addr: localhost:8848
        file-extension: yml   #后綴【文件類型】    
        prefix: springcloud-consumer   #前綴【文件名】

Group:

Nacos 中的一組配置集,是組織配置的維度之一。通過一個有意義的字符串(如 Buy 或 Trade )對配置集進行分組,從而區分 Data ID 相同的配置集。
當您在 Nacos 上創建一個配置時,如果未填寫配置分組的名稱,則配置分組的名稱默認采用 DEFAULT_GROUP。

如果你在配置文件不指定配置組,則默認去找DEFAULT_GROUP。

如果你想指定加載哪個組的,你可在配置文件指定。

server:
  port: 8003
spring:
  application:
    name: springcloud-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
      config:
        server-addr: localhost:8848
        file-extension: yml
        prefix: springcloud-consumer
        group: CUSTOM_GROUP   # 加載 CUSTOM_GROUP 組下,文件名叫springcloud-consumer,文件類型為yml的配置文件。

3.4 測試接口

@RestController
public class InfoController {
	
	@Value("${server.port}")
	private String port;
	
	@Value("${key:''}")   // 是從配置中心得到的
	private String key;
	
	@Value("${commonKey:''}")
	private String commonKey;
	
	@Value("${shareInfo:''}")
	private String shareInfo;
	
	@GetMapping(value = "/config")
	public String config() {
		return "Hello Nacos Config get " + key + "       getCommonValue:  " + commonKey + "      getShareInfo:  " + shareInfo;
	}
}

3.5 補充namespace

默認會有一個public空間,它不能被你刪除。你在創建配置的時候,若不指定namespace,則默認叫DEFAULT_GROUP。

如果你想加載指定空間的配置文件,可以在你的配置文件中指定。

spring:
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        file-extension: yml
        prefix: springcloud-consumer
        group: CUSTOM_GROUP
        namespace: ff758179-90de-42fb-8be7-238f2be1443e


4. Nacos的動態刷新 @RefreshScope

Nacos Config Starter 默認為所有獲取數據成功的 Nacos 的配置項添加了監聽功能,在監聽到服務端配置發生變化時會實時觸發 org.springframework.cloud.context.refresh.ContextRefresher 的 refresh 方法 。從而實現更改配置不需要重啟服務。
如果需要對 Bean 進行動態刷新。給類添加 @RefreshScope 進行自動刷新。

@RestController
@RefreshScope
public class InfoController {
	
	@Value("${server.port}")
	private String port;
	
	@Value("${key:''}")
	private String key;
	
	@Value("${commonKey:''}")
	private String commonKey;
	
	@Value("${shareInfo:''}")
	private String shareInfo;
	
	@GetMapping(value = "/echo/{message}")
	public String echo(@PathVariable(value = "message") String message) {
		return "Hello Nacos Discovery " + message + ", i am from port " + port;
	}
	
	@GetMapping(value = "/config")
	public String config() {
		return "Hello Nacos Config get " + key + "       getCommonValue:  " + commonKey + "      getShareInfo:  " + shareInfo;
	}
}


當更改nacos的配置時,不需要重啟服務。


5. Nacos針對不同環境/服務的配置支持

5.1 Nacos針對不同環境的配置支持

在SpringBoot為我們開發時提供了不同環境的支持。只需要為不同的環境編寫專門的配置文件,如:application-dev.yml、application-prod.yml, 啟動項目時只需要增加一個命令參數 --spring.profiles.active=環境名稱 即可。

=====bootstrap.yml=====

spring:
  application:
    name: nacos-web
  profiles:
    active: dev
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
      config:
        server-addr: localhost:8848
        file-extension: yaml #指定nacos配置中心的文件擴展名,默認為properties。支持:TEXT JSON XML YAML HTML Properties
        prefix: nacos-web

server:
  port: 9100

#健康檢查
management:
  endpoints:
    web:
      exposure:
        include: "*"
=====application-dev.yml=====

server:
  port: 9101
此時啟動項目,訪問的就不再是9100了。而是9101

nacos也可以同時支持多環境配置。只需要在nacos配置中心中根據dataId進行區分即可。
dataId 完整的拼接格式如下:

${prefix}-${spring.profiles.active}.${file-extension}


prefix                     默認為 spring.application.name 的值,如果你想改,比如你的服務名叫app-service,你的配置文件想叫appapp-service,則可以通過配置 spring.cloud.nacos.config.prefix = ""來配置。
spring.profiles.active     即為當前環境對應的 profile
file-extension             為配置內容的數據格式,可以通過配置項 spring.cloud.nacos.config.file-extension來配置。

若要配置多環境支持,則創建的配置文件Data ID 必須按着規定的格式

舉例:現在要針對dev環境,創建其配置文件

=====bootstrap.yml=====

spring:
  application:
    name: nacos-web
  profiles:
    active: dev
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
      config:
        server-addr: localhost:8848
        file-extension: yaml #指定nacos配置中心的文件擴展名,默認為properties。支持:TEXT JSON XML YAML HTML Properties
        prefix: nacos-web
server:
  port: 9100

#健康檢查
management:
  endpoints:
    web:
      exposure:
        include: "*"
=====application-dev.yml=====

server:
  port: 9101

創建配置文件,nacos-web-dev.yml。為什么要叫這個名字?

因為nacos規定了命名,只有按要求命名,才能找得到這個配置文件。當你以dev開發環境啟動時,他就去找有沒有 nacos-web-dev.yml 這個配置文件。有的話就加載。
${prefix}-${spring.profiles.active}.${file-extension}




5.2 Nacos針對不同環境下配置信息的共享

在開發中,雖然可以在不同環境下使用不同的配置文件,但是有一些配置是通用的,需要在不同的環境下,都進行生效。
根據上述測試,可以發現,不同的開發環境下都會去加載nacos-web.yml,也就是沒有指定特定環境的文件。那么對於通用配置就可以設置在這個文件中。

@RestController
@RefreshScope
public class InfoController {
	
	@Value("${server.port}")
	private String port;
	
	@Value("${key:''}")
	private String key;
	
	@Value("${commonKey:''}")
	private String commonKey;
	
	@Value("${shareInfo:''}")
	private String shareInfo;
	
	@GetMapping(value = "/echo/{message}")
	public String echo(@PathVariable(value = "message") String message) {
		return "Hello Nacos Discovery " + message + ", i am from port " + port;
	}
	
	@GetMapping(value = "/config")
	public String config() {
		return "Hello Nacos Config get " + key + "       getCommonValue:  " + commonKey + "      getShareInfo:  " + shareInfo;
	}
}

此時訪問    getCommonValue:  " + commonKey + "   就應該能獲取到它的值了。

5.3 Nacos針對不同服務應用間配置信息的共享

在實際項目中,常常需要不同應用間配置共享。比如redis連接信息,很多服務都需要,那么就可以把這部分信息交給Nacos進行管理並且實現配置共享,從而實現配置的重用。
編寫配置文件,指定共享配置。

spring:
  application:
    name: nacos-web
  profiles:
    active: dev #開發環境
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.200.128:8848
      config:
        server-addr: 192.168.200.128:8848
        file-extension: yaml #指定nacos配置中心的文件擴展名,默認為properties。支持:TEXT JSON XML YAML HTML Properties
        prefix: nacos-web
        
        shared-dataids: common.yml   #添加共享配置的dataId,如多個使用逗號分隔,並且越靠后,優先級越高。    文件后綴名不能少,只支持yaml,yml,properies
        
        refreshable-dataids: common.yml   #哪些共享配置支持動態刷新,如多個使用逗號分隔
        
        
server:
  port: 9100
management:
  endpoints:
    web:
      exposure:
        include: "*"

#日志
logging:
  level:
    org.springframework.web: debug

創建common.yml配置文件

@RestController
@RefreshScope
public class InfoController {
	
	@Value("${server.port}")
	private String port;
	
	@Value("${key:''}")
	private String key;
	
	@Value("${commonKey:''}")
	private String commonKey;
	
	@Value("${shareInfo:''}")
	private String shareInfo;
	
	@GetMapping(value = "/echo/{message}")
	public String echo(@PathVariable(value = "message") String message) {
		return "Hello Nacos Discovery " + message + ", i am from port " + port;
	}
	
	@GetMapping(value = "/config")
	public String config() {
		return "Hello Nacos Config get " + key + "       getCommonValue:  " + commonKey + "      getShareInfo:  " + shareInfo;
	}
}

此時訪問    getShareInfo:  " + shareInfo  就應該能獲取到它的值了。



6. Nacos加載多配置集

前言:加載公共配置,上面已經講了。如果現在你想加載多個配置集,那些多個配置集並不是要公共使用,只是你這個服務需要加載多個配置集。【使用要求限制:你要多加載的那幾個配置必須在你的namespace空間里面。】

      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml

        extension-configs[0]:
          data-id: common-web-fixed.yaml
          refresh: true

        extension-configs[1]:
          data-id: common.yaml
          refresh: true


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM