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

目录

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服务原有的配置已经读入进来

 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值