通过登录NACOS管理后台,左侧菜单有4个大分类:配置管理,服务管理,命名空间,集群管理。我们可以将整个架构体系内的所有配置都集中在Nacos中存储。这样做的好处是分离的多环境配置,可以更灵活的管理权限,安全性更高。一般我们修改应用程序的配置文件后,需要重启应用才能生效,而nacos是可以再应用中直接刷新,不用重启。
官方说明是:
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
没有明确指定spring.cloud.nacos.config.namespace
配置情况下,模式使用的是public。
上图中创建了两个命名空间,一个DEV,一个TEST.此时在配置列表和服务列表上面可以看到多了DEV和TEST两个标签项。
需要注意的是,我们在应用程序中配置
spring.cloud.nacos.config.namespace
是指定其命名空间ID,而非命名空间名称。该配置必须放在
bootstrap.properties 文件中
spring.cloud.nacos.config.namespace=39850848-bd53-47eb-8e4d-0a29de89abe6
本文用于测试,spring.cloud.nacos.config.namespace 的值是 TEST对应的 id。
在配置列表菜单中,选择刚创建的TEST命名空间,在这个命名空间下创建新的配置。
说明:Data ID 是以 properties(默认的文件扩展名方式)为扩展名。Data ID 的值默认是对应
${spring.application.name}
.properties
Group 默认分组即可,如果是想细分维度的话,这里可以自定义。
配置格式:选择properties,这里对应的是上面Data ID 后缀名
配置内容:根据自己实际填写,这里测试填写一个http.url=https://www.baidu.com/
填写完成后,发布保存。
在Spring Cloud Alibaba(一) 简单实现服务注册与发现 文中,我们创建了一个服务消费者的应用,在此基础上,我们进行改造。首先在pom文件中添加spring-cloud-starter-alibaba-nacos-config依赖。
完整的pom文件如下:
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.floyd.nacos.consumer</groupId>
<artifactId>springcloud-nacos-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springcloud-nacos-consumer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR2</spring-cloud.version>
<spring-cloud-alibaba.version>2.1.0.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
<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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
然后需要创建一个bootstrap.properties配置文件
注意:必须使用 bootstrap.properties 配置文件来配置Nacos Server 地址
#namespace指向的是命名空间的ID ,
spring.cloud.nacos.config.namespace=39850848-bd53-47eb-8e4d-0a29de89abe6
# 配置文件分组,不配置就使用的默认配置DEFAULT_GROUP
spring.cloud.nacos.config.group=DEFAULT_GROUP
#配置服务器地址,nacos的地址,如果是域名,80端口不能省略
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# 配置文件前缀名称,不配置就会使用 spring.application.name的值
spring.cloud.nacos.config.prefix=consumer-config
application.properties 配置文件内容:
server.port=1889
spring.application.name=nacos-server-consumer
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.cloud.nacos.discovery.namespace=39850848-bd53-47eb-8e4d-0a29de89abe6
management.endpoints.web.exposure.include=*
创建一个config类:
@Component
@Data
@RefreshScope //刷新配置属性的值
public class Config {
@Value ("${http.url}")
private String url;
}
改造一下TestController,代码如下:
import com.floyd.nacos.consumer.config.Config;
import com.floyd.nacos.consumer.service.TestService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* 注释
*
* @author floyd
* @version : TestController.java, v 0.1 2019/10/11 9:50 By floyd Edit $$
*/
@RestController
@Slf4j
public class TestController {
@Autowired
private RestTemplate restTemplate;
@Autowired(required = false)
private TestService echoService;
@Autowired
private Config config;
/**
* nacos配置测试
* @return
*/
@GetMapping (value = "/config-test")
public String testConfig (){
log.info ("nacos配置文件属性http.url={}",config.getUrl ());
return config.getUrl ();
}
/**
* RestTemplate 请求
* @param str
* @return
*/
@GetMapping (value = "/echo-rest/{str}")
public String rest(@PathVariable String str) {
String result = restTemplate.getForObject("http://nacos-server-provider/echo/" + str, String.class);
log.info ("服务生产者返回的结果:{}",result);
return result;
}
/**
* FeignClient 请求
* @param str
* @return
*/
@GetMapping(value = "/echo-feign/{str}")
public String feign(@PathVariable String str) {
return echoService.echo(str);
}
}
启动应用,浏览器访问 http://localhost:1889/config-test 后台打印日志结果显示与前面我们配置的http.url值一直
在nacos后台修改配置文件,查看应用中是否能获取最新的值。将http.url值修改成 http://www.163.com
然后确认发布。
再次浏览器访问 http://localhost:1889/config-test ,后台日志结果可以发现属性值已经刷新了。
spring-cloud-starter-alibaba-nacos-config 对于 yaml 格式也是完美支持的。
在nacos服务的控制台添加yaml方式的配置,详情如下:
我们来修改一下Config类:
@Component
@Data
@RefreshScope
@ConfigurationProperties(prefix = "http")
public class Config {
private String url;
private String name;
}
这里url 和name 就是对应的nacos配置文件中的两个属性。通过@ConfigurationProperties
注解可以直接注入进来。然后再来修改一下TestController 中的testConfig()方法:
/**
* nacos配置测试
* @return
*/
@GetMapping (value = "/config-test")
public String testConfig (){
log.info ("nacos配置文件属性http.url={}",config.getUrl ());
log.info ("nacos配置文件属性http.name={}",config.getName ());
return config.getUrl ();
}
完成后启动应用,通过浏览器访问 http://localhost:1889/config-test,结果如下:
在 bootstrap.properties 文件中,我们通过spring.cloud.nacos.config.prefix
来指定了文件的前缀名称
在nacos控制台里,Data ID 的值 是 ${spring.cloud.nacos.config.prefix}.后缀名(properties/yaml)
。如果没有设置此参数 则是 ${spring.application.name}.后缀名(properties/yaml)
。
在日常开发中如果遇到多套环境下的不同配置,可以通过Spring 提供的 ${spring.profiles.active}
这个配置项来配置。这个属性需必须要放在 bootstrap.properties 文件中
在nacos配置列表中增加一个Data ID为 yaml-consumer-config-dev.yaml 配置文件,bootstrap.properties文件增加一个spring.profiles.active 属性
spring.profiles.active=dev
在生成环境下的 Naocs 添加了dataid为:yaml-consumer-config-pro.yaml的配置,bootstrap.properties文件增加一个spring.profiles.active 属性
spring.profiles.active=pro
真正的项目实施过程中这个变量的值是需要不同环境而有不同的值。这个时候通常的做法是通过 -Dspring.profiles.active= 参数指定其配置来达到环境间灵活的切换。
以上的配置方法,可以满足大部分用户的需求了。官方还支持自定义扩展的 Data Id 配置,有需要的话可以 查看深入研究一下。
https://github.com/alibaba/spring-cloud-alibaba/wiki
刚入坑学习记录一下,如果错误不足,欢迎指出。
Spring Cloud Alibaba(一) 简单实现服务注册与发现
Spring Cloud Alibaba(二) 简单使用nacos配置中心
Spring Cloud Alibaba(三)简单接入Sentinel(Sentinel 控制台)
Spring Cloud Alibaba(四)简单接入Sentinel(fallback用法)
Spring Cloud Alibaba(五)简单接入Sentinel(blockHandler 用法)