Spring Cloud Alibaba(二) 简单使用nacos配置中心

通过登录NACOS管理后台,左侧菜单有4个大分类:配置管理,服务管理,命名空间,集群管理。我们可以将整个架构体系内的所有配置都集中在Nacos中存储。这样做的好处是分离的多环境配置,可以更灵活的管理权限,安全性更高。一般我们修改应用程序的配置文件后,需要重启应用才能生效,而nacos是可以再应用中直接刷新,不用重启。
Spring Cloud Alibaba(二) 简单使用nacos配置中心_第1张图片

命名空间Namespace

官方说明是:

用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 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命名空间,在这个命名空间下创建新的配置。
Spring Cloud Alibaba(二) 简单使用nacos配置中心_第2张图片

说明:Data ID 是以 properties(默认的文件扩展名方式)为扩展名。Data ID 的值默认是对应${spring.application.name}.properties
Group 默认分组即可,如果是想细分维度的话,这里可以自定义。
配置格式:选择properties,这里对应的是上面Data ID 后缀名
配置内容:根据自己实际填写,这里测试填写一个http.url=https://www.baidu.com/
填写完成后,发布保存。

应用中使用nacos配置

在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
然后确认发布。
Spring Cloud Alibaba(二) 简单使用nacos配置中心_第3张图片
再次浏览器访问 http://localhost:1889/config-test ,后台日志结果可以发现属性值已经刷新了。
在这里插入图片描述

yaml 的文件扩展名配置方式

spring-cloud-starter-alibaba-nacos-config 对于 yaml 格式也是完美支持的。
在nacos服务的控制台添加yaml方式的配置,详情如下:
Spring Cloud Alibaba(二) 简单使用nacos配置中心_第4张图片
我们来修改一下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,结果如下:
在这里插入图片描述

Data Id 规则

在 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(一) 简单实现服务注册与发现

Spring Cloud Alibaba(二) 简单使用nacos配置中心

Spring Cloud Alibaba(三)简单接入Sentinel(Sentinel 控制台)

Spring Cloud Alibaba(四)简单接入Sentinel(fallback用法)

Spring Cloud Alibaba(五)简单接入Sentinel(blockHandler 用法)

你可能感兴趣的:(Spring,Cloud,Alibaba,Spring,Cloud,Alibaba,nacos,nacos配置中心)