配置中心之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配置中心,新建配置,如图所示:![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lfhfZmLg-1622904728365)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images22899269607.png)]](https://code84.com/wp-content/uploads/2022/10/20210606165855271.png)
其中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
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h5wlLHeK-1622904728369)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images22900042352.png)]](https://code84.com/wp-content/uploads/2022/10/2021060616592125.png)
因为内部使用了@RefreshScope注解支持配置动态刷新,所以在nacos中进行更改可以动态的改变配置![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-05Q5gccC-1622904728371)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images22900087472.png)]](https://code84.com/wp-content/uploads/2022/10/20210606165941933.png)
更改后配置,再次访问发现配置已经改变![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zRWQ8RcM-1622904728373)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images22900222224.png)]](https://code84.com/wp-content/uploads/2022/10/20210606170153882.png)
Nacos配置管理模型
Nacos 配置管理模型由三部分构成,如图所示:![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mLQXpiH2-1622904728375)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images22900575360.png)]](https://code84.com/wp-content/uploads/2022/10/2021060617023649.png)
其中:
- Namespace:命名空间,对不同的环境进⾏隔离,⽐如隔离开发环境和⽣产环境。
- Group:分组,将若⼲个服务或者若⼲个配置集归为⼀组。
- Service/DataId:某⼀个服务或配置集,一般对应一个配置文件。
Nacos中的命名空间一般用于配置隔离,这种命名空间的定义一般会按照环境(开发,生产等环境)进行设计和实现.我们默认创建的配置都存储到了public命名空间,如图所示:
创建新的开发环境并定义其配置,然后从开发环境的配置中读取配置信息,该如何实现呢?
第一步:创建新命名空间,如图所示:![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nyg3fj5D-1622904728377)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images22900937555.png)]命名空间成功创建以后,会在如下列表进行呈现。](https://code84.com/wp-content/uploads/2022/10/20210606170349471.png)
命名空间成功创建以后,会在如下列表进行呈现。
在指定命名空间下添加配置,也可以直接取配置列表中克隆,例如:![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X7d2eHBL-1622904728378)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images22901253266.png)]克隆成功以后,我们会发现在指定的命名空间中有了我们克隆的配置,如图所示:](https://code84.com/wp-content/uploads/2022/10/20210606170502628.png)
克隆成功以后,我们会发现在指定的命名空间中有了我们克隆的配置,如图所示:![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LBkyO2nv-1622904728379)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images22901723441.png)]](https://code84.com/wp-content/uploads/2022/10/20210606170531636.png)
此时我们修改dev1命名空间中Data Id的nacos-config配置,如图所示:![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EpJ9lsjh-1622904728380)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images22901813672.png)]](https://code84.com/wp-content/uploads/2022/10/20210606170711612.png)
修改项目module中的配置文件bootstrap.yml,添加如下配置,关键代码如下:
去namespace中找NamespaceID,添加到配置文件中![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JGHeYRXP-1622904728380)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images22901994265.png)]](https://code84.com/wp-content/uploads/2022/10/20210606170806953.png)
spring:
cloud:
nacos:
config:
namespace: 5c27fe4a-1141-4836-a14e-cbac77fb2130
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xoi9BrSG-1622904728381)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images22902051409.png)]](https://code84.com/wp-content/uploads/2022/10/20210606170848322.png)
其中,namespace后面的字符串为命名空间的id,可直接从命名空间列表中进行拷贝,如图所示:
重启服务,继续刷新http://localhost:8080/config/doGetLogLevel地址。检测输出,看看输出的内容是什么,是否为dev命名空间下配置的内容,如图所示:
http://localhost:8080/config/doGetLogLevel
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ijwKMNrY-1622904728381)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images22902139790.png)]](https://code84.com/wp-content/uploads/2022/10/20210606170917377.png)
我们还可以创建生产环境,依次类推进行设计和实现即可。
分组设计及实现
当我们在指定命名空间下,按环境或服务做好了配置以后,有时还需要基于服务做分组配置,例如,一个服务在不同时间节点(节假日,活动等)切换不同的配置,可以在新建配置时指定分组名称,如图所示:![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P0u5nZAH-1622904728382)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images22903671504.png)]](https://code84.com/wp-content/uploads/2022/10/20210606170941515.png)
配置发布以后,修改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
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8pXXOxSO-1622904728382)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images22903764351.png)]](https://code84.com/wp-content/uploads/2022/10/20210606171023276.png)
在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
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SYgB6Vlf-1622904728383)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images22903861845.png)]](https://code84.com/wp-content/uploads/2022/10/2021060617105019.png)
共享配置设计及读取
当同一个namespace的多个配置文件中都有相同配置时,可以对这些配置进行提取,然后存储到nacos配置中心的一个或多个指定配置文件,哪个微服务需要,就在服务的配置中设置读取即可。例如:
第一步:在nacos中创建一个共享配置文件,例如:![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0jVB4P4n-1622904728383)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images22904151351.png)]](https://code84.com/wp-content/uploads/2022/10/20210606171115289.png)
第二步:在指定的微服务配置文件(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
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-537ma25p-1622904728383)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images22904343791.png)]](https://code84.com/wp-content/uploads/2022/10/20210606171141822.png)
第三步:在指定的业务类中读取和应用共享配置即可,例如:
@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;
}
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S9iad5E8-1622904728384)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images22904498951.png)]](https://code84.com/wp-content/uploads/2022/10/2021060617121126.png)
访问链接
http://localhost:8080/config/config/doGetPageSize
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wm8tvo3V-1622904728385)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images22904586964.png)]](https://code84.com/wp-content/uploads/2022/10/20210606171236177.png)