本文主要面向 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 的位址和應用名
bootstrap.properties
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.application.name=example
說明:之是以需要配置 ,是因為它是構成 Nacos 配置管理
spring.application.name
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
實作配置自動更新:
@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 的服務發現功能,如下圖示:
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
ProviderApplication
ConsumerApplication