配置中心之Nacos应用实践
Nacos配置快速入门
创建项目
(1)创建maven项目
新建module,名字为sca-nacos-config,选中父项目01-sca,右键new->module其中的 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">
<parent>
<artifactId>01-sca</artifactId>
<groupId>com.cy</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>sca-nacos-config</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
</project>
复制代码
(2)创建配置文件
在resource目录下创建bootstrap.yml配置文件(启动优先级最高)代码如下:
#bootstrap.yml加载的优先级要高于application.yml文件
server:
tomcat:
threads:
max: 248
port: 8080
spring:
application:
name: nacos-config
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
group: DEFAULT_GROUP # Group, default is DEFAULT_GROUP
file-extension: yml # Configure the data format of the content, default to properties
复制代码
(3)启动测试
创建启动类,对环境启动测试,代码如下
package com.cy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class NacosConfigApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConfigApplication.class,args);
}
}
复制代码
(4)Nacos基本配置
打开nacos配置中心,新建配置,如图所示: 其中Data IDs的值要与bootstrap.yml中定义的spring.application.name的值相同(服务名-假如有多个服务一般会创建多个配置实例,不同服务对应不同的配置实例)。
(5)创建Controller处理器
创建配置中心Controller,也可以将Controller添加到启动类内部,如图所示:
package com.cy;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
public class NacosConfigApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConfigApplication.class,args);
}
@RefreshScope//支持配置动态刷新
@RestController
@RequestMapping("/config/")
public class NacosConfigController{
@Value("${logging.level.com.cy:info}")
private String logLevel;
@RequestMapping("/doGetLogLevel")
public String doGetLogLevel(){
return "Log level is "+logLevel;
}
}
}
复制代码
其中,@RefreshScope的作用是,在配置中心的相关配置发生变化以后,能够及时看到更新
Controller编写好以后,启动配置中心服务,然后进行访问测试。,打开浏览器直接在地址栏输入http://localhost:8080/config/doGetLogLevel,检测输出结果是否为我们配置中配置的信息,如图所示。
地址
http://localhost:8080/config/doGetLogLevel
复制代码
因为内部使用了@RefreshScope注解支持配置动态刷新,所以在nacos中进行更改可以动态的改变配置 更改后配置,再次访问发现配置已经改变
Nacos配置管理模型
Nacos 配置管理模型由三部分构成,如图所示:
其中:
- Namespace:命名空间,对不同的环境进⾏隔离,⽐如隔离开发环境和⽣产环境。
- Group:分组,将若⼲个服务或者若⼲个配置集归为⼀组。
- Service/DataId:某⼀个服务或配置集,一般对应一个配置文件。
Nacos中的命名空间一般用于配置隔离,这种命名空间的定义一般会按照环境(开发,生产等环境)进行设计和实现.我们默认创建的配置都存储到了public命名空间,如图所示: 创建新的开发环境并定义其配置,然后从开发环境的配置中读取配置信息,该如何实现呢?
第一步:创建新命名空间,如图所示: 命名空间成功创建以后,会在如下列表进行呈现。 在指定命名空间下添加配置,也可以直接取配置列表中克隆,例如: 克隆成功以后,我们会发现在指定的命名空间中有了我们克隆的配置,如图所示:
此时我们修改dev1命名空间中Data Id的nacos-config配置,如图所示: 修改项目module中的配置文件bootstrap.yml,添加如下配置,关键代码如下:
去namespace中找NamespaceID,添加到配置文件中
spring:
cloud:
nacos:
config:
namespace: 5c27fe4a-1141-4836-a14e-cbac77fb2130
复制代码
其中,namespace后面的字符串为命名空间的id,可直接从命名空间列表中进行拷贝,如图所示:
重启服务,继续刷新http://localhost:8080/config/doGetLogLevel地址。检测输出,看看输出的内容是什么,是否为dev命名空间下配置的内容,如图所示:
http://localhost:8080/config/doGetLogLevel
复制代码
我们还可以创建生产环境,依次类推进行设计和实现即可。
分组设计及实现
当我们在指定命名空间下,按环境或服务做好了配置以后,有时还需要基于服务做分组配置,例如,一个服务在不同时间节点(节假日,活动等)切换不同的配置,可以在新建配置时指定分组名称,如图所示: 配置发布以后,修改boostrap.yml配置类,在其内部指定我们刚刚创建的分组,代码如下:
server:
port: 8070
spring:
application:
name: nacos-config
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
group: DEV_GROUP_51 # Group, default is DEFAULT_GROUP
file-extension: yml # Configure the data format of the content, default to properties
namespace: 5c27fe4a-1141-4836-a14e-cbac77fb2130
复制代码
在NacosConfigController类中添加属性和方法用于获取和输出DEV_GROUP_51配置中设置的线程数,代码如下:
@Value("${server.tomcat.threads.max:200}")
private Integer serverThreadMax;
@RequestMapping("/doGetServerThreadMax")
public String doGetserverThreadMax(){
return "server.threads.max is "+serverThreadMax;
}
复制代码
然后重启服务,进行测试,检测内容输出,如图所示:
http://localhost:8080/config/doGetServerThreadMax
复制代码
共享配置设计及读取
当同一个namespace的多个配置文件中都有相同配置时,可以对这些配置进行提取,然后存储到nacos配置中心的一个或多个指定配置文件,哪个微服务需要,就在服务的配置中设置读取即可。例如:
第一步:在nacos中创建一个共享配置文件,例如: 第二步:在指定的微服务配置文件(bootstrap.yml)中设置对共享配置文件的读取,例如:
见红色区域内容。
spring:
application:
name: nacos-config
cloud:
nacos:
config:
server-addr: localhost:8848
# 命名空间
namespace: 83ed55a5-1dd9-4b84-a5fe-a734e4a6ec6d
# 分组名
# group: DEFAULT_GROUP
# 配置中心文件扩展名
file-extension: yml
# 共享配置
shared-configs[0]:
data-id: application-dev.yml
group: DEFAULT_GROUP
refresh: true #默认false
复制代码
第三步:在指定的业务类中读取和应用共享配置即可,例如:
@Value("${page.pageSize:50}")
private Integer pageSize;
@GetMapping("/config/doGetPageSize")
public String doGetPageSize(){
System.out.println("page size is "+pageSize);
return "page size is "+pageSize;
}
复制代码
访问链接
http://localhost:8080/config/config/doGetPageSize
复制代码