天天看點

Nacos整合SpringCloud(配置中心、注冊中心)

1.什麼是Nacos?

Nacos 是阿裡巴巴開源的一個更易于建構雲原生應用的動态服務發現、配置管理和服務管理平台。

2.Nacos Config整合

Nacos Config Starter實作Spring Cloud應用程式的外部化配置。
2.1 啟動 Nacos Server 并添加配置
1.下載下傳位址:
  1. 直接下載下傳:Nacos Server 下載下傳頁
  2. 源碼建構:Github 項目頁面
2.啟動
  1. Linux/Unix/Mac 作業系統,執行指令

    sh startup.sh -m standalone

  2. Windows 作業系統,執行指令

    cmd startup.cmd

  3. 預設賬戶密碼:nacos
3.在指令行執行如下指令,向 Nacos Server 中添加一條配置,也可在控制台中手動添加。
添加的配置的詳情如下
           
dataId 為 nacos-config-example.properties
 group 為 DEFAULT_GROUP
 
 内容如下
 
 	user.id=1
 	user.name=james
 	user.age=17	
           
Nacos整合SpringCloud(配置中心、注冊中心)
2.1 引入pom檔案
<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
 </dependency>
           
2.2 添加bootstrap.properties
spring.application.name=nacos-config-example
spring.cloud.nacos.config.server-addr=ip:8848 #伺服器ip或本地ip
           
2.3 擷取相應的配置
@RefreshScope //打開動态重新整理功能
 class SampleController {

 	@Value("${user.name}")
 	String userName;

 	@Value("${user.age}")
 	int age;
 }
           
2.4 應用啟動
1.添加/application.properties
server.port=18084
management.endpoints.web.exposure.include=*
           
2.App啟動
Nacos整合SpringCloud(配置中心、注冊中心)
2.5 原理

1.Nacos Config 資料結構

Nacos Config 主要通過 dataId 和 group 來唯一确定一條配置.

Nacos Client 從 Nacos Server 端擷取資料時,調用的是此接口

ConfigService.getConfig(String dataId, String group, long timeoutMs)

2.Spring Cloud 應用擷取資料

dataId
在 Nacos Config Starter 中,dataId 的拼接格式如下
${prefix} - ${spring.profiles.active} . ${file-extension}
           
  • prefix

    預設為

    spring.application.name

    的值,也可以通過配置項

    spring.cloud.nacos.config.prefix

    來配置。
  • spring.profiles.active

    即為目前環境對應的 profile,詳情可以參考 Spring Boot文檔

    注意,當 activeprofile 為空時,對應的連接配接符 - 也将不存在,dataId 的拼接格式變成 p r e f i x . {prefix}. prefix.{file-extension}

  • file-extension

    為配置内容的資料格式,可以通過配置項

    spring.cloud.nacos.config.file-extension

    來配置。 目前隻支援

    properties

    類型。
group
  • group

    預設為

    DEFAULT_GROUP

    ,可以通過

    spring.cloud.nacos.config.group

    配置。

3.自動注入

Nacos Config Starter 實作了

org.springframework.cloud.bootstrap.config.PropertySourceLocator

接口,并将優先級設定成了最高。

在 Spring Cloud 應用啟動階段,會主動從 Nacos Server 端擷取對應的資料,并将擷取到的資料轉換成 PropertySource 且注入到 Environment 的 PropertySources 屬性中,是以使用 @Value 注解也能直接擷取 Nacos Server 端配置的内容。

4.動态重新整理

Nacos Config Starter 預設為所有擷取資料成功的 Nacos 的配置項添加了監聽功能,在監聽到服務端配置發生變化時會實時觸發

org.springframework.cloud.context.refresh.ContextRefresher

的 refresh 方法 。

如果需要對 Bean 進行動态重新整理,給類添加

@RefreshScope

@ConfigurationProperties

注解。

5.Endpoint 資訊檢視

Springboot支援這一點,Nacos Config也同時可以使用Endpoint來暴露資訊。

在maven 中添加

spring-boot-starter-actuator

依賴,并在配置中允許 Endpoints 的通路。
  • Spring Boot 1.x 中添加配置 management.security.enabled=false
  • Spring Boot 2.x 中添加配置 management.endpoints.web.exposure.include=*

Spring Boot 1.x 可以通過通路 http://127.0.0.1:18084/nacos_config 來檢視 Nacos Endpoint 的資訊。

Spring Boot 2.x 可以通過通路 http://127.0.0.1:18084/actuator/nacos-config 來通路。

Nacos整合SpringCloud(配置中心、注冊中心)
2.6 更多
配置項 key 預設值 說明
服務端位址 spring.cloud.nacos.config.server-addr
DataId字首 spring.cloud.nacos.config.prefix spring.application.name
Group spring.cloud.nacos.config.group DEFAULT_GROUP
dataID字尾及内容檔案格式 spring.cloud.nacos.config.file-extension properties dataId的字尾,同時也是配置内容的檔案格式,目前隻支援 properties
配置内容的編碼方式 spring.cloud.nacos.config.encode UTF-8 配置的編碼
擷取配置的逾時時間 spring.cloud.nacos.config.timeout 3000 機關為 ms
配置的命名空間 spring.cloud.nacos.config.namespace 常用場景之一是不同環境的配置的區分隔離,例如開發測試環境和生産環境的資源隔離等。
AccessKey spring.cloud.nacos.config.access-key
SecretKey spring.cloud.nacos.config.secret-key
相對路徑 spring.cloud.nacos.config.context-path 服務端 API 的相對路徑
接入點 spring.cloud.nacos.config.endpoint UTF-8 地域的某個服務的入口域名,通過此域名可以動态地拿到服務端位址
是否開啟監聽和自動重新整理 spring.cloud.nacos.config.refresh.enabled true

3.Nacos Discovery 整合

Nacos Discovery Starter 完成 Spring Cloud 應用的服務注冊與發現。
3.1 添加依賴
<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
 </dependency>
           
3.2 application.properties
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
           
3.3 服務注冊和發現
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {

 	public static void main(String[] args) {
 		SpringApplication.run(Application.class, args);
 	}

 	@RestController
 	class EchoController {
 		@RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
 		public String echo(@PathVariable String string) {
 				return string;
 		}
 	}
 }
           
3.4 啟動Nacos服務端
  1. 通過從源代碼下載下傳或建構來安裝Nacos Server。推薦的最新版本Nacos Server
    1. 下載下傳Nacos Server 下載下傳頁面
    2. 從源代碼建構:通過git clone [email protected]擷取源代碼:來自Github Nacos的alibaba / Nacos.git并建構您的代碼。有關詳細資訊,請參閱建構
  2. 運作
    1. Linux / Unix / Mac,執行

      sh startup.sh -m standalone

    2. Windows,執行

      cmd startup.cmd

3.5 啟動用戶端
1.添加application.properties配置
spring.application.name=service-provider
 server.port=18082
           
3.6 查詢服務
http://127.0.0.1:8848/nacos/v1/ns/instances?serviceName=service-provider
           
Nacos整合SpringCloud(配置中心、注冊中心)
3.7 服務發現

Nacos Discovery Starter預設內建了Ribbon,是以對于使用Ribbon進行負載平衡的元件,您可以直接使用Nacos服務發現。

NacosServerList實作com.netflix.loadbalancer.ServerList接口并在@ConditionOnMissingBean下自動注入它。

使用RestTemplate和FeignClient

  1. 添加@LoadBlanced注釋以使Ribbon可以通路RestTemplate
    @Bean
     @LoadBalanced
     public RestTemplate restTemplate() {
         return new RestTemplate();
     }
               
  2. FeignClient預設內建了功能區,顯示了如何配置FeignClient。
    @FeignClient(name = "service-provider")
     public interface EchoService {
         @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
         String echo(@PathVariable("str") String str);
     }
               
    使用@FeignClient批注将

    EchoService

    接口包裝為FeignClient,其屬性名稱對應于服務名稱

    service-provider

    方法的

    @RequestMapping

    注釋

    echo

    将echo方法與URL對應

    /echo/{str}

    @PathVariable

    注釋映射

    {str}

    str

    echo方法的參數的URL路徑中。
  3. 完成上述配置後,将它們注入TestController。
    @RestController
     public class TestController {
     
         @Autowired
         private RestTemplate restTemplate;
         @Autowired
         private EchoService echoService;
    
         //RestTemplate
         @RequestMapping(value = "/echo-rest/{str}", method = RequestMethod.GET)
         public String rest(@PathVariable String str) {
             return restTemplate.getForObject("http://service-provider/echo/" + str, String.class);
         }
         //FeignClient
         @RequestMapping(value = "/echo-feign/{str}", method = RequestMethod.GET)
         public String feign(@PathVariable String str) {
             return echoService.echo(str);
         }
     }
               
  4. 添加application.properties配置
    spring.application.name=service-consumer
     server.port=18083
               
  5. 運作

驗證

  1. http://127.0.0.1:18083/echo-rest/1234

    在浏覽器位址欄中輸入并單擊轉到,我們可以看到浏覽器顯示nacos-discovery-provider-example傳回的消息“hello Nacos Discovery 1234”,以證明服務發現有效。
    Nacos整合SpringCloud(配置中心、注冊中心)
  1. http://127.0.0.1:18083/echo-feign/12345

    在浏覽器位址欄中輸入并單擊轉到,我們可以看到浏覽器顯示nacos-discovery-provider-example傳回的消息“hello Nacos Discovery 12345”,以證明服務發現有效。
Nacos整合SpringCloud(配置中心、注冊中心)
3.8 原理

服務注冊

在Spring雲應用程式的啟動階段,将監視WebServerInitializedEvent事件。在初始化Web容器後收到WebServerInitializedEvent事件時,将觸發注冊操作,并調用ServiceRegistry注冊方法以将服務注冊到Nacos Server。

服務發現

NacosServerList實作com.netflix.loadbalancer.ServerList接口并在@ConditionOnMissingBean下自動注入它。功能區預設為內建。

端點

Nacos Discovery Starter還支援Spring Boot執行器端點的實作。

先決條件:

将依賴spring-boot-starter-actuator添加到pom.xml檔案中,并配置端點安全政策。

Spring Boot 1.x:添加配置management.security.enabled = false

Spring Boot 2.x:添加配置management.endpoints.web.exposure.include = *

要檢視端點資訊,請通路以下URL:

Spring Boot1.x:Nacos Discovery端點URL是http://127.0.0.1:18083/nacos_discovery。

Spring Boot2.x:Nacos Discovery端點URL是http://127.0.0.1:18083/actuator/nacos-discovery。

Nacos整合SpringCloud(配置中心、注冊中心)
3.9 更多
配置項 預設值 描述
伺服器位址 spring.cloud.nacos.discovery.server-addr nacos注冊中心位址
服務名 spring.cloud.nacos.discovery.service spring.application.name 服務名
權重 spring.cloud.nacos.discovery.weight 1 值從1到100,值越大,重量越大
IP spring.cloud.nacos.discovery.ip ip address to registry,最高優先級
網絡接口 spring.cloud.nacos.discovery.network-interface 未配置IP時,注冊的IP位址為網絡接口對應的IP位址。如果未配置此項,則預設采用第一個網絡接口的位址。
端口 spring.cloud.nacos.discovery.port -1 注冊端口,無需配置即可自動檢測
namesapce spring.cloud.nacos.discovery.namespace 開發環境(dev、pro等)
accesskey spring.cloud.nacos.discovery.access-key
secretkey spring.cloud.nacos.discovery.secret-key
中繼資料 spring.cloud.nacos.discovery.metadata 擴充資料,使用Map格式配置
日志名稱 spring.cloud.nacos.discovery.log-name
端點 spring.cloud.nacos.discovery.endpoint 服務的域名,通過該域名可以動态擷取伺服器位址。
內建功能區 ribbon.nacos.enabled true