目录
2.在 application.yml 中,添加 Nacos 配置
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添加配置
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服务原有的配置已经读入进来