5、Nacos配置管理

一、Nacos配置管理

 

1、服务配置中心

(1)微服务配置的问题

应用程序在启动和运行的时候往往需要读取一些配置信息,配置基本上伴随着应用程序的整个生命周期,比如数据库连接参数、启动参数等。

在微服务架构中,当系统从一个单体应用被拆分成分布式系统中的一个个服务节点后,配置文件也必须跟着迁移(分割),这样不仅配置分散了,而且分散中还包含着冗余。

微服务架构下关于配置文件的一些问题:

1、配置文件相对分散。在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散在各个微服务中,不好统一配置和管理。

2、配置文件无法区分环境。微服务项目可能会有多个环境,例如:测试环境、预发布环境、生产环境。每一个环境所使用的配置理论上都是不同的,一旦需要修改,就需要我们去各个微服务下手动维护,这比较困难。

3、配置文件无法实时更新。我们修改了配置文件之后,必须重新启动微服务才能使配置生效,这对一个正在运行的项目来说是非常不友好的。

(2)什么是配置中心

服务配置中心的思路是:

1、先把项目中各种配置都放到一个集中地方进行统一管理,并提供一套标准的接口。

2、当各个服务需要获取配置的时候,就来配置中心的接口拉取自己的配置。

3、当配置中心中的各种参数有更新的时候,也能通知到各个服务实时的过来同步最新的信息,使之动态更新。

当加入了服务配置中心之后,系统架构图会变成下面这样:

下图显示了配置中心的功能,配置中心将配置从各应用中剥离出来,对配置进行统一管理,应用自身不需要自己去管理配置。配置中心的服务流程如下:

1、用户在配置中心更新当前的配置信息。

2、服务A和服务B及时得到配置更新通知,从配置中心获取配置。

总得来说,配置中心就是一种统一管理各种应用配置的基础服务组件。

(3)服务配置中心的优点

总结一下,在传统巨型单体应用纷纷转向细粒度微服务架构的历史进程中,配置中心是微服务化不可缺少的一个系统组件,在这种背景下中心化的配置服务即配置中心应运而生,一个合格的配置中心需要满足如下特性:

1、配置项容易读取和修改

2、分布式环境下应用配置的可管理性,即提供远程管理配置的能力

3、支持对配置的修改的检视以把控风险

4、可以查看配置修改的历史记录

5、不同部署环境下应用配置的隔离性

(4)主流配置中心对比

在业界常见的服务配置中心,有下面这些:

Apollo是由携程开源的分布式配置中心。特点有很多,比如:配置更新之后可以实时生效,支持灰度发布功能,并且能对所有的配置进行版本管理、操作审计等功能,提供开放平台API。并且资料也写的很详细。

Disconf是由百度开源的分布式配置中心。它是基于Zookeeper来实现配置变更后实时通知和生效的。

SpringCloud Config是Spring Cloud中带的配置中心组件。它和Spring是无缝集成,使用起来非常方便,并且它的配置存储支持Git。不过它没有可视化的操作界面,配置的生效也不是实时的,需要重启或去刷新。

Nacos是Sping Cloud Alibaba技术栈中的一个组件,前面我们已经使用它做过服务注册中心。其实它也集成了服务配置的功能,我们可以直接使用它作为服务配置中心。

下面主要对比一下Spring Cloud Config、Apollo和Nacos。

从配置中心角度来看,性能方面Nacos的读写性能最高,Apollo次之,Spring Cloud Config依赖Git场景不适合开放的大规模自动化运维API。功能方面Apollo最为完善,nacos具有Apollo大部分配置管理功能,而Spring Cloud Config不带运维管理界面,需要自行开发。Nacos的一大优势是整合了注册中心、配置中心功能,部署和操作相比Apollo都要直观简单,因此它简化了架构复杂度,并减轻运维及部署工作。

综合来看,Nacos的特点和优势还是比较明显的。

2、Nacos配置管理模型

(1)分布式应用中的配置管理

下图展示了如何通过Nacos集中管理多个服务的配置:

1、用户通过Nacos Server的控制台集中对多个服务的配置进行管理。

2、各服务统一从Nacos Server中获取各自的配置,并监听配置的变化。

(2)Nacos的配置模型

Nacos定义了术语Namespace、Group、Data ID,通过Namespace、group、Data ID能够定位到一个配置集。

这里为大家提供了一种配置模型的用法。

NameSpace:表示不同的应用环境,默认命名空间是public。不同的NameSpace之间是隔离的,比如现在有三个应用环境:开发、测试、生产,就要创建3个NameSpace。

Group:代表某个项目,如XX医疗项目、XX电商项目。可以把不同的微服务划分到同一个分组里面去。默认是DEFAULT_GROUP。

DataId:每个项目下有若干个微服务,每个配置集(DataId)是一个微服务的配置文件。配置集中包含的配置内容就是一个个配置项。它代表一个具体的可配置的参数与值域,通常以key=value的形式存在。例如日志输出级别(logLevel=INFO|WARN|ERROR)是一个配置项。

3、Nacos配置管理

浏览器访问http://ip:8848/nacos,打开nacos控制台。

(1)命名空间管理

命名空间(Namespace)是用于隔离多个环境的(如开发、测试、生产),而每个应用在不同环境的同一个配置(如数据库数据源)的值是不一样的。这里演示创建namespace。

建立好所有namespace后,在配置管理与服务管理模块下所有页面,都会包含用于切换namespace(环境)的tab按钮,如下图:

(2)Nacos配置管理

1、点击Nacos控制台的 配置管理->配置列表,即可看到以下界面展示:

界面中展示了不同namespace下的配置集列表,可以点击左上角的不同namespace进行切换。右上角“+"号或点击某配置集后的编辑按钮可进入配置集编辑器。

2、多配置格式编辑器

Nacos支持YAML、Properties、TEXT、JSON、XML、HTML等常见配置格式在线编辑、语法高亮、格式校验,帮助用户高效编辑的同时大幅降低格式错误带来的风险。

Nacos支持配置标签的能力,帮助用户更好、更灵活的做到基于标签的配置分类及管理。同时支持用户对配置及其变更进行描述,方面多人或者跨团队协作管理配置。

3、在Nacos中添加如下的配置:

Data ID:         nacos-simple-demo.yaml

Group:            DEFAULT_GROUP

配置格式:     YAML

配置内容:     common:

              config1: something

注意:dataid(默认properties作为文件扩展名,这里使用yaml。

4、点击“发布”后,确定成功发布配置。

5、查询已发布的配置。

二、Nacos配置应用

1、在Nacos中发布配置

为了便于演示,这里namespace用默认命名空间public,group用SHOP_GROUP。

(1)创建配置

1、点击“配置管理->配置列表”,在命名空间public中点击右边+号来新建配置。

在新建配置过程中,要注意下面的细节:

(1)Data ID不能随便写,与bootstrap.yml中spring.application.name值相同。

(2)Group要跟bootstrap.yml中配置的Group相对应。

(3)配置格式要跟配置文件的格式对应,目前支持YAML和Properties,这里选择YMAL。

例如:

Namespace: public

Group : SHOP_GROUP

Data ID: shop-product-service.yaml

配置格式: YAML

(2)配置内容

这是微服务shop-product-service中bootstrap.yml的部分内容,还有部分内容需要在bootstrap.yml中配置,包括:

服务端口:server.port

应用名称:spring.application.name

服务注册:spring.cloud.nacos.discovery.server-addr

在Nacos中配置的内容:

spring:

  main:

    allow-bean-definition-overriding: true  # 需要设置

  datasource:

    driver-class-name: com.mysql.cj.jdbc.Driver

    url: jdbc:mysql://localhost:3306/shop-product?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true

    username: root

    password: 123456

    type: com.alibaba.druid.pool.DruidDataSource

    druid:

      min-idle: 10

      max-active: 20

  mvc:

    format:

      # http数据的日期格式

      date: yyyy-MM-dd HH:mm:ss

    # 出现错误时直接抛出异常,交由SpringMVC处理

    throw-exception-if-no-handler-found: true

  web:

    resources:

      # SpringMVC不要为资源建立 /** 的映射配置,否则请求都被处理就没有404

      add-mappings: false

  jackson:

    # 只控制java.util.Date的序列化format

    date-format: yyyy-MM-dd HH:mm:ss

    locale: zh # 当地时区

    time-zone: GMT+8

    default-property-inclusion: NON_NULL   # Google建议属性为NULL则不序列化

  zipkin:

    #zipkin server的请求地址

    base-url: http://192.168.0.106:9411/

    #让nacos把zipkin当成一个URL,不要当做服务名

    discoveryClientEnabled: false

  sleuth:

    sampler:

      #采样的百分比,可以在0.0-1.0之间调整数据

      probability: 1.0

mybatis-plus:

  # 别名配置,多个package用逗号或者分号分隔

  typeAliasesPackage: com.climbcloud.**.entity

  # mapperLocations是mapper文件位置

  mapper-locations: classpath:com/climbcloud/*/mapper/*.xml

  configuration:

    #配置JdbcTypeForNull

    jdbc-type-for-null: 'null'

    # 显示SQL语句

    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

# 健康监控:服务下线后自动删除注册实例

management:

  endpoints:

    web:

      exposure:

        include: "*"

2、微服务shop-product

(1)加入nacos配置依赖

引入nacos配置管理的依赖。

<dependency>

         <groupId>com.alibaba.cloud</groupId>

         <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>

</dependency>

(2)指定Nacos配置中心

在配置文件bootstrap.yml中指定Nacos配置中心的参数。

注意:bootstrap.yml在application.yml之前被加载,保证在应用配置开始之前,从Nacos配置中心里拉取配置参数到应用中。

server:

  port: 57021

# Nacos服务器地址

nacos:

  server:

    addr: 192.168.0.106:8848

spring:

  application:

    name: shop-product-service

  cloud:

    nacos:

      discovery:

        server-addr: ${nacos.server.addr}

      config:

        # nacos配置中心地址

        server-addr: ${nacos.server.addr}

        # 组

        group: SHOP_GROUP

        # 配置文件格式

        file-extension: yaml

注意:

1、spring.cloud.nacos.config.server-addr指定了Nacos Server的网络地址和端口号。

2、没有指定spring.cloud.nacos.config.namespace配置,则默认为public。

3、没有指定spring.cloud.nacos.config.group配置,则默认为DEFAULT_GROUP。

4、没有指定spring.cloud.nacos.config.dataid配置,则默认为${spring.application.name}。

5、file-extension是配置内容的格式,如YAML、Properties、TEXT、JSON、XML、HTML。

这个配置相当于微服务启动时从Nacos加载了namespacegroup中的配置文件“dataid.file-extension”,即${spring.application.name}.${file-extension:properties}。我们将微服务application.yml的配置内容写到这个dataId中,相当于在启动时加载了application.yml,从而达到了在Nacos中统一管理所有微服务配置的目的

(3)测试程序

启动程序进行测试。如果还是可以成功访问程序,说明nacos配置中心功能已经实现。

3、支持配置的动态更新

Nacos配置发生变化时,会自动通知微服务中的nacos配置客户端,然后Nacos客户端需要处理这个通知,让程序支持配置的动态更新。

(1)自定义配置

在Nacos配置项shop-product-service.yaml中添加一个自定义配置项。

config:

  appName: product

(2)动态更新@RefreshScope

在动态读取配置的类上添加@RefreshScope注解,然后用@Value读取配置参数。

@RestController

@RefreshScope

public class NacosConfigController {

         // @Value注入nacos配置中的数据

         @Value("${config.appName}")

         private String appName;

        

         @GetMapping("/nacos-config-test")

         public String nacosConfingTest() {

                   return appName;

         }

}

(3)动态更新ConfigurableApplicationContext

在动态读取配置的类中使用ConfigurableApplicationContext来实现配置的动态更新。

@RestController

public class NacosConfigController1 {

         // 注入配置文件上下文

         @Autowired

         private ConfigurableApplicationContext applicationContext;

         @GetMapping("/nacos-config-test")

         public String nacosConfingTest() {

                   //读取nacos服务器中的配置信息

                   return applicationContext.getEnvironment().getProperty("config.appName");

         }

}

(4)测试

1、启动商品微服务项目并访问/nacos-config-test,可以看到获取的内容是product。

2、现在在Nacos中将config.appName改为develop。

config:

  appName: develop

然后重新访问/nacos-config-test,返回了develop,即配置动态更新了。

三、Nacos配置共享

1、配置层次

微应用配置可以分为三个层次,然后利用优先级来有效管理。

1、整个微服务项目的公共配置

创建一个Group来存储所有公共配置,如COMMON_GROUP。这些配置包括HTTP、Druid、Mybatis-Plus等默认配置。

2、每个微服务的应用配置

创建一个Group来存储各个微服务的特有配置,如SHOP_GROUP。这些配置可以覆盖前面COMMON_GROUP中的默认配置。

3、每个微服务的本地bootstrap.yml

在微服务应用中创建bootstrap.yml。主要是配置应用名称,以及Nacos注册和配置的参数。我们还可以指定某些特定参数的值,这些参数值的优先级是最高的。

2、共享DataId配置

当微服务越来越多时,可能有很多重复配置,这些重复配置可以提取出来实现共享。我们可以为公共配置单独创建一个组(如COMMON_GROUP),然后在微服务中引入公共配置。

(1)公共配置spring-boot-rest.yaml

这是REST应用程序的通用配置。

spring:

  main:

    allow-bean-definition-overriding: true  # 需要设置

  mvc:

    format:

      # http数据的日期格式

      date: yyyy-MM-dd HH:mm:ss

    # 出现错误时直接抛出异常,交由SpringMVC处理

    throw-exception-if-no-handler-found: true

  web:

    resources:

      # SpringMVC不要为资源建立 /** 的映射配置,否则请求都被处理就没有404

      add-mappings: false

  jackson:

    # 只控制java.util.Date的序列化format

    date-format: yyyy-MM-dd HH:mm:ss

    locale: zh # 当地时区

    time-zone: GMT+8

    default-property-inclusion: NON_NULL   # Google建议属性为NULL则不序列化

# 健康监控:服务下线后自动删除注册实例

management:

  endpoints:

    web:

      exposure:

        include: "*"

(2)公共配置spring-boot-db.yaml

这是Druid和Mybatis-Plus的通用配置。

spring:

  datasource:

    type: com.alibaba.druid.pool.DruidDataSource

    druid:

      min-idle: 10

      max-active: 20

mybatis-plus:

  configuration:

    #配置JdbcTypeForNull

    jdbc-type-for-null: 'null'

    # 显示SQL语句

    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

(3)公共配置spring-cloud-sleuth.yaml

spring:

  zipkin:

    #让nacos把zipkin当成一个URL,不要当做服务名

    discoveryClientEnabled: false

  sleuth:

    sampler:

      #采样的百分比,可以在0.0-1.0之间调整数据

      probability: 1.0

3、微服务的特定配置

这里为微服务shop-product-service创建应用配置shop-product-service.yaml,用于覆盖COMMON_GROUP中的配置参数。

注意:这里的配置通常是与应用程序的本地环境相关。

spring:

  datasource:

    driver-class-name: com.mysql.cj.jdbc.Driver

    url: jdbc:mysql://localhost:3306/shop-product?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true

    username: root

    password: 123456

  zipkin:

    #zipkin server的请求地址

    base-url: http://192.168.0.106:9411/

mybatis-plus:

  # 别名配置,多个package用逗号或者分号分隔

  typeAliasesPackage: com.climbcloud.**.entity

  # mapperLocations是mapper文件位置

  mapper-locations: classpath:com/climbcloud/*/mapper/*.xml

3、改造微服务shop-product

(1)加入nacos配置依赖

  <dependencies>

    <!-- Nacos服务发布和配置 -->

    <dependency>

      <groupId>com.alibaba.cloud</groupId>

      <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>

    </dependency>

  </dependencies>

(2)本地bootstrap.yml

这里主要配置服务端口,应用名称(用于服务注册和配置),服务注册和发现,其它配置尽量放在Nacos配置管理中。

使用spring.cloud.nacos.config.shared-configs属性引入多个共享配置,其中data-id是配置名称,group是组名,refresh是刷新标识。

server:

  port: 57021

# Nacos服务器地址

nacos:

  server:

    addr: 192.168.0.106:8848

spring:

  application:

    name: shop-product-service

  cloud:

    nacos:

      discovery:

        server-addr: ${nacos.server.addr}

      config:

        # nacos配置中心地址

        server-addr: ${nacos.server.addr}

        # 组

        group: SHOP_GROUP

        # 配置文件格式

        file-extension: yaml

        # 共享Data Id的配置,每个都有三个属性dataId, group以及refresh

        shared-configs[0]:

          data-id: spring-boot-rest.yaml            # spring boot http配置

          group: COMMON_GROUP               # 通用配置组

          refresh: true                          # 是否动态刷新,默认为false

        shared-configs[1]:

          data-id: spring-boot-db.yaml

          group: COMMON_GROUP

          refresh: true

        shared-configs[2]:

          data-id: spring-cloud-sleuth.yaml

          group: COMMON_GROUP

          refresh: true

(3)测试

访问“http://localhost:57020/products/1”后获得数据,表示Nacos配置起作用了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值