springboot2整合nacos云服务,配置基本类型和json类型

2023-09-15 13:32:23


最近公司要搭建一个配置中心,由于不想自己运维,便选择了云服务,定的是阿里云的nacos服务,即 ​​​​​​​https://mse.console.aliyun.com/。

这里记录一下在springboot 2项目中,使用云nacos来做一些基本配置String、int等,和配置json数据映射到java对象中。

1 云nacos操作说明

在控制台创建一个实例,这个实例就是一个nacos的服务端。

在创建时,需要注意公网ip的问题,如果没有公网ip,就只能在阿里云服务器上才能访问,本地测试的话访问不了。

如图,基本信息里有公网、内网连接地址、端口信息。因为本篇是在本地使用云nacos,所以我在创建nacos时选择了外网地址。红框里需要注意配置白名单,不在白名单里的ip无法访问云nacos。本机的话,就在百度搜索ip,查看自己的外网ip,配进去如11.11.11.11/32即可。

当然配白名单麻烦,建议采用accessKey的方式访问配置中心,也就是把公网白名单删掉,把权限验证打开。然后用access-key和secret-key来访问nacos。

之后就可以创建配置了。

这里我没有创建命名空间,就默认是public的命名空间。

创建配置时,Group里填写名字,建议一个模块、一个应用用同一个Group,代表一个组。

Data ID的范围比Group要小,代表一个类型、一个对象,譬如我把系统里所有的开关都放到一个Data Id里,里面配很多个开关。譬如我可以把一个大对象,有多个属性,也作为一个Data ID。

将来监听变化,自动拉取最新配置信息的最小单元就是Data ID。

如图配置格式选择TEXT,就是最简单的类型,配置内容里就可以是a=1,b=2这种。这里面的每一行都是一个最小的配置项,将来代码里用的就是最小的配置项。

2 java接入云nacos

nacos提供了支持java、springboot的pom依赖,我们先来看看普通的java接入方式。

依赖的pom就不贴了,直接看使用的代码。

import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException;

import java.util.Properties;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author weifengwu
 * @create 2023/9/4 15:48
 */
public class NacosTest {
    public static void main(String[] args) {
        try {
            ExecutorService executorService = Executors.newFixedThreadPool(5);
            //改成自己的配置外网地址
            String serverAddr = "mse-xxxxxxx-p.nacos-ans.mse.aliyuncs.com:8848";
            Properties properties = new Properties();
            properties.put("serverAddr", serverAddr);
            //所有对于配置项的操作都是靠ConfigService完成的
            ConfigService configService = NacosFactory.createConfigService(properties);

            //读取该dataId的内容。注意,每次调用getConfig都会发起一次网络请求
            String content = configService.getConfig( "switch", "llmCenter", 5000);
            System.out.println(content);

            //读取一个配置项,该配置项是个json字符串,
            //  "app-pc-lu": {
            //        "userAudit": 1,
            //        "aiAudit": 14,
            //        "modelList": [
            //            "modelA",
            //            "modelB",
            //            "modelC"
            //        ]
            //    }
            String jsonAppFlowInfo = configService.getConfig("jsonAppFlowInfo", "llmCenter", 1000);
            //给这个Data ID添加一个监听器,当DataId数据发生变化时,会调用该回调方法。用户可以接收到新值后保存到内存里。
            configService.addListener("jsonAppFlowInfo", "llmCenter", new Listener() {
                @Override
                public Executor getExecutor() {
                    return executorService;
                }

                @Override
                public void receiveConfigInfo(String s) {
                    System.err.println(Thread.currentThread().getName());
                    System.out.println(s);
                }
            });
            System.out.println(jsonAppFlowInfo);

            try {
                Thread.sleep(100000000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }

            //新增一个配置,如果已存在该DataId,则会覆盖
//            boolean isPublishOk = false;
//            try {
//                isPublishOk = configService.publishConfig("second", "llmCenter", "content=1");
//            } catch (NacosException e) {
//                throw new RuntimeException(e);
//            }
//            System.out.println(isPublishOk);

        } catch (NacosException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

以上代码展示了获取配置、新增/修改配置,监听配置的功能。

需要注意的是configService.getConfig读取配置信息时,每次都会发起一个网络请求,并不是从本地内存读取的,这一点和我的认知中的配置中心不太一样,如果说的不对,可以指正,因为我从nacos的后台看到确实在不断的请求。

3 springboot接入云nacos

如果使用的是springboot,nacos提供了一些自动化监听的功能,当服务端配置的值发生变更时,不需要客户端做处理,即可自动读取到新的配置内容。

@RestController
@NacosPropertySource(groupId = "llmCenter", dataId = "switch", autoRefreshed = true)
@NacosPropertySource(groupId = "llmCenter", dataId = "textInfo", autoRefreshed = true)
public class TestController {
    @Autowired
    private ConvMessageService convMessageService;

    @NacosValue(value = "${useLocalCache:false}",autoRefreshed = true)
    private boolean useLocalCache;

    @NacosValue(value = "${one:1}",autoRefreshed = true)
    private String one;

    @NacosValue(value = "${model.name.app-pc-luca.userAudit:2}",autoRefreshed = true)
    private String userAudit;

    /**
     * 这种写法不支持,将无法映射
     */
    @NacosValue(value = "${model.name.app-pc-luca.modelList:2}",autoRefreshed = true)
    private List<String> modelList;

    @RequestMapping(value = "/get", method = GET)
    public boolean get() {
        System.out.println("useLocalCache-" + useLocalCache);
        System.out.println("one-" + one);
        System.out.println("userAudit-" + userAudit);
        System.out.println("modelList-" + modelList);

        return true;
    }
}

其中NacosPropertySource注解加在一个被spring托管的类上即可,里面注明了dataId和groupId,代表这个dataId的配置值发生变化时会自动推送到被@NacosValue标注的属性上。

其中@NacosValue里只需要写最终配置的属性名即可,不需要再指定dataId,也就是对应下图的每一行里的key。

@NacosValue(value = "${useLocalCache:false}",autoRefreshed = true)这个里面useLocalCache:false代表如果配置中心里没找到useLocalCache这个key,就用false作为默认值。

application.yml配置如下:

nacos:
  config:
    server-addr: mse-80a0d732-p.nacos-ans.mse.aliyuncs.com:8848
    access-key: xx
    secret-key: xxx
    autoRefresh: true
    data-ids: switch,hello,textInfo
    group: llmCenter
    bootstrap:
      enable: true

其中需要注意的点是,yml里面要写data-ids,这里面写的data-ids是等同于在java类上加的@NacosPropertySource(groupId = "llmCenter", dataId = "switch", autoRefreshed = true)。二者功能相同。

如果你在yml里配置了data-ids,那么类上的可以不用写。个人建议是都写在yml文件里即可。

4 对于json类型的

本身并不支持将一个json格式的文本,直接映射到一个java对象上。但如果你的配置中心里,确实是需要配一个json,那么建议用一个data-id来存放,里面放个json字符串。要使用时,自己解析即可。

见第二段java接入云nacos里的代码,通过下面的方式,获取到json字符串,并监听这个data-id字符串。

正确做法应该是,在项目启动时,就拉取配置,并将结果保存到系统内存中,使用时从内存中获取。当监听到变化时,也更新内存中的json对象。不要每次都用configService.getConfig获取。

//读取一个配置项,该配置项是个json字符串,
            //  "app-pc-lu": {
            //        "userAudit": 1,
            //        "aiAudit": 14,
            //        "modelList": [
            //            "modelA",
            //            "modelB",
            //            "modelC"
            //        ]
            //    }
            String jsonAppFlowInfo = configService.getConfig("jsonAppFlowInfo", "llmCenter", 1000);
            //给这个Data ID添加一个监听器,当DataId数据发生变化时,会调用该回调方法。用户可以接收到新值后保存到内存里。
            configService.addListener("jsonAppFlowInfo", "llmCenter", new Listener() {
                @Override
                public Executor getExecutor() {
                    return executorService;
                }

                @Override
                public void receiveConfigInfo(String s) {
                    System.err.println(Thread.currentThread().getName());
                    System.out.println(s);
                }
            });
            System.out.println(jsonAppFlowInfo);

更多推荐

集简云票税通,高效、管理销项发票,满足多样化开票需求

随着数字化时代的到来,传统的纸质发票已经逐渐被电子发票所替代。然而,对于许多企业来说,管理和开具大量的销项发票仍然是一项繁琐的任务:票税处理成本高,手工开票效率低。部分企业手工开票量大,耗费大量财务精力。企业对账难,涉税数据分散,财务工作量大业务财务系统之间无法连接,数据传递和回传的及时性和准确性难以把控......为

【汇编】数制与数据编码

【汇编】数制与数据编码文章目录【汇编】数制与数据编码1、计算机中的数制1.1数制介绍1.1.1进制1.1.2进制转换1.2基本数学运算1.2.1原反补码1.2.2加法&减法溢出&进位补码运算1.3其他数据编码1、计算机中的数制1.1数制介绍1.1.1进制不同进制是用于表示数字的不同数制系统,它们在数学、计算机科学和工程

分享一个基于微信小程序的高校图书馆预约座位小程序 图书馆占座小程序源码 lw 调试

💕💕作者:计算机源码社💕💕个人简介:本人七年开发经验,擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等,大家有这一块的问题可以一起交流!💕💕学习资料、程序开发、技术解答、文档报告💕💕JavaWeb项目💕💕微信小程序项目💕💕Python项目💕💕Android项目文章目录

c++模板初阶

文章目录前言一、泛型编程1、泛型编程2、函数模板2.1函数模板的使用2.2函数模板的实例化2.3模板参数的匹配原则3、类模板前言一、泛型编程1、泛型编程在学习了前面的c++重载之后,我们写一个Swap函数用来交换不同类型的数据时,可以使用函数重载,然后让每个Swap函数的形参不同。voidSwap(int&x,int&

通过 DevOps、CI/CD 和容器增强您的软件开发之旅...

软件行业已经在DevOps、CI/CD和容器中找到了针对开发导向问题的有效解决方案。尽管并不强制要求将这三者一起使用,但它们通常是相互补充和依赖的。DevOps促进开发和IT团队之间的协作,而CI/CD简化软件交付流程以更快地获得结果。容器化将应用程序与其依赖项结合起来,以建立一致的开发和部署环境。实施这些方法可以优化

nginx反向代理 负载均衡

1.反向代理介绍:反向代理:reverseproxy,指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的一种方式,这是用的比较多的一种方式。Nginx除了可以在企业提供高性能的web服务之外,另外还可以将nginx本身不具备的请求通过某种预定义的协议转发至其它服务器处理,不同的协议就是Nginx服务器与

基于Hadoop的网上购物行为分析设计与实现

有需要本项目的可以私信博主,提供部署和讲解服务!!!!!本研究基于淘宝用户行为的开源数据展开大数据分析研究,通过Hadoop大数据分析平台对阿里天池公开的开源数据集进行多维度的用户行为分析,为电商销售提供可行性决策。本次研究选取了2021年12月1日-18号的数据,其中每一行数据集包含用户的每一次的行为。首先我们将数据

HarmonyOS开发:解决DevEco Studio低版本导入高版本项目运行失败问题

前言基于DevEcoStudio4.0Beta2,hvigorVersion为3.0.2,开发了一个项目,上传到了远程仓库,当同事下载后,却始终无法运行,频繁报错,由于API都是使用的9,第一感觉就是开发环境不同,于是,让其发来了他的开发环境,DevEcoStudio3.1.1Release,hvigorVersion

java版工程管理系统Spring Cloud+Spring Boot+Mybatis实现工程管理系统源码

工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理工程项目各模块及其功能点清单一、系统管理1、数据字典:实现对数据字典标签的增删改查操作2、编码管理:实现对系统编码的增删改查操作3、用户管理:管理和查看用户角

MYSQL04高级_逻辑架构剖析、查询缓存、解析器、优化器、执行器、存储引擎

文章目录①.逻辑架构剖析②.服务层-查询缓存③.服务层-解析器④.服务层-优化器⑤.服务层-执行器⑥.MySQL8执行原理①.逻辑架构剖析①.服务器处理客户端请求②.连接层系统(客户端)访问MySQL服务器前,做的第一件事就是建立TCP连接经过三次握手建立连接成功后,MySQL服务器对TCP传输过来的账号密码做身份认证

Windows/Linux(命令、安装包和源码安装)平台各个版本QT详细安装教程

前言本文章主要介绍了Windows/Linux平台下,QT4,QT5,QT6的安装步骤。为什么要把QT版本分开介绍呢,因为这三个版本,安装步骤都不一样。Windows平台,QT4的QtCreator,QT库和编译器是分开的,需要分别单独下载安装。QT5将QtCreator,QT库和编译器都集成到了一起,只需要下载安装包

热文推荐