springboot集成nacos配置中心踩坑记录

2023-10-30

目录

1.下载安装

准备:

下载地址:可以尝试选择最新版本

解压 :

2.添加数据库配置

 特别注意:

3.登陆nacos添加配置

4.springboot项目中获取配置中心配置

1.引入依赖

2.创建bootstrap.yaml配置文件

 3.启动注解

 4.测试配置

5.踩坑记录

6.springboot中读取nacos自定义配置参数

1.引入依赖

2.在 application.yml 中,添加 Nacos 配置

3.读取nacos配置

4.编写Nacos配置文件

5.测试

7.配置自动刷新

1.引入依赖

2.更改配置

3.测试自动刷新

8.读取多个配置文件

9.Nacos监听

10.配置加密


1.下载安装

准备:

JDK:1.8+

MySQL:5.7+

nacos:1.4.2

下载地址:可以尝试选择最新版本

github:Releases · alibaba/nacos · GitHub

官网:Nacos 快速开始

解压 :

tar -zxvf  /usr/local/nacos-server-2.0.3.tar.gz -C target_dir

说明:

target_dir:文件解压的目标目录(我的习惯一般是放在 /usr/local/nacos)

2.添加数据库配置

 特别注意:

配置完之后要在数据库执行 conf/nacos-mysql.sql文件,我就是在这里踩的坑,由于没有执行这个文件,启动时候一直报下面这个错误

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'asyncNotifyService': Unsatisfied dependency expressed through field 'dumpService'; nested excepti
on is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'externalDumpService': Invocation of init method failed; nested exception is ErrCode:500, ErrMsg:Nacos Server di
d not start because dumpservice bean construction failure :
No DataSource set

更改配置和执行数据库脚本之后就可以正常启动了

启动nacos: sh bin/startup.sh 

3.登陆nacos添加配置

http://ip:prot/nacos

ip: ip地址

prot: 端口号

示例:http://127.0.0.1:8848/nacos

用户名:nacos

密码:nacos

4.springboot项目中获取配置中心配置

1.引入依赖

         <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>nacos-config-spring-boot-starter</artifactId>
            <version>0.2.7</version>
        </dependency>

这里需要注意的是springboot的版本,虽然说官方推荐2.x对应nacos 0.2.x ,但是

使用nacos必须是2.4.x 以下版本(不包括2.4.x) 否则报错
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <!--  使用nacos必须是2.4.x 以下版本(不包括2.4.x) 否则报错      -->
        <version>2.3.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

2.创建bootstrap.yaml配置文件

这个用于我们下一步要讲的data id(用来识别作为哪个服务的配置中心),先讲一下data id,他的规则是${prefix}-${spring.profile.active}.${file-extension}
这个是什么意思呢
比如一般${spring.profile.active}都是空
我配置文件中配置了file-extension与prefix,那我的data id 就是
provider-one.properties
如果${spring.profile.active}为dev,那data id就是
provider-one-dev.properties,讲解完了之后,我们进入Nacos配置

 3.启动注解

@NacosPropertySource(dataId = "delivery",autoRefreshed = true)

 4.测试配置

 这样就可以正常访问到nacos的配置参数了

5.踩坑记录

启动时候一直提示错误,在网上查找了很多方法,后来发现是要加上这个参数搞定,说明是在单机不是集群启动

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.alibaba.nacos.core.cluster.ServerMemberManager]: Constructor threw exception; nested exception is ErrCode:500, ErrMsg:jmenv.tbsite.net
        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:187)
        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:117)
        at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:300)
        ... 112 common frames omitted
Caused by: com.alibaba.nacos.api.exception.NacosException: java.net.UnknownHostException: jmenv.tbsite.net
        at com.alibaba.nacos.core.cluster.lookup.AddressServerMemberLookup.run(AddressServerMemberLookup.java:150)
        at com.alibaba.nacos.core.cluster.lookup.AddressServerMemberLookup.doStart(AddressServerMemberLookup.java:98)
        at com.alibaba.nacos.core.cluster.AbstractMemberLookup.start(AbstractMemberLookup.java:53)
        at com.alibaba.nacos.core.cluster.ServerMemberManager.initAndStartLookup(ServerMemberManager.java:181)
        at com.alibaba.nacos.core.cluster.ServerMemberManager.init(ServerMemberManager.java:161)
        at com.alibaba.nacos.core.cluster.ServerMemberManager.<init>(ServerMemberManager.java:142)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:175)
        ... 114 common frames omitted
Caused by: java.net.UnknownHostException: jmenv.tbsite.net
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
        at java.net.Socket.connect(Socket.java:607)
        at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
        at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
        at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
        at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
        at sun.net.www.http.HttpClient.New(HttpClient.java:339)
        at sun.net.www.http.HttpClient.New(HttpClient.java:357)
        at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1223)
        at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
        at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
        at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
        at com.alibaba.nacos.common.http.client.request.JdkHttpClientRequest.execute(JdkHttpClientRequest.java:114)
        at com.alibaba.nacos.common.http.client.NacosRestTemplate.execute(NacosRestTemplate.java:482)
        at com.alibaba.nacos.common.http.client.NacosRestTemplate.get(NacosRestTemplate.java:72)
        at com.alibaba.nacos.core.cluster.lookup.AddressServerMemberLookup.syncFromAddressUrl(AddressServerMemberLookup.java:173)
        at com.alibaba.nacos.core.cluster.lookup.AddressServerMemberLookup.run(AddressServerMemberLookup.java:141)
        ... 124 common frames omitted

解决方法:添加  -m standalone 参数

sh bin/startup.sh -m standalone

虽然上面的方法可以正确读取到nacos中的配置文件,但是自定义的参数是读取不到了,如何读取自定义的配置在此时成了一个新问题。

6.springboot中读取nacos自定义配置参数

1.引入依赖

        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>nacos-config-spring-boot-starter</artifactId>
            <version>0.2.4</version>
        </dependency>

2.在 application.yml 中,添加 Nacos 配置

nacos:
  # Nacos 配置中心的配置项,对应 NacosConfigProperties 配置类
  config:
    server-addr: 127.0.0.1:18848 # Nacos 服务器地址
    bootstrap:
      enable: true # 是否开启 Nacos 配置预加载功能。默认为 false。
      log-enable: true # 是否开启 Nacos 支持日志级别的加载时机。默认为 false。
    data-id: hhmt-cpa-ocpx.yaml # 使用的 Nacos 配置集的 dataId。
    type: yaml # 使用的 Nacos 配置集的配置格式。默认为 PROPERTIES。
    group: ocpx # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP。
    namespace: 0e1ff256-8d17-4e94-a4dd-d81c06e9b56c # 使用的 Nacos 的命名空间,默认为 null。

3.读取nacos配置

方式一:

package com.hhmt.delivery.test;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * 辉煌明天
 * FileName: Ocpx
 * Author:   huachun
 * email: huachun_w@163.com
 * Date:     2021/12/28 15:51
 * Description:
 */
@Component
@ConfigurationProperties(prefix = "ocpx")
@Data
public class Ocpx {

    private String domain;
    private Media media;
    private Customer customer;
}
@Component
    public class OrderPropertiesCommandLineRunner implements CommandLineRunner {

        private final Logger logger = LoggerFactory.getLogger(getClass());

        @Autowired
        private Ocpx ocpx;

        @Override
        public void run(String... args) {
            logger.info("getDomain:" + ocpx.getDomain());
            logger.info("getMedia:" + ocpx.getMedia());
            logger.info("getCustomer:" + ocpx.getCustomer());
        }

    }

方式二:

@Component
    public class ValueCommandLineRunner implements CommandLineRunner {

        private final Logger logger = LoggerFactory.getLogger(getClass());

        @NacosValue(value = "${ocpx.domain}")
        private String domain;

        @NacosValue(value = "${ocpx.media.headlin}")
        private Integer media;

        @NacosValue(value = "${ocpx.customer.koala}")
        private Integer customer;

        @Override
        public void run(String... args) {
            logger.info("domain:" + domain);
            logger.info("media:" + media);
            logger.info("customer:" + customer);
        }
    }

4.编写Nacos配置文件

 

5.测试

由于这两个方法都放在启动类中,所以可以直接启动服务就可以看到配置信息

为了测试可以在业务代码中使用。编写一个测试类

package com.hhmt.delivery.test;

import com.alibaba.nacos.api.config.annotation.NacosValue;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 辉煌明天
 * FileName: TestNacosController
 * Author:   huachun
 * email: huachun_w@163.com
 * Date:     2021/12/28 16:06
 * Description:
 */
@RestController
@RequestMapping(value = "/test-nacos")
public class TestNacosController {

    @NacosValue("${ocpx.domain}")
    private String domain;

    @NacosValue("${ocpx.media.headlin}")
    private String headline;

    @NacosValue("${ocpx.customer.koala}")
    private String koala;


    @GetMapping(value = "/params")
    public String getParams() {
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append("domain:").append(domain).append(",headline:").append(headline).append(",koala:").append(koala);

        return stringBuffer.toString();
    }

}

同样是可以正常调用

 至此,springboot集成nacos已经完成

7.配置自动刷新

经过上面的配置已经可以实现从nacos读取配置文件,但是更改配置文件的时候需要重启服务才能读取到最新的配置。这样显然会比较麻烦,如果每次更改了配置都要重启服务也不太优雅,但是不用担心,nacos显然已经考虑到这个问题,于是就有了自动刷新功能。

1.引入依赖

依赖保持和上面一样

2.更改配置

在nacos配置中添加这个auto-refresh: true代表开启全局自动刷新功能,当然如果只是这样还是不能够自动刷新的,还需要 @NacosConfigurationProperties 或 @NacosValue 注解,也需要设置 autoRefreshed 属性为 true 时,对应的配置项才会自动刷新。

3.测试自动刷新

编写一个测试类

package com.hhmt.delivery.test;

import com.alibaba.nacos.api.config.annotation.NacosValue;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 辉煌明天
 * FileName: TestNacosController
 * Author:   huachun
 * email: huachun_w@163.com
 * Date:     2021/12/28 17:20
 * Description:
 */

@RestController
@RequestMapping(value = "/test-nacos")
//@NacosConfigurationProperties(dataId = "${nacos.config.data-id}", type = ConfigType.YAML, autoRefreshed = true)
public class TestNacosController {

    @NacosValue(value = "${ocpx.auto-refresh}", autoRefreshed = true)
    private String autoRefresh;

    @GetMapping(value = "/refresh")
    public String autoRefresh() {
        return autoRefresh;
    }

}

postman访问接口测试

 

 更改配置文件

此时访问接口以刷新配置

此时已经实现了配置的自动刷新,但是问题也接踵而来。

在使用加密时候引入了下面的包,导致了自动刷新失效

        <dependency>
            <groupId>com.github.ulisesbocchio</groupId>
            <artifactId>jasypt-spring-boot-starter</artifactId>
            <version>3.0.2</version>
            <scope>test</scope>
        </dependency>
加上这个就可以正常使用了
<scope>test</scope>

8.读取多个配置文件

有时候一个配置文件放太多不同类的参数显得比较混乱,比如放了很多请求的参数,还有一些redis的配置,对于有强迫症的人总是想要把两类配置分开存放。

我将alpha环境的文件分成了三个,分别是ocpx服务配置,rta服务配置和其他的服务配置

 在代码中稍作改变就可以使用不同的配置文件了,多个文件用逗号分开

在具体类中使用指定dataId和groupId 

 此时启动服务,因为是放在定时任务里,所以可以直接看到输出的参数信息

 大家还有什么更好的方法吗?欢迎在评论去给我留言...

9.Nacos监听

10.配置加密

原文可参考:

Spring Boot 配置中心 Nacos 入门_weixin_42073629的博客-CSDN博客_nacosconfigurationproperties注解

11.读取数据库原有配置

11.1 从数据库恢复nacos配置

说明:原有的云主机上面搭建了nacos,但是由于主机收到了攻击不得不重装系统,重新部署nacos环境,但是新的登陆nacos发现原有的配置没有了,这样显然很麻烦,查阅了资料才知道少了下面这个配置

指定数据库平台很重要

spring.datasource.platform=mysql

 更改此配置重启服务,再次登陆nacos服务原有的配置已经读入进来

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springboot集成nacos配置中心踩坑记录 的相关文章

随机推荐

  • 华为云云耀云服务器L实例评测|轻松购买 快速使用 上云如此简单【详细版】

    华为云云耀云服务器L实例评测 轻松购买 快速使用 上云如此简单 详细版 轻量级云服务器 即开即用 轻松运维 开启简单上云第一步 文章目录 华为云云耀云服务器L实例评测 轻松购买 快速使用 上云如此简单 详细版 1 云耀云服务器介绍 2 购买
  • Stable Diffusion 硬核生存指南:WebUI 中的 GFPGAN

    本篇文章聊聊 Stable Diffusion WebUI 中的核心组件 强壮的人脸图像面部画面修复模型 GFPGAN 相关的事情 写在前面 本篇文章的主角是开源项目 TencentARC GFPGAN 和上一篇文章 Stable Diff
  • scrollview中使用recyclerview莫名自动上滑

    1 scrollview中加入 android descendantFocusability blocksDescendants 2 为scrollView中的根view加入android focusableInTouchMode true
  • USB详解

    转载自http blog 163 com zhsh email blog static 19786900200611259521640 usb作为一种串行接口 应用日益广泛 如同每个工程设计人员必须掌握I2C RS232这些接口一样 我们也
  • int最大值是多少

    int最大值 根据编译器类型不同而变化 具体如下 1 对于16位编译器 int占16位 2字节 int的最大值为32767 2 对于32位和64位编译器 int占32位 4字节 int的最大值为2147483647 java语言中 int最
  • SQL语句中case、when、then的使用

    使用语法为 select pro id AS id pro title AS title pro name AS name pro ltime AS ltime pro place AS place pro linkman AS linkm
  • 【100天精通Python】Day58:Python 数据分析_Pandas时间序列数据处理,创建和解析时间数据pd.to_datetime(),.loc[],resample() 用法示例

    目录 时间序列数据处理 1 解析日期和时间数据 2 创建时间索引 3 访问时间索引数据 3 1 按年 月 日等级别访问数据 loc 3 2 使用部分日期作为索引 loc loc 3 3 使用时间索引的属性 index 4 时间索引的切片 5
  • 51单片机入门教程(2)——实现流水灯

    51单片机入门教程 2 实现流水灯 一 搭建流水灯电路 二 流水灯程序 2 1 延时程序 2 2 延时函数 2 3 按字节寻址 2 4 逻辑移位 2 5 条件判断 一 搭建流水灯电路 在Proteus中搭建流水灯电路如图 二 流水灯程序 我
  • 为什么我这么累?

    本月十六日 我和媳妇喜爱的歌手姚贝娜去世了 你是个好歌手 真正的热爱音乐 希望你在天堂里面开心的唱歌 我是个参加工作不久的小程序员 过着家 地铁 公司三点一线的生活 每天早上七点二十出门 地铁上一个多小时 8点五十到公司 下午六点下班 一个
  • 【FreeRTOS 信号量】互斥信号量

    互斥信号量与二值信号量类似 但是互斥信号量可以解决二值信号量出现的优先级翻转问题 解决办法就是优先级继承 普通互斥信号量创建及运行 参阅安富莱电子demo 互斥信号量句柄 static SemaphoreHandle t xMutex NU
  • 卷积神经网络中卷积层、池化层、全连接层的作用

    1 卷积层的作用 卷积层的作用是提取输入图片中的信息 这些信息被称为图像特征 这些特征是由图像中的每个像素通过组合或者独立的方式所体现 比如图片的纹理特征 颜色特征 比如下面这张图片 蓝色框框住的地方就是脸部特征 这些特征其实是由一个个像素
  • 消息鉴别码的原理与应用

    消息鉴别码可以确认自己收到的消息是否就是发送者的本意 也就是说 使用消息鉴别码可以判断消息是否被篡改 以及是否有人伪装成发送者发送该消息 消息鉴别码实现鉴别的原理是 用公开函数和密钥产生一个固定长度的值作为认证标识 用这个标识鉴别消息的完整
  • uml活动图

    活动图与交互图的区别 交互图强调的是对象到对象的控制流 而活动图则强调的是从活动到活动的控制流 初始节点和活动终点 用一个实心圆表示初始节点 用一个圆圈内加一个实心圆来表示活动终点 活动节点 是活动图中最主要的元素之一 它用来表示一个活动
  • 基于CNN的人脸表情识别系统

    基于CNN的人脸表情识别系统 主要功能 1 图片识别 可以通过上传本地图片 进行表情识别 2 拍照识别 点击拍照识别按钮 可以调用摄像头实现拍照 并进 行表情识别 实现原理 1 表情库的建立 fer2013人脸数据集 可以从kaggle网站
  • 上/下采样的方法

    下采样方式一般使用池化 pooling 操作 上采样 upsampling 的三种方式 插值法 Interpolation 插值就是在周围像素色彩的基础上用数学公式计算补充插入像素点的色彩 但必须注意的是插值并不能增加图像信息 如双线性插值
  • 数字电子技术-逻辑门电路

    文章目录 一 理想开关 二 基本CMOS逻辑门电路 2 1 MOS管开关特性 2 2 CMOS反相器 2 3 常用CMOS逻辑门电路 2 4 CMOS传输门 2 5 CMOS漏极开路门和三态输出门电路 2 6 CMOS逻辑门电路的重要参数
  • 写一个GitHub图床

    刚刚完成一个作业 涉及到图片的上传服务 因为自己经常会有一些图片管理的需求 七牛云 阿里云的oos存储又是付费的 所以自己根据GitHub的官方API搭建一个自己的图床服务 以便后续自己开发使用 参考地址 GitHubAPI import
  • GoLang - colly爬虫框架

    大家好 我是TheWeiJun 很高兴又和大家见面了 国庆假期马上就要结束了 在国庆假期里小编看了下colly框架 故这篇文章中将提到colly的使用及分析 欢迎各位读者多多阅读与交流 特别声明 本公众号文章只作为学术研究 不作为其它不法用
  • 实践安装minio

    一 下载安装文件 1 在home目录下创建minio文件夹 mkdir home minio 2 进入 home minio 文件夹 cd home minio 3 下载文件 此处下载比较慢 建议手动下载 然后上传到目录中 wget htt
  • springboot集成nacos配置中心踩坑记录

    目录 1 下载安装 准备 下载地址 可以尝试选择最新版本 解压 2 添加数据库配置 特别注意 3 登陆nacos添加配置 4 springboot项目中获取配置中心配置 1 引入依赖 2 创建bootstrap yaml配置文件 3 启动注