1、nacos下载安装
nacos安装比较简单,可直接从github中下载release发布包,https://github.com/alibaba/nacos/releases,window下载zip包,linux下载tar包即可,启动nacos需要先安装好jdk环境
- 1.1、单机版
- 安装包解压后,打开目录nacos/conf,可以找到nacos-mysql.sql建表脚本
修改配置文件application.properties,取消注释db连接配置项,配置好对应的数据库连接
db.num=1
db.url.0=
db.user.0=
db.password.0=
启动单机版nacos
./startup.sh -m standalone
打开管理后台页面
http://192.168.80.20:8848/nacos
默认用户名密码为nacos/nacos
- 1.2、集群版
集群版nacos需要在单机版的基础上增加配置cluster.conf,例如如下配置
192.168.80.130:8848
192.168.80.131:8848
192.168.80.132:8848
配置完成后,三台机器均startup.sh启动即可
nacos服务启动比较简单,可以看到功能菜单有配置管理、服务管理、集群管理等相关功能;
2、spring-boot中使用nacos作为配置中心
当前nacos-config-spring-boot-starter的最新版本0.2.10,可以跟踪到其对应的spring-boot版本为2.0.3.RELEASE,为了减少包的依赖冲突或缺失,直接使用此版本演示nacos作为配置中心;
- 以下两种配置方式均可
配置方式 | 说明 |
方式一 | @EnableNacosConfig,同时需要在配置文件中指定相应的配置项 |
方式二 | @NacosPropertySource,直接在java类中指定配置项 |
方式一
> 1、启动类中增加 @EnableNacosConfig
> 2、applicaion.yaml增加以下配置
nacos:
config:
server-addr: 192.168.80.120:8848
type: yaml
data-id: nacos-config
auto-refresh: true
bootstrap:
enable: true
group: dev
方式二
> 1、启动类中增加 @NacosPropertySource(dataId = "nacos-config",groupId = "dev",autoRefreshed = true,type = ConfigType.YAML)
> 2、applicaion.yaml增加以下配置
nacos:
config:
server-addr: 192.168.80.120:8848
配置完成后在代码中使用@NacosValue(value = "${app.name:default}",autoRefreshed = true)即可完成动态加载nacos配置的参数; 需要注意默认的配置方式为properties,以上两种方式均改成了yaml,参考代码可查看gitee https://gitee.com/viturefree/spring-cloud-nacos-config.git
- 扩展 可以发现参数中使用了@NacosValue能够动态获取到nacos配置中心的值,如果是数据库连接呢?如mysql连接能不能动态更新,不能动态更新的原因是什么?
引入数据库依赖包,此处使用jdbcTemplate模拟数据库查询
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
项目中增加数据连接配置
spring:
datasource:
url: jdbc:mysql://192.168.80.120:3306/test?useSSL=false
username: root
password: 123456
写一个简单语句完成验证,如下
Date result = jdbcTemplate.queryForObject("select now()", Date.class);
当程序正常运行时,尝试修改nacos中配置的数据库连接的密码,发现依然正常访问,说明并没有生效。简单分析一下原因,数据库的连接配置是通过DataSourceProperties类获取,其指定的配置项参数为@ConfigurationProperties(prefix = "spring.datasource"),很直观地就会想到这个配置初始化完就不会再变更了。
默认连接池对应的数据源是HikariDataSource,而jdbcTemplate获取连接方法DataSourceUtils.fetchConnection调用的是HikariDataSource.getConnection,继续查看getConnection方法,关键代码如下
private volatile HikariPool pool;
@Override
public Connection getConnection() throws SQLException
{
...
HikariPool result = pool;
if (result == null) {
...
可以看到是从连接池中获取的连接,因此为了实现这个动态变更参数的效果(只演示变更密码),可以简单模拟一下将pool置为空,再次调用方法getConnection时会使用新的配置重新初始化HikariPool,此时将应用到变更后的密码,代码如下
@Autowired
ApplicationContext context;
@NacosValue(value = "${spring.datasource.password:123456}", autoRefreshed = true)
private String password;
public void test() throws Exception {
...
HikariDataSource dataSource = context.getBean(HikariDataSource.class);
dataSource.setPassword(password);
Field field = dataSource.getClass().getDeclaredField("pool");
Method method = HikariPool.class.getDeclaredMethod("shutdown");
method.setAccessible(true);
field.setAccessible(true);
if (dataSource != null && field.get(dataSource)!=null) {
method.invoke(field.get(dataSource));
field.set(dataSource, null);
}
...
}
可查看代码gitee https://gitee.com/viturefree/spring-cloud-nacos-config.git release分支
3、spring-cloud使用nacos作为注册中心
此部分包含两个模块,服务端和客户端。通常情况下,微服务即是客户端又是服务端,既需要调用其他微服务同时又对外提供服务。
服务依赖的配置
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>0.9.0.RELEASE</version>
<exclusions>
<exclusion>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.0.3</version>
</dependency>
- 服务端配置
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.80.120:8848
ip: 192.168.80.120
同时启动类增加@EnableDiscoveryClient注解
- 客户端配置
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.80.120:8848
register-enabled: false
同样需要在启动类增加@EnableDiscoveryClient注解,并定义RestTemplate Bean
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
其中register-enabled: false表示不将此服务注册到nacos注册中心。
代码示例gitee https://gitee.com/viturefree/spring-cloud-nacos-discovery.git
本文暂时没有评论,来添加一个吧(●'◡'●)