springcloud(四)、nacos 配置(springcloud项目从nacos中拉取配置)

参考博客地址:https://www.jianshu.com/p/16ff6d6db0cf

一、nacos的特性

Nacos主要提供以下四大功能:

  1. 服务发现与服务健康检查 Nacos使服务更容易注册,并通过DNS或HTTP接口发现其他服务,Nacos还提供服务的实时健康检查,以防 止向不健康的主机或服务实例发送请求。
  2. 动态配置管理 动态配置服务允许您在所有环境中以集中和动态的方式管理所有服务的配置。Nacos消除了在更新配置时重新 部署应用程序,这使配置的更改更加高效和灵活。
  3. 动态DNS服务 Nacos提供基于DNS 协议的服务发现能力,旨在支持异构语言的服务发现,支持将注册在Nacos上的服务以 域名的方式暴露端点,让三方应用方便的查阅及发现。
  4. 服务和元数据管理 Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周 期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略。

二、nacos配置入门

1、在nacos下添加如下配置

Data ID: nacos‐simple‐demo.yaml
Group : DEFAULT_GROUP
配置格式: YAML
配置内容: common: config1: something

2、获取外部配置

package com.bear;

import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.exception.NacosException;

import java.util.Properties;

/**
 * @author LiuShanshan
 * @version V1.0
 * @Description
 */
public class SimpleDemoMain {
    public static void main(String[] args) throws NacosException {
        //nacos 地址
        String serverAddr = "127.0.0.1:8848";
        //Data Id
        String dataId = "nacos-simple-demo.yaml";
        //Group
        String group = "DEFAULT_GROUP";
        Properties properties = new Properties();
        properties.put("serverAddr",serverAddr);
        ConfigService configService = NacosFactory.createConfigService(properties);
        //获取配置,String dataId, String group, long timeoutMs
        String content = configService.getConfig(dataId, group, 5000);
        System.out.println(content);
    }
}

会获取nacos中配置的值:
common:
config1: something

3、Nacos配置管理基础应用

a、通过Namespace、group、Data ID能够定位到一个配置集。

data id:每个项目下往往有若干个工程,每个配置集(DataId)是一个工程的主配置文件
group:代表某项目,如XX医疗项目、XX电商项目
Namespace:用于环境隔离,代表不同环境,如开发、测试、生产环境。
在这里插入图片描述
获取某配置集的代码: 获取配置集需要指定:
1、nacos服务地址,必须指定
2、namespace,如不指定默认public
3、group,如不指定默认 DEFAULT_GROUP
4、dataId,必须指定

b、创建命名空间

参考博客: https://blog.csdn.net/magi1201/article/details/113099216
指定不同的namespace,dataId,group获取不同环境的配置

注意:如果没有指定namespace,那么就是public

package com.bear;

import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.exception.NacosException;

import java.util.Properties;

/**
 * @author LiuShanshan
 * @version V1.0
 * @Description
 */
public class SimpleDemoMain {
    public static void main(String[] args) throws NacosException {
        //nacos 地址
        String serverAddr = "127.0.0.1:8848";
        String namespace = "8e6f6e3f-4ae9-4528-9769-66e2cc5e712f"; //开发环境
        //Data Id
        String dataId = "dev-test";
        //Group
        String group = "DEFAULT_GROUP1";
        Properties properties = new Properties();
        properties.put("serverAddr",serverAddr);
        properties.put("namespace", namespace);
        ConfigService configService = NacosFactory.createConfigService(properties);
        //获取配置,String dataId, String group, long timeoutMs
        String content = configService.getConfig(dataId, group, 5000);
        System.out.println(content);
    }
}

c、监听查询

Nacos提供配置订阅者即监听者查询能力,同时提供客户端当前配置的MD5校验值,以便帮助用户更好的检查配 置变更是否推送到 Client 端。

package com.bear;

import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException;

import java.util.Properties;
import java.util.concurrent.Executor;

/** nacos监听器
 * @author LiuShanshan
 * @version V1.0
 * @Description
 */
public class SimpleDemo2Listenter {
    public static void main(String[] args) throws NacosException {
        //nacos 地址
        final String serverAddr = "127.0.0.1:8848";
        //Data Id
        String dataId = "nacos-simple-demo.yaml";
        //Group
        String group = "DEFAULT_GROUP";
        Properties properties = new Properties();
        properties.put("serverAddr",serverAddr);
        ConfigService configService = NacosFactory.createConfigService(properties);
        //获取配置,String dataId, String group, long timeoutMs
        String content = configService.getConfig(dataId, group, 5000);
        System.out.println(content);

        // 添加监听器,监听nacos是否有配置变动
        configService.addListener(dataId, group, new Listener() {
            @Override
            public Executor getExecutor() {
                return null;
            }

            @Override
            public void receiveConfigInfo(String configInfo) {
                // 监听器只能使用于public环境
                // nacos配置变动,则此处可响应
                System.out.println("配置变动");
                System.out.println(configInfo);

            }
        });

        // nacos监听器是守护线程,当主线程结束,监听器也会结束
        while (true){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

4、springcloud配置

查看 码云项目中project中 nacos-config项目
注意:想要动态的获取nacon中的配置,加入上下文配置

    // 注入配置文件上下文, 可动态获取nacos中配置数据
    @Autowired
    private ConfigurableApplicationContext applicationContext;
    @RequestMapping("/getConfigs")
    public void getConfigs(){
        String property = applicationContext.getEnvironment().getProperty("common.name");
        String property1 = applicationContext.getEnvironment().getProperty("common.age");
        System.out.println(property);
        System.out.println(property1);
    }

yaml配置:

server:
  port: 8092
spring:
  application:
    name: service2
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8849,127.0.0.1:8848,127.0.0.1:8850    # 配置中心地址
        file-extension: yaml   # 查找文件的后缀
        namespace: 285944e9-e0f0-4c6b-9d68-1cf017924bb0 # 开发环境s
        group: DEFAULT_GROUP    #测试组

注意:如果没有定义dataId,则某认找当前服务名.yaml

5、在springcloud中获取nacos中多个配置

不同namespace下的不同id配置:

server:
  port: 8092
spring:
  application:
    name: service2
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848 # 配置中心地址
        file-extension: yaml
        namespace: 8e6f6e3f-4ae9-4528-9769-66e2cc5e712f # 开发环境
        group: cloud-demo #测试组
        ext-config[0]:  # 获取多个nacos中配置文件的时候,设置的时候下面的group不能相同
          data-id: service2-1.properties
          group: DEFAULT_GROUP
        ext-config[1]:
          data-id: service2demo3.properties
          group: prop
          refresh: true
        ext-config[2]:
          data-id: service2.properties
          group: uat
          refresh: true

相同namespace下的不同id配置:

  application:
    name: service2
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848 # 配置中心地址
        file-extension: yaml
        namespace: 8e6f6e3f-4ae9-4528-9769-66e2cc5e712f # 开发环境
        group: cloud-demo    #测试组
        shared-dataids:   # 相同空间下的不同id文件
          service2.properties,service2-2.properties

6、配置的优先级

A: 通过 spring.cloud.nacos.config.shared-dataids 支持多个共享 Data Id 的配置
B: 通过 spring.cloud.nacos.config.ext-config[n].data-id 的方式支持多个扩展 Data Id 的配置,多个 Data Id 同时配置时,他的优先级关系是 spring.cloud.nacos.config.ext-config[n].data-id 其中 n 的值越 大,优先级越高。
C: 通过内部相关规则(应用名、扩展名 )自动生成相关的 Data Id 配置 当三种方式共同使用时,他们的一个优先级关系是:C > B >A

7、设置外部mysql存储地址

单机模式时nacos默认使用嵌入式数据库实现数据的存储,若想使用外部mysql存储nacos数据,需要进行以下步 骤: 1.安装数据库,版本要求:5.6.5+ ,mysql 8 以下 2.初始化mysql数据库,新建数据库nacos_config,数据库初始化文件:n a c o s h o m e / c o n f / n a c o s − m y s q l . s q l 3. 修 改 {nacoshome}/conf/nacos- mysql.sql 3.修改nacoshome/conf/nacosmysql.sql3.{nacoshome}/conf/application.properties文件,增加支持mysql数据源配置(目前只支持 mysql),添加mysql数据源的url、用户名和密码。

spring.datasource.platform=mysql db.num=1
db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_config?
characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos_devtest db.password=youdontknow

注意:如果nacos是集群模式,那么一定要设置这个外部存储地址

8、集群

3个或3个以上Nacos节点才能构成集群
(1)安装3个以上Nacos 我们可以复制之前已经解压好的nacos文件夹,分别命名为nacos、nacos1、nacos2
(2)配置集群配置文件 在所有nacos目录的conf目录下,有文件 cluster.conf.example ,将其命名为 cluster.conf ,并将每行配置成 ip:port。(请配置3个或3个以上节点) # ip:port 127.0.0.1:8848 127.0.0.1:8849 127.0.0.1:8850 由于是单机演示,需要更改nacos/的conf目录下application.properties中server.port,防止端口冲突。 如果服务器有多个ip也要指定具体的ip地址,如:nacos.inetutils.ip-address=127.0.0.1 例如:server.port=8850 nacos.inetutils.ip‐address=127.0.0.1
(3)集群模式启动 分别执行nacos目录的bin目录下的startup:

startup ‐m cluster
在这里插入图片描述

server:
  port: 8092
spring:
  application:
    name: service2
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8849,127.0.0.1:8848,127.0.0.1:8850    # 配置中心地址
        file-extension: yaml
        namespace: 285944e9-e0f0-4c6b-9d68-1cf017924bb0 # 开发环境s
        group: DEFAULT_GROUP    #测试组
        # 2、相同空间下的不同id文件
#        shared-dataids:   # 相同空间下的不同id文件
#          service2.properties,service2-2.properties

          #1、 获取nacos中多个不同空间中的配置文件的时候,设置的时候下面的group不能相同
#        ext-config[0]:
#          data-id: service2-1.properties
#          group: DEFAULT_GROUP
#        ext-config[1]:
#          data-id: service2demo3.properties
#          group: prop
#          refresh: true
#        ext-config[2]:
#          data-id: service2.properties
#          group: uat
#          refresh: true

注意:当没有写data_id的时候,会默认获取当前服务器 + 后缀名

请求:

    // 注入配置文件上下文, 可动态获取nacos中配置数据
    @Autowired
    private ConfigurableApplicationContext applicationContext;
    @RequestMapping("/getConfig3")
    public void getConfig3(){
        String property1 = applicationContext.getEnvironment().getProperty("common.name");
        System.out.println(property1);
    }

版权声明:本文为M1275601161原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。