Nacos服务配置中心应用实践

Nacos配置快速入门

业务描述

在sca-provider项目中添加一个Controller对象,例如ProviderLogController,基于此Controller中的方法演示日志级别的配置。

配置准备工作

第一步:创建ProviderLogController对象,例如:

package com.jt.provider.controller;

import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * 基于此controller演示配置中心的作用.
 * 在这个controller中我们会基于日志对象
 * 进行日志输出测试.
 */
//@Slf4j
@RestController
public class ProviderLogController {
    //创建一个日志对象
    //org.slf4j.Logger (Java中的日志API规范,基于这个规范有Log4J,Logback等日志库)
    //org.slf4j.LoggerFactory
    //log对象在哪个类中创建,getLogger方法中的就传入哪个类的字节码对象
    //记住:以后只要Java中使用日志对象,你就采用下面之中方式创建即可.
    //假如在log对象所在的类上使用了@Slf4j注解,log不再需要我们手动创建,lombok会帮我们创建
   private static Logger log=
           LoggerFactory.getLogger(ProviderLogController.class);
    @GetMapping("/provider/log/doLog01")
    public String doLog01(){//trace<debug<info<warn<error
        System.out.println("==doLog01==");
        log.trace("===trace===");
        log.debug("===debug===");
        log.info("===info====");
        log.warn("===warn===");
        log.error("===error===");
        return "log config test";
    }
}

第二步:在已有的sca-provider项目中添加如配置依赖,例如:

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

第三步: 将项目sca-provider的application.yml的名字修改为bootstrap.yml(启动优先级最高),并添加配置中心配置,代码如下:

spring:
  application:
    name: sca-provider
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yml

新建Nacos配置

打开nacos配置中心,新建配置,如图所示:
在这里插入图片描述
其中,Data ID的值要与bootstrap.yml中定义的spring.application.name的值相同(服务名-假如有多个服务一般会创建多个配置实例,不同服务对应不同的配置实例)。配置发布以后,会在配置列表中,显示我们的配置,例如:
在这里插入图片描述

测试Nacos数据读取

配置创建好以后,启动sca-provider服务,然后打开浏览器,输入http://localhost:8081/provider/log/doLog01,检测idea控制台日志输出。然后再打开nacos控制台动态更新日志级别,再访问资源并检测后台日志输出.

@RefreshScope注解的应用

对于nacos配置中心而言,有系统内部对配置变化的感知,还有外部系统对配置的感知,假如我们系统在浏览器中能看到日志级别的变化,该如何实现呢?我们现在来实现一个案例.

第一步:在ProviderLogController类的上面添加一个@RefreshScope注解,例如:

@Slf4j
@RestController
@RefreshScope//配置中心内容变化,要对类中的属性初始化,则使用这个注解
public class ProviderLogController {
    @GetMapping("/provider/log/doLog01")
    public String doLog01() {
        log.trace("==trace==");
        log.debug("==debug==");
        log.info("==info==");
        log.warn("==warn==");
        log.error("==error==");
        return "test log level";
    }

}

其中,@RefreshScope的作用是在配置中心的相关配置发生变化以后,能够及时看到类中属性值的更新(底层是通过重新创建Controller对象的方式,对属性进行了重新初始化)。

第二步:添加ProviderLogController中添加一个获取日志级别(debug<info<warn<error)的的属性和方法,代码如下:

@Value("${logging.level.com.jt:error}")
private String logLevel;
@GetMapping("/provider/log/doLog02")
public String doLog02(){
   log.info("log level is  {}",logLevel);
   return  "log level  is "+logLevel;
}

第三步:启动sca-provider服务,然后打开浏览器并输入http://localhost:8081/provider/log/doLog02进行访问测试。

注意:假如对配置的信息访问不到,请检测项目配置文件的名字是否为bootstrap.yml,检查配置文件中spring.application.name属性的值是否与配置中心的data-id名相同,还有你读取的配置信息缩进以及空格写的格式是否正确.

Nacos配置管理模型

概述
Nacos 配置管理模型由三部分构成,如图所示:
在这里插入图片描述
Namespace:命名空间,对不同的环境进⾏隔离,⽐如隔离开发环境和⽣产环境。
Group:分组,将若⼲个服务或者若⼲个配置集归为⼀组。
Service/DataId:某⼀个服务或配置集,一般对应一个配置文件。

命名空间设计

Nacos中的命名空间一般用于配置隔离,这种命名空间的定义一般会按照环境(开发,生产等环境)进行设计和实现.我们默认创建的配置都存储到了public命名空间,如图所示:
在这里插入图片描述
创建新的开发环境并定义其配置,然后从开发环境的配置中读取配置信息,该如何实现呢?

第一步:创建新命名空间,如图所示:
在这里插入图片描述
命名空间成功创建以后,会在如下列表进行呈现。
在这里插入图片描述
在指定命名空间下添加配置,也可以直接取配置列表中克隆,例如:
在这里插入图片描述
克隆成功以后,我们会发现在指定的命名空间中有了我们克隆的配置
在这里插入图片描述
此时我们修改dev命名空间中Data Id的sca-provider配置
在这里插入图片描述
修改项目module中的配置文件bootstrap.yml,添加如下配置

server:
  port: 8083
spring:
  application:
    name: sca-provider #服务名(假如要进行服务注册一定要一个名字)
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8180
    nacos:
      discovery: #服务注册和发现的配置
        server-addr: localhost:8848  #nacos 服务的地址
      config:  #配置中心的配置
        server-addr: localhost:8848
        file-extension: yml
        namespace: 5aaab085-d8d0-4d6f-976b-593942c6e0f2 #默认为public

其中,namespace后面的字符串为命名空间的id,可直接从命名空间列表中进行拷贝.然后重启服务,继续刷新http://localhost:8081/provider/log/doLog02地址。检测输出,看看输出的内容是什么,是否为dev命名空间下配置的内容。

分组设计及实现

当我们在指定命名空间下,按环境或服务做好了配置以后,有时还需要基于服务做分组配置,例如,一个服务在不同时间节点(节假日,活动等)切换不同的配置,可以在新建配置时指定分组名称,如图所示:
在这里插入图片描述
其中,这里的useLocalCache为自己定义的配置值,表示是否使用本地缓存.

配置发布以后,修改boostrap.yml配置类,在其内部指定我们刚刚创建的分组,代码如下:

server:
  port: 8083
spring:
  application:
    name: sca-provider #服务名(假如要进行服务注册一定要一个名字)
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8180
    nacos:
      discovery: #服务注册和发现的配置
        server-addr: localhost:8848  #nacos 服务的地址
      config:  #配置中心的配置
        server-addr: localhost:8848
        file-extension: yml
        namespace: 5aaab085-d8d0-4d6f-976b-593942c6e0f2 #默认为public
        group: DEFAULT_GROUP_51

在指定的Controller类中添加属性和方法用于获取和输出DEFAULT_GROUP_51中的useLocalCache的值,代码如下:

package com.jt.provider.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RefreshScope
public class ProviderCacheController {
    @Value("${useLocalCache:false}")
    private boolean useLocalCache;

    @GetMapping("/provider/cache01")
    public String doUseLocalCache01(){
        return "useLocalCache's value is   "+useLocalCache;
    }
}

然后重启服务,进行访问测试,检测内容输出。

共享配置设计及读取

当同一个namespace的多个配置文件中都有相同配置时,可以对这些配置进行提取,然后存储到nacos配置中心的一个或多个指定配置文件,哪个微服务需要,就在服务的配置中设置读取即可。例如:

第一步:在nacos中创建一个共享配置文件,例如:
在这里插入图片描述
其中,这里的secret可以理解为一个密钥。

第二步:在指定的微服务配置文件(bootstrap.yml)中设置对共享配置文件的读取,例如:

server:
  port: 8083
spring:
  application:
    name: sca-provider #服务名(假如要进行服务注册一定要一个名字)
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8180
    nacos:
      discovery: #服务注册和发现的配置
        server-addr: localhost:8848  #nacos 服务的地址
      config:  #配置中心的配置
        server-addr: localhost:8848
        file-extension: yml
        namespace: 5aaab085-d8d0-4d6f-976b-593942c6e0f2 #默认为public
        group: DEFAULT_GROUP_51
        shared-configs[0]: #这里的0表示一个下标,将来可以有多个共享配置
          data-id: app-public.yml
          refresh: true #这里的true表示共享配置更新了,引用共享的配置也要更新.

第三步:在指定的Controller类中读取和应用共享配置即可,例如:

package com.jt.provider.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RefreshScope
public class ProviderSecretController {
    @Value("${app.secret:123456}")
    private String secret;

@GetMapping("/provider/secret")
    public String doSecret(){
        return "The Secret is "+secret;
    }
}

第四步:启动服务,然后打开浏览器进行访问测试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小码不掉头发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值