spring-cloud-2020.0.4使用nacos2.0.3作为注册中心案例
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


赞赏(Donation)
微信(Wechat Pay)

donation-wechatpay