阅读 332

SpringCloudAlibaba配置中心之Nacos应用实践

配置中心之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-images\1622899269607.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-images\1622900042352.png)]

因为内部使用了@RefreshScope注解支持配置动态刷新,所以在nacos中进行更改可以动态的改变配置 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-05Q5gccC-1622904728371)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622900087472.png)] 更改后配置,再次访问发现配置已经改变 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zRWQ8RcM-1622904728373)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622900222224.png)]

Nacos配置管理模型

Nacos 配置管理模型由三部分构成,如图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mLQXpiH2-1622904728375)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622900575360.png)]

其中:

  • Namespace:命名空间,对不同的环境进⾏隔离,⽐如隔离开发环境和⽣产环境。

  • Group:分组,将若⼲个服务或者若⼲个配置集归为⼀组。

  • Service/DataId:某⼀个服务或配置集,一般对应一个配置文件。

Nacos中的命名空间一般用于配置隔离,这种命名空间的定义一般会按照环境(开发,生产等环境)进行设计和实现.我们默认创建的配置都存储到了public命名空间,如图所示: 在这里插入图片描述 创建新的开发环境并定义其配置,然后从开发环境的配置中读取配置信息,该如何实现呢?

第一步:创建新命名空间,如图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nyg3fj5D-1622904728377)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622900937555.png)]命名空间成功创建以后,会在如下列表进行呈现。 命名空间成功创建以后,会在如下列表进行呈现。 在这里插入图片描述 在指定命名空间下添加配置,也可以直接取配置列表中克隆,例如: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X7d2eHBL-1622904728378)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622901253266.png)]克隆成功以后,我们会发现在指定的命名空间中有了我们克隆的配置,如图所示: 克隆成功以后,我们会发现在指定的命名空间中有了我们克隆的配置,如图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LBkyO2nv-1622904728379)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622901723441.png)]

此时我们修改dev1命名空间中Data Id的nacos-config配置,如图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EpJ9lsjh-1622904728380)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622901813672.png)] 修改项目module中的配置文件bootstrap.yml,添加如下配置,关键代码如下:

去namespace中找NamespaceID,添加到配置文件中 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JGHeYRXP-1622904728380)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622901994265.png)]

spring:   cloud:     nacos:       config:         namespace: 5c27fe4a-1141-4836-a14e-cbac77fb2130 复制代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xoi9BrSG-1622904728381)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622902051409.png)] 其中,namespace后面的字符串为命名空间的id,可直接从命名空间列表中进行拷贝,如图所示:

重启服务,继续刷新http://localhost:8080/config/doGetLogLevel地址。检测输出,看看输出的内容是什么,是否为dev命名空间下配置的内容,如图所示:

http://localhost:8080/config/doGetLogLevel 复制代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ijwKMNrY-1622904728381)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622902139790.png)] 我们还可以创建生产环境,依次类推进行设计和实现即可。

分组设计及实现

当我们在指定命名空间下,按环境或服务做好了配置以后,有时还需要基于服务做分组配置,例如,一个服务在不同时间节点(节假日,活动等)切换不同的配置,可以在新建配置时指定分组名称,如图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P0u5nZAH-1622904728382)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622903671504.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-images\1622903764351.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-images\1622903861845.png)]

共享配置设计及读取

当同一个namespace的多个配置文件中都有相同配置时,可以对这些配置进行提取,然后存储到nacos配置中心的一个或多个指定配置文件,哪个微服务需要,就在服务的配置中设置读取即可。例如:

第一步:在nacos中创建一个共享配置文件,例如: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0jVB4P4n-1622904728383)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622904151351.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-images\1622904343791.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-images\1622904498951.png)]

访问链接

http://localhost:8080/config/config/doGetPageSize 复制代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wm8tvo3V-1622904728385)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622904586964.png)]


作者:chensi2113
链接:https://juejin.cn/post/7031188137640460295


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐