SpringBoot 集成 Nacos 配置中心

2022-01-19 15:08:47 浏览数 (1)

参考于:https://nacos.io/zh-cn/docs/quick-start-spring-boot.html

Maven依赖

代码语言:javascript复制
        <!-- SpringBoot 整合Nacos-->
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>nacos-config-spring-boot-starter</artifactId>
            <version>0.2.10</version>
        </dependency>

Demo 1:测试一下能够读取到Nacos上的配置文件

代码语言:javascript复制
import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.exception.NacosException;

import java.util.Properties;


    public static void main(String[] args) throws NacosException {
        // DataID
        String dataId = "Mytest01";
        // Group
        String group = "com.xunliao";
        // Nacos 地址
        String addr = "127.0.0.1:8848";
        
        // 构造获取配置对象方法需要的参数
        Properties properties = new Properties();
        properties.setProperty("serverAddr",addr);
        
        // 获取配置对象
        ConfigService configService = NacosFactory.createConfigService(properties);
        
        // 拿出配置文件数据 第三个参数是超时时间
        String config = configService.getConfig(dataId, group, 5000);
        System.out.println(config);
    }

Nacos 配置管理模型

Namespace :命名空间

Group :配置组。 一般就是父模块名即可。

Data ID :配置集。就是 spring.application.name

可以上述三个元素决定一个配置集

什么是配置集 Data ID 呢?

一个配置文件就是一个配置集,建议设定为模块名! 配置中对应:spring.application.name

什么是配置项呢?

配置集的每一个配置内容就是配置项

什么是配置组 Group?

配置集分组,通常用来定义为 父项目的名称

什么是命名空间 Namespace? 默认命令空间是 public

用于不同环境之间的隔离。通常用来分为 开发环境、测试环境、生产环境!

Demo 2 指定”命名空间“获取配置文件

代码语言:javascript复制
 public static void main(String[] args) throws NacosException {
        // DataID
        String dataId = "Mytest01";
        // Group
        String group = "com.xunliao";
        // Nacos 地址
        String addr = "127.0.0.1:8848";
        // Namespace
        String namespaseid = "e60c3bd8-1350-419a-b572-fe687e77dfd0";

        // 构造获取配置对象方法需要的参数
        Properties properties = new Properties();
        properties.setProperty("serverAddr",addr);
        properties.setProperty("namespace",namespaseid);

        // 获取配置对象
        ConfigService configService = NacosFactory.createConfigService(properties);

        // 拿出配置文件数据 第三个参数是超时时间
        String config = configService.getConfig(dataId, group, 5000);
        System.out.println(config);
    }

结论:对比Demo1、Demo2 就可以得出 不指定命名空间,默认是 public 默认空间

配置文件额外操作

导出(选中一个Data组)

导入(向任何的命名空间导入之前导出的文件)

克隆(等价于导出、导入的操作)

历史版本(误操作,可以快速恢复,我个人建议尽量不要操作回滚,以免误操作)、

监听查询(可以查看当前的服务端)

Demo3 监控Nacos配置文件变更

代码语言:javascript复制
    public static void main(String[] args) throws NacosException {
        // DataID
        String dataId = "Mytest01";
        // Group
        String group = "com.xunliao";
        // Nacos 地址
        String addr = "127.0.0.1:8848";
        // Namespace
        String namespaseid = "e60c3bd8-1350-419a-b572-fe687e77dfd0";

        // 构造获取配置对象方法需要的参数
        Properties properties = new Properties();
        properties.setProperty("serverAddr",addr);
        properties.setProperty("namespace",namespaseid);

        // 获取配置对象
        ConfigService configService = NacosFactory.createConfigService(properties);

        // 拿出配置文件数据 第三个参数是超时时间
        String config = configService.getConfig(dataId, group, 5000);
        // 输出当前获取到的配置文件
        System.out.println(config);

        configService.addListener(dataId, group, new Listener() {
            @Override
            public Executor getExecutor() {
                return null;
            }

            // 当配置有变化的实话,执行此方法
            @Override
            public void receiveConfigInfo(String s) {
                System.out.println("配置文件已变更!变更后的结果是:");
                System.out.println(s);
            }
        });

        // 不让Main方法 主线程停止,进而保证Listener线程 终止导致Listener无法监控数据变化
        while (true){
            try {
                Thread.sleep(8000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

修改Nacos密码、创建用户

Nacos 密码我们之前保存到数据库中,我们进入数据库,更替密码即可。算法是 BCrypt 目前没有在线生成的方式,所以我们有2种方式实现修改Nacos密码。

1、去Nacos控制台网页修改密码 推荐,修改完本账号会里面T下去自己。

2、去使用算法 生成密码,然后更新nacos_config库中users密码,不过不能直接踢下去老帐号。

代码语言:javascript复制
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-core</artifactId>
            <version>5.5.1</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>


    @Test
    public void getBCryiptPassword(){
        String password = new BCryptPasswordEncoder().encode("新密码");
        System.out.println(password);
    }

创建自己的用户,建议去Nacos控制台网页创建用户。

关闭登录验证 ,人人接可登录

代码语言:javascript复制
暂时没实现,当前版本较为复杂,好像新版本受到了限制!

整合Demo:SpringCloud 整合配置中心 获取文件

代码语言:javascript复制
        <!-- 让bootstrap优先加载于applicaiton-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
            <version>3.0.3</version>
        </dependency>

        <!-- Spring Cloud依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2.2.5.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

        <!--Nacos配置中心依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>2021.1</version>
        </dependency>

配置 bootstrap.application

代码语言:javascript复制
# 一共指定了Nacos的命名空间、Data Id、组


server.port=18888

# Nacos的配置  application.name就是Data Id
spring.application.name=parents-config
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# 不加此项就会找默认 public的命名空间,如果需要指定其他命名空间,请填写命名空间的ID
spring.cloud.nacos.config.namespace=9449b8dc-6aed-4fc8-b551-1e0d812caba4
# 不加此项就会找默认 DEFAULT_GROUP的组,如果需要指定其他组,请填写组的名字
spring.cloud.nacos.config.group=xunliao

测试代码

代码语言:javascript复制
/**
 * @author : zanglikun
 * @date : 2021/9/7 15:06
 * @Version: 1.0
 * @Desc : 访问自己的接口,看看是否能够获取到新配置文件的内容。
 */
@Controller
@RequestMapping("/nacos")
//实现配置、实例热加载。
@RefreshScope
public class ConfigController {

    //如果直接使用@Value的话,如果启动的时候配置文件没有键就会找不到导致项目无法启动!如果启动时有,后续删除,也会报错的,但项目不会被终止!
    @Value(value = "${diy.name}")
    private String name;


    @Value(value = "${diy.age}")
    private Integer age;


    @GetMapping(value = "/get")
    @ResponseBody
    public String getInfo() {
        return name   " : "   age;
    }

}

项目写完了,我们去我们的Nacos去写一下配置文件的内容

代码语言:javascript复制
diy.name=张三
diy.age=18

写完之后,我们就可以正常的访问我们的接口,看看是否能够获取真实的文件内容。

整合Demo2:SpringCloud 整合配置中心 注册服务

代码语言:javascript复制
# Nacos服务注册配置 需要去启动类加上 @EnableDiscoveryClient注解即可!
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.cloud.nacos.discovery.namespace=9449b8dc-6aed-4fc8-b551-1e0d812caba4
spring.cloud.nacos.discovery.group=xunliao

启动项目 去 服务管理 – 服务列表 – 你自己的命名空间 就可看到注册中心已经显示刚才启动并注册的服务了。

服务已经注册成功了!

特殊说明: 解决问题的光鲜,藏着磕Bug的痛苦。 万物皆入轮回,谁也躲不掉! 以上文章,均是我实际操作,写出来的笔记资料,不会出现全文盗用别人文章!烦请各位,请勿直接盗用!

0 人点赞