Nacos官网 | Nacos 官方社区 | Nacos 下载 | Nacos
Nacos 是一个简单易用的动态服务发现、配置和服务管理平台,用于构建云原生应用。
通过Spring Cloud Alibaba Nacos Discovery,您可以基于Spring Cloud的编程模型快速访问Nacos服务注册功能。
服务注册/发现
服务发现是微服务架构中的关键组件之一。在这样的体系结构中,手动为每个客户端配置服务列表可能是一项艰巨的任务,并且使动态扩展变得极其困难。Nacos Discovery 帮助您自动将服务注册到 Nacos 服务器,Nacos 服务器会跟踪服务并动态刷新服务列表。此外,Nacos Discovery 还会将服务实例的部分元数据(如主机、端口、健康检查 URL、主页等)注册到 Nacos。
如何引入 Nacos Discovery 进行服务注册/发现
请使用组 ID 为 和 com.alibaba.cloud
工件 ID 为 spring-cloud-starter-alibaba-nacos-discovery
的启动器。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
使用 Nacos Discovery 进行服务注册/发现和调用的示例
Nacos Discovery 与 Netflix 功能区集成,RestTemplate 或 OpenFeign 可用于服务到服务调用。
Nacos Server 启动
Nacos Server 启动后,进入 http://ip:8848 查看控制台(默认账号名/密码为 nacos/nacos):
启动提供程序应用程序
以下示例演示了如何向 Nacos 注册服务。
pom.xml的配置 以下是pom.xml的完整示例:
<?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>open.source.test</groupId>
<artifactId>nacos-discovery-test</artifactId>
<version>1.0-SNAPSHOT</version>
<name>nacos-discovery-test</name>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${spring.boot.version}</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.properties 的配置 Nacos 的一些基本配置必须包含在 application.properties(或 application.yaml)中,如下图所示:
application.properties
server.port=8081
spring.application.name=nacos-provider
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
management.endpoints.web.exposure.include=*
如果不想使用 Nacos 进行服务注册和发现,可以设置为 spring.cloud.nacos.discovery
false
。
以下是启动 Provider 的示例:
@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderDemoApplication {
public static void main(String[] args) {
SpringApplication.run(NacosProviderDemoApplication.class, args);
}
@RestController
public class EchoController {
@GetMapping(value = "/echo/{string}")
public String echo(@PathVariable String string) {
return "Hello Nacos Discovery " + string;
}
}
}
现在您可以在 Nacos 控制台上看到已注册的服务。
在启动提供商应用程序之前,请先启动 Nacos。
启动消费者应用程序
它可能不像启动提供程序应用程序那么容易,因为使用者需要调用提供程序的 RESTful 服务。在此示例中,我们将使用最原始的方式,即显式组合 LoadBalanceClient 和 RestTemplate 来访问 RESTful 服务。您可以参考第 1.2 节了解 pom.xml 和 application.properties 配置。以下是启动使用者应用程序的示例代码。
可以通过使用 RestTemplate 和 FeignClient 进行负载均衡来访问服务。
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerApp {
@RestController
public class NacosController{
@Autowired
private LoadBalancerClient loadBalancerClient;
@Autowired
private RestTemplate restTemplate;
@Value("${spring.application.name}")
private String appName;
@GetMapping("/echo/app-name")
public String echoAppName(){
//Access through the combination of LoadBalanceClient and RestTemplate
ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-provider");
String path = String.format("http://%s:%s/echo/%s",serviceInstance.getHost(),serviceInstance.getPort(),appName);
System.out.println("request path:" +path);
return restTemplate.getForObject(path,String.class);//String.class 是该接口的返回值类型,如果返回值是其它的,可以修改
}
}
//Instantiate RestTemplate Instance
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(NacosConsumerApp.class,args);
}
}
注入了一个 LoadBalancerClient 实例,并手动实例化了一个 RestTemplate。同时,我们将 的 spring.application.name
配置值注入到应用中,以便在调用提供者的服务时可以显示当前应用名称。
接下来,访问消费者提供的 http://ip:port/echo/app-name
接口。在这里,我们开始了 8082 的端口。访问结果如下图所示:
Address:http://127.0.0.1:8082/echo/app-name Access result: Hello Nacos Discovery nacos-consumer
Nacos 发现端点
Nacos Discovery 在内部提供了一个 Endpoint,其对应的 Endpoint ID 为 nacosdiscovery
。
Endpoint exposed json 包含两个属性:
subscribe:显示当前服务订阅者
NacosDiscoveryProperties:显示当前服务的当前基本 Nacos 配置
下面显示了服务实例如何访问终结点:
{
"subscribe": [
{
"jsonFromServer": "",
"name": "nacos-provider",
"clusters": "",
"cacheMillis": 10000,
"hosts": [
{
"instanceId": "30.5.124.156#8081#DEFAULT#nacos-provider",
"ip": "30.5.124.156",
"port": 8081,
"weight": 1.0,
"healthy": true,
"enabled": true,
"cluster": {
"serviceName": null,
"name": null,
"healthChecker": {
"type": "TCP"
},
"defaultPort": 80,
"defaultCheckPort": 80,
"useIPPort4Check": true,
"metadata": {
}
},
"service": null,
"metadata": {
}
}
],
"lastRefTime": 1541755293119,
"checksum": "e5a699c9201f5328241c178e804657e11541755293119",
"allIPs": false,
"key": "nacos-provider",
"valid": true
}
],
"NacosDiscoveryProperties": {
"serverAddr": "127.0.0.1:8848",
"endpoint": "",
"namespace": "",
"logName": "",
"service": "nacos-provider",
"weight": 1.0,
"clusterName": "DEFAULT",
"metadata": {
},
"registerEnabled": true,
"ip": "30.5.124.201",
"networkInterface": "",
"port": 8082,
"secure": false,
"accessKey": "",
"secretKey": ""
}
}
Weight Route
关于 Nacos Discovery Starter 配置的更多信息
Spring Cloud Alibaba Reference Documentation
Spring Cloud 阿里巴巴 Nacos 配置
Nacos 是一个简单易用的动态服务发现、配置和服务管理平台,用于构建云原生应用。
使用Spring Cloud Alibaba Nacos Config,基于Spring Cloud的编程模型,快速访问Nacos配置管理能力。
如何引入 Nacos Config 进行配置
请使用组 ID 为 和 com.alibaba.cloud
工件 ID 为 spring-cloud-starter-alibaba-nacos-config
的启动器。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
快速入门
Nacos Config 使用 DataId 和 GROUP 来确定配置。
下图显示了 DataId 使用 myDataid
、 GROUP 使用 DEFAULT_GROUP
和 配置格式为 Properties 的配置项:
初始化 Nacos Server
Data ID: nacos-config.properties
Group : DEFAULT_GROUP
Configuration format: Properties
Configuration content: user.name=nacos-config-properties
user.age=90
客户端上的使用情况
如果要使用 Nacos 管理应用程序的外部化配置,请使用组 ID 为 和 com.alibaba.cloud
artifact ID 为 spring-cloud-starter-alibaba-nacos-config
的启动器。
现在我们可以创建一个标准的 Spring Boot 应用程序。
@SpringBootApplication
public class NacosConfigApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(NacosConfigApplication.class, args);
String userName = applicationContext.getEnvironment().getProperty("user.name");
String userAge = applicationContext.getEnvironment().getProperty("user.age");
System.err.println("user name :" +userName+"; age: "+userAge);
}
}
请注意,当您
,由于 spring-cloud-alibaba
’s version is ``2021.1
get nacos
文件中的配置将在 bootstrap.yml
文件之前加载。根据spring的官方文档提到[bootstrap](https://docs.spring.io/spring-cloud-config/docs/current/reference/html/#config-first-bootstrap)为了解决这个问题,我们建议你在项目根 application.yml
文件中添加以下依赖pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.1.1</version>
</dependency>
使用 YAML 格式的 DataId 添加配置
Nacos Config 也支持 yaml 格式。您只需要完成以下 2 个步骤。
1、在bootstrap.properties文件中,添加以下行,声明DataId的格式为yaml。如下:
spring.cloud.nacos.config.file-extension=yaml
2、在 Nacos 控制台添加 DataId 为 yaml 格式的配置,如下图所示:
Data ID: nacos-config.yaml
Group : DEFAULT_GROUP
Configuration format: YAML
Configuration content: user.name: nacos-config-yaml
user.age: 68
完成前面的两个步骤后,重新启动测试程序,您将看到以下结果。
2018-11-02 14:59:00.484 INFO 32928 --- [main] c.a.demo.provider.NacosConfigApplication:Started NacosConfigApplication in 14.183 seconds (JVM running for 14.671)
user name :nacos-config-yaml; age: 68
2018-11-02 14:59:00.529 INFO 32928 --- [-127.0.0.1:8848] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@265a478e: startup date [Fri Nov 02 14:59:00 CST 2018]; root of context hierarchy
支持动态配置
Nacos Config 还支持动态配置更新。启动Spring Boot应用测试的代码如下:
@SpringBootApplication
public class NacosConfigApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(NacosConfigApplication.class, args);
while(true) {
//When configurations are refreshed dynamically, they will be updated in the Enviroment, therefore here we retrieve configurations from Environment every other second.
String userName = applicationContext.getEnvironment().getProperty("user.name");
String userAge = applicationContext.getEnvironment().getProperty("user.age");
System.err.println("user name :" + userName + "; age: " + userAge);
TimeUnit.SECONDS.sleep(1);
}
}
}
更改 user.name 时,可以从应用程序中检索最新值,如下所示:
//Read the updated value from Enviroment
user name :nacos-config-yaml-update; age: 68
user name :nacos-config-yaml-update; age: 68
支持配置文件级别的配置
当 Nacos Config 加载配置时,也会加载 DataId 为 ${spring.application.name}. ${file-extension:properties}
、DataId 为 的基本 ${spring.application.name}-${profile}. ${file-extension:properties}
配置。如果需要使用不同环境的不同配置,可以使用 Spring 提供的 ${spring.profiles.active}
配置。
spring.profiles.active=develop
在配置文件中指定时,${spring.profiles.active}必须放在bootstrap.properties中。
Data ID: nacos-config-develop.yaml
Group : DEFAULT_GROUP
Configuration format: YAML
Configuration content: current.env: develop-env
运行以下 Spring Boot 应用程序测试代码:
@SpringBootApplication
public class NacosConfigApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(NacosConfigApplication.class, args);
while(true) {
String userName = applicationContext.getEnvironment().getProperty("user.name");
String userAge = applicationContext.getEnvironment().getProperty("user.age");
//Get the current deployment environment
String currentEnv = applicationContext.getEnvironment().getProperty("current.env");
System.err.println("in "+currentEnv+" enviroment; "+"user name :" + userName + "; age: " + userAge);
TimeUnit.SECONDS.sleep(1);
}
}
}
启动后,您可以在控制台中看到如下输出:
in develop-env enviroment; user name :nacos-config-yaml-update; age: 68
要切换到生产环境,只需更改 的 ${spring.profiles.active}
参数即可。如下图所示:
spring.profiles.active=product
同时,在生产环境的 Nacos 中添加带有 DataId 的基本配置。例如,您可以在生产环境的 Nacos 中添加 DataId 为 nacos-config-product.yaml 的配置:
Data ID: nacos-config-product.yaml
Group : DEFAULT_GROUP
Configuration format: YAML
Configuration content: current.env: product-env
启动测试程序,您将看到以下结果:
in product-env enviroment; user name :nacos-config-yaml-update; age: 68
in product-env enviroment; user name :nacos-config-yaml-update; age: 68
支持自定义命名空间
命名空间用于隔离不同租户的配置。组和数据 ID 在不同的命名空间中可以相同。命名空间的典型场景是针对不同环境的配置隔离,例如开发/测试环境与生产环境(配置和服务等)之间的隔离。
如果 中没有指定 ${spring.cloud.nacos.config.namespace}
命名空间,则使用 Nacos 的 “Public” 命名空间。还可以通过以下方式指定自定义命名空间:
spring.cloud.nacos.config.namespace=b3404bc0-d7dc-4855-b519-570ed34b62d7
支持自定义组
默认情况下,未 {spring.cloud.nacos.config.group}
定义任何配置时使用 DEFAULT_GROUP。如果需要定义自己的组,可以在以下属性中定义它:
spring.cloud.nacos.config.group=DEVELOP_GROUP
此配置必须位于 bootstrap.properties 文件中,并且 Group 的值必须与 的 spring.cloud.nacos.config.group
值相同。