天天看點

雲原生之快速使用Nacos Spring Cloud

本文主要面向 ​​Spring Cloud​​ 的使用者,通過兩個示例來介紹如何使用 Nacos 來實作分布式環境下的配置管理和服務注冊發現。

  • 通過 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config 實作配置的動态變更。
  • 通過 Nacos Server 和 spring-cloud-starter-alibaba-nacos-discovery 實作服務的注冊與發現。

前提條件

您需要先下載下傳 Nacos 并啟動 Nacos server。

window系統啟動指令,需要在nacos檔案夾的bin指令行啟動

startup.cmd -m standalone      

啟動配置管理 

啟動了 Nacos server 後,您就可以參考以下示例代碼,為你的 Spring Cloud 應用啟動 Nacos 配置管理服務了

1.添加依賴:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>${latest.version}</version>
</dependency>      
注意:版本 ​​2.1.x.RELEASE​​​ 對應的是 Spring Boot 2.1.x 版本。版本 ​​2.0.x.RELEASE​​​ 對應的是 Spring Boot 2.0.x 版本,版本 ​​1.5.x.RELEASE​​ 對應的是 Spring Boot 1.5.x 版本。 

2.在 ​

​bootstrap.properties​

​ 中配置 Nacos server 的位址和應用名

spring.cloud.nacos.config.server-addr=127.0.0.1:8848

spring.application.name=example      
說明:之是以需要配置 ​

​spring.application.name​

​ ,是因為它是構成 Nacos 配置管理 ​

​dataId​

​字段的一部分。

在 Nacos Spring Cloud 中,​

​dataId​

​ 的完整格式如下:

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

 prefix 預設為 spring.application.name 的值,也可以通過配置項 spring.cloud.nacos.config.prefix來配置。

spring.profiles.active 即為目前環境對應的 profile,詳情可以參考 Spring Boot文檔。 注意:當 spring.profiles.active 為空時,對應的連接配接符 - 也将不存在,dataId 的拼接格式變成 ${prefix}.${file-extension}

file-exetension 為配置内容的資料格式,可以通過配置項 spring.cloud.nacos.config.file-extension 來配置。目前隻支援 properties 和 yaml 類型。

3.通過 Spring Cloud 原生注解 ​

​@RefreshScope​

​ 實作配置自動更新:

@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {

    @Value("${useLocalCache:false}")
    private boolean useLocalCache;

    @RequestMapping("/get")
    public boolean get() {
        return useLocalCache;
    }
}      

4. 首先通過調用 Nacos Open API 向 Nacos Server 釋出配置

dataId 為example.properties,内容為useLocalCache=true

curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=example.properties&group=DEFAULT_GROUP&content=useLocalCache=true"      

5.運作 NacosConfigApplication

調用 curl http://localhost:8080/config/get,傳回内容是 true。

6.再次調用 Nacos Open API 向 Nacos server 釋出配置

dataId 為example.properties,内容為useLocalCache=false

curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=example.properties&group=DEFAULT_GROUP&content=useLocalCache=false      

7.再次通路 http://localhost:8080/config/get

此時傳回内容為false,說明程式中的useLocalCache值已經被動态更新了 

 啟動服務發現

通過實作一個簡單的 ​

​echo service​

​ 示範如何在您的 Spring Cloud 項目中啟用 Nacos 的服務發現功能,如下圖示:

雲原生之快速使用Nacos Spring Cloud

1.添加依賴:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>${latest.version}</version>
</dependency>      
注意:版本 ​​2.1.x.RELEASE​​​ 對應的是 Spring Boot 2.1.x 版本。版本 ​​2.0.x.RELEASE​​​ 對應的是 Spring Boot 2.0.x 版本,版本 ​​1.5.x.RELEASE​​ 對應的是 Spring Boot 1.5.x 版本。

更多版本對應關系參考:​​版本說明 Wiki​​

2.配置服務提供者

進而服務提供者可以通過 Nacos 的服務注冊發現功能将其服務注冊到 Nacos server 上。

i. 在 ​

​application.properties​

​ 中配置 Nacos server 的位址:

server.port=8070
spring.application.name=service-provider

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848      

ii. 通過 Spring Cloud 原生注解 ​

​@EnableDiscoveryClient​

​ 開啟服務注冊發現功能:

@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderApplication {

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

  @RestController
  class EchoController {
    @RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
    public String echo(@PathVariable String string) {
      return "Hello Nacos Discovery " + string;
    }
  }
}      

3.配置服務消費者

進而服務消費者可以通過 Nacos 的服務注冊發現功能從 Nacos server 上擷取到它要調用的服務。 

server.port=8080
spring.application.name=service-consumer

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848      
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerApplication {

    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

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

    @RestController
    public class TestController {

        private final RestTemplate restTemplate;

        @Autowired
        public TestController(RestTemplate restTemplate) {this.restTemplate = restTemplate;}

        @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
        public String echo(@PathVariable String str) {
            return restTemplate.getForObject("http://service-provider/echo/" + str, String.class);
        }
    }
}      

4.啟動 ​

​ProviderApplication​

​​ 和 ​

​ConsumerApplication​

​