王富贵

Stay hungry,Stay foolish

若你自认理性且正确,那更应该心平气和,言之有据地与人交流,即使不能立刻说服对方,但也至少埋下了一颗种子,冷嘲热讽或居高临下的态度,总会加大人与人之间的隔阂,最终只是在自己的小圈子中制造回声。愿我们最终都能成为乐观且包容的人,愿意耐心听取他人的苦衷和心声。
  menu
69 文章
0 浏览
1 当前访客
ღゝ◡╹)ノ❤️

微服务04.nacos配置中心

1、nacos配置中心

1.1、配置中心简介

nacos配置中心文档

Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos Config,您可以在 Nacos Server 集中管理你 Spring Cloud 应用的外部属性配置

1.1.1、特点

维护性

比如我有多个微服务连接的一个redis,那么多个微服务可以读取我配置中心的一个关于连接redis的配置。这样达到中心化效果。如果原来这个redis我需要更换,那么我只需要修改这一个配置类即可

时效性

修改配置类,所有服务同时生效,并在nacos能够实时更新配置类而不暂停服务

安全性

一些配置有id,账号密码,盐等信息。传统业务中需要在微服务中的配置类里面写,就会暴露在程序员眼中。

1.1.2、与Spring-cloud-config对比

三大优势:

  1. springcloud-config大部分场景是结合git使用的,动态变更还需要依赖Springcloud-Bug消息总线来监听客户端变化
  2. springcloud-config不提供可视化界面
  3. nacos config使用长轮询更新配置,一旦配置有变动,通知provider的过程非常迅速,也就是配置生效很快

16

1.2、使用配置中心

我们可以通过配置中心的命名空间,来隔离生产,线上,测试等等环境

17

同时,我们也可以通过权限控制,控制nacos用户对命名空间,以及配置的读写权限。

注意,我们需要开启nacos的权限校验功能,在nacos的配置类中

18

1.2.1、步骤

1.配置一个config

19

2.引入config依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

我们可能会出现不存在bootstrap这个包的情况,只有依赖了这个包才可以使用bootstrap.yaml文件,建议加上。

3.新建bootstrap.yaml文件

在springcloud中,我们的远程配置文件会采用bootstrap.yaml(properties)的方式加载,在这里面写上我们需要连接的配置中心的配置即可,远程配置中心会进行替换成我们所配置的内容

注意:nacos中配置的data ID与这里配置的项目启动名要一致,这是主配置类的文件名,默认读取项目启动名称

spring:
  application:
    # 项目启动名
    name: com.hy.order-nacos-config-learn

20

# bootstrap配置的是nacos config的信息
spring:
  application:
    # 配置类名称
    name: com.hy.order-nacos-config-learn
  cloud:
    nacos:
      config:
        # 配置类文件扩展名
        file-extension: yaml
        # 命名空间
        namespace: a048578c-ec50-4db1-bfd7-f8f69eb96622
        # 用户名
        username: nacos
        # 密码
        password: LM647688lx
      #nacos config地址
      server-addr: "lmlx66.top:8848"

4.启动测试即可

@SpringBootApplication
@RefreshScope
public class NacosConfigApplication {
    public static void main(String[] args) throws InterruptedException {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(NacosConfigApplication.class, args);
        while (true) {
            String name = applicationContext.getEnvironment().getProperty("name");
            System.out.println(name);
            Thread.sleep(2000);
        }

    }
}

4.动态感知实时刷新config

我们只需要在主类上添加@RefreshScope注解,就可以动态的感知配置类的改变

原理:nacos client每零点五毫秒就会向nacos serve发送一个请求,对比配置类的加密md5信息,如果不对应,则表示配置文件发生了改变,就会向nacos读取相对应的配置文件

当然,@RefreshScope也可以加在bean上面,当配置文件改变的时候,会重新加载此bean

但请注意,使用@Value加载的字段,是不会动态刷新的。

1.2.2、配置文件详解

1.文件扩展名

nacos客户端默认是properties的文件拓展名,如果我们需要使用yaml,就必须在配置中声明是yaml格式

21

2.所有yaml配置

nacos配置

配置项key默认值说明
服务端地址spring.cloud.nacos.config.server-addr
DataId前缀spring.cloud.nacos.config.prefix spring.application.name
Groupspring.cloud.nacos.config.groupDEFAULT_GROUP
dataID后缀及内容文件格式spring.cloud.nacos.config.file-extensionpropertiesdataId的后缀,同时也是配置内容的文件格式,目前只支持 properties
配置内容的编码方式spring.cloud.nacos.config.encodeUTF-8配置的编码
获取配置的超时时间spring.cloud.nacos.config.timeout3000单位为 ms
配置的命名空间spring.cloud.nacos.config.namespace 常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源隔离等。
AccessKeyspring.cloud.nacos.config.access-key
SecretKeyspring.cloud.nacos.config.secret-key
相对路径spring.cloud.nacos.config.context-path 服务端 API 的相对路径
接入点spring.cloud.nacos.config.endpointUTF-8地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址
是否开启监听和自动刷新spring.cloud.nacos.config.refresh-enabledtrue

3.配置隔离

配置隔离是很重要的操作

我们推荐使用namespace来隔离环境,如生产环境,线上环境,测试环境

我们推荐使用group来隔离项目配置,如生产者配置,消费者配置,注册中心配置

我们推荐DataID来隔离工程配置,如注册中心的redis配置,注册中心的mq配置

22

4.拓展DataID配置

我们知道,一个配置可能会多个微服务使用,多个微服务也可以使用多个配置,那么我们就可以拓展DataID配置,使用多个配置一起拼接起来

拓展DataId有两种方式,使用extension-configs和使用shared-configs

4.1.使用extension-configs

示例如下

spring.application.name=opensource-service-provider
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

# config external configuration
# 1、Data Id 在默认的组 DEFAULT_GROUP,不支持配置的动态刷新
spring.cloud.nacos.config.extension-configs[0].data-id=ext-config-common01.properties

# 2、Data Id 不在默认的组,不支持动态刷新
spring.cloud.nacos.config.extension-configs[1].data-id=ext-config-common02.properties
spring.cloud.nacos.config.extension-configs[1].group=GLOBALE_GROUP

# 3、Data Id 既不在默认的组,也支持动态刷新
spring.cloud.nacos.config.extension-configs[2].data-id=ext-config-common03.properties
spring.cloud.nacos.config.extension-configs[2].group=REFRESH_GROUP
spring.cloud.nacos.config.extension-configs[2].refresh=true

可以看到:

  • 通过 spring.cloud.nacos.config.extension-configs[n].data-id 的配置方式来支持多个 Data Id 的配置。
  • 通过 spring.cloud.nacos.config.extension-configs[n].group 的配置方式自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP。
  • 通过 spring.cloud.nacos.config.extension-configs[n].refresh 的配置方式来控制该 Data Id 在配置变更时,是否支持应用中可动态刷新, 感知到最新的配置值。默认是不支持的
Note多个 Data Id 同时配置时,他的优先级关系是spring.cloud.nacos.config.extension-configs[n].data-id 其中 n 的值越大,优先级越高
Notespring.cloud.nacos.config.extension-configs[n].data-id 的值必须带文件扩展名,文件扩展名既可支持 properties,又可以支持 yaml/yml。 此时 spring.cloud.nacos.config.file-extension 的配置对自定义扩展配置的 Data Id 文件扩展名没有影响

通过自定义扩展的 Data Id 配置,既可以解决多个应用间配置共享的问题,又可以支持一个应用有多个配置文件

4.2.使用shared-configs

为了更加清晰的在多个应用间配置共享的 Data Id ,你可以通过以下的方式来配置:

# 配置支持共享的 Data Id
spring.cloud.nacos.config.shared-configs[0].data-id=common.yaml

# 配置 Data Id 所在分组,缺省默认 DEFAULT_GROUP
spring.cloud.nacos.config.shared-configs[0].group=GROUP_APP1

# 配置Data Id 在配置变更时,是否动态刷新,缺省默认 false
spring.cloud.nacos.config.shared-configs[0].refresh=true

可以看到:

  • 通过 spring.cloud.nacos.config.shared-configs[n].data-id 来支持多个共享 Data Id 的配置
  • 通过 spring.cloud.nacos.config.shared-configs[n].group 来配置自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP
  • 通过 spring.cloud.nacos.config.shared-configs[n].refresh 来控制该Data Id在配置变更时,是否支持应用中动态刷新,默认false
4.3.两个配置的区别

实际上,shared-configs和extension-config使用方式,包括共享都是一模一样的,只有优先级不同

而我们shared-configs其实是为了明确的告诉配置者,这么一个config是共享的,实际上extension也可以共享

优先级:shared < extension < 通过id自动生成的主配置类


标题:微服务04.nacos配置中心
作者:1938857445
地址:https://www.lmlx66.top/articles/2022/02/21/1645433878424.html