Bootstrap

【第11章】Spring Cloud之Nacos自定义配置


前言

自定义配置主要包含两个方面,一个是通用配置,另一个是扩展配置。


一、通用配置

前面我们已经有了提供者和消费者两个服务,这里两个服务先共同使用同一个数据库,我们把它定义到公共配置中。

1. 数据库初始化

create database cloud;
CREATE USER 'cloud'@'%' IDENTIFIED BY 'cloud';
GRANT ALL PRIVILEGES ON cloud.* TO 'cloud'@'%';
FLUSH PRIVILEGES;

2. 公共配置文件

之前的SpringBoot专栏有写,请查看这里,主要介绍下有区别的地方。

base-common.yaml
在这里插入图片描述

3. 使用通用配置

server:
  port: 9000
spring:
  application:
    name: provider-service
  cloud:
    nacos:
      config:
        file-extension: yaml
        server-addr: ${NACOS_SERVER_ADDR}
        namespace: ${NACOS_NAMESPACE}
        username: ${NACOS_USERNAME}
        password: ${NACOS_PASSWORD}
        shared-configs[0]:
            # 配置支持共享的 Data Id
            data-id: base-common.yaml
              # 配置 Data Id 所在分组,缺省默认 DEFAULT_GROUP
            group: DEFAULT_GROUP
              # 配置Data Id 在配置变更时,是否动态刷新,缺省默认 false
            refresh: true

4. 测试

4.1 测试类

package org.example.nacos.provider.controller;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * Create by zjg on 2024/7/20
 */
@RestController
public class TestController {
    @Autowired
    private DruidDataSource dataSource;
    @GetMapping(value = "/getDatabase")
    public String getDatabase() throws SQLException {
        Connection conn = dataSource.getConnection();
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT DATABASE()"); // MySQL 示例
        String dbName = null;
        if (rs.next()) {
            dbName = rs.getString(1);
            System.out.println("Database Name: " + dbName);
        }
        rs.close();
        stmt.close();
        return dbName;
    }
}

4.2 测试结果

在这里插入图片描述

二、扩展配置

运行了一段时间之后,数据库资源开始逐渐紧张,消费者项目组就不乐意了,我什么身份,他什么地位,和我用同一个数据库,必须给我单独开一个,这里我们就用扩展配置单独给消费者配置一套数据源连接信息。

1. 数据库初始化

create database consumer;
CREATE USER 'consumer'@'%' IDENTIFIED BY 'consumer';
GRANT ALL PRIVILEGES ON consumer.* TO 'consumer'@'%';
FLUSH PRIVILEGES;

2.扩展配置文件

ext-consumer.yaml
在这里插入图片描述

3. 使用扩展配置

server:
  port: 9003
spring:
  application:
    name: consumer-service
  cloud:
    nacos:
      config:
        file-extension: yaml
        server-addr: ${NACOS_SERVER_ADDR}
        namespace: ${NACOS_NAMESPACE}
        username: ${NACOS_USERNAME}
        password: ${NACOS_PASSWORD}
        extension-configs[0]:
          # 配置支持共享的 Data Id
          data-id: ext-consumer.yaml
          # 配置 Data Id 所在分组,缺省默认 DEFAULT_GROUP
          group: DEFAULT_GROUP
          # 配置Data Id 在配置变更时,是否动态刷新,缺省默认 false
          refresh: true

4. 输出

4.1 测试类

package org.example.nacos.consumer.controller;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * Create by zjg on 2024/7/20
 */
@RestController
public class TestController {
    @Autowired
    private DruidDataSource dataSource;
    @GetMapping(value = "/getDatabase")
    public String getDatabase() throws SQLException {
        Connection conn = dataSource.getConnection();
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT DATABASE()"); // MySQL 示例
        String dbName = null;
        if (rs.next()) {
            dbName = rs.getString(1);
            System.out.println("Database Name: " + dbName);
        }
        rs.close();
        stmt.close();
        return dbName;
    }
}

4.2 测试结果

在这里插入图片描述


总结

回到顶部
官方文档

这两种用法给我的感觉是差不多,主要是应对不同的使用场景。

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;