Nacos服务配置中心应用实践
基于Spring Boot的日志输出
添加@Slf4j注解,该注解会生成一个静态的log对象用于调用该对象输出日志
@GetMapping("/provider/echo/{msg}")
public String doRestEcho1(
@PathVariable("msg") String msg) throws InterruptedException {
log.info("doRestEcho1 start{}",System.currentTimeMillis());//{}表示占位符
return serverPort+" say hello "+msg;
}
其中log对象是基于SELF4 API创建,也可以基于注解对象指定类进行描述,来创建日志对象
业务描述
基于nacos配置中心,实现日志级别的动态配置,然后基于日志级别动态调整服务中日志信息的输出
添加依赖
在已有的mu_provider项目中添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
修改配置文件
将项目中的application.yml的名字修改为bootstrap.yml配置文件(该文件启动优先级最高)
spring:
application:
name: mu-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: 127.0.0.1:8848
file-extension: yml # Configure the data format of the content, default to properties
group: DEFAULT_GROUP_MU
#不加该属性会默认读取DEFAULT_GROUP中的配置
新建Nacos匹配值
其中Data ID的值要与bootstrap.yml中定义的spring.application.name的值相]同(服务名-假如有多个服务一般会创建多个配置实例,不同服务对应不同的配置实例)。
发布测试
Nacos 动态刷新机制分析
1.在服务提供方的Controller添加一个方法
@Value("${logging.level.org.mubai:error}")
private String logLevel;
@GetMapping("/provider/doGetLogLevel")
public String doGetLogLevel(){
log.trace("==log.trace==");//跟踪
log.debug("==log.debug==");//调试
log.info("==log.info==");//常规信息
log.warn("==log.warn==");//警告
log.error("==log.error==");//错误信息
return "log level is "+logLevel;
}
2.在类上添加注解
@RefreshScope //加了该注解spring会动态的重新刷新配置中心的数据
@RestController
public class ProviderController{
其中,@RefreshScope的作用是在配置中心的相关配置发生变化以后,能够及时看到类中属性值的更新(底层是通过重新创建Controller对象的方式,对属性进行了重新初始化),Controller编写好以后,启动配置中心服务,然后进行访问测试。,打开浏览器直接在地址栏输入http://localhost:8082/provider/doGetLogLevel,检测输出结果是否为我们配置中配置的信息,如图所示。
修改日志输出的格式和输出的磁盘地址
#日志配置
#logging:
# level:
# com.cy: error
#spring boot日志格式
#logging:
# pattern:
# console: '%-5level %msg %n'
# file: '%d %-5level %thread %logger %msg %n'
# %d 表示日期时间
# %-5level 日志级别
# %thread 线程名‘
# %logger 日志输出方(哪个类中输出的日志)
# %msg 具体的日志信息
# %n 换行
Nacos配置管理模型
- Namespace:命名空间,对不同的环境进⾏隔离,⽐如隔离开发环境和⽣产环境。
- Group:分组,将若⼲个服务或者若⼲个配置集归为⼀组。
- Service/DataId:某⼀个服务或配置集,一般对应一个配置文件。
1.创建新命名空间
在指定命名空间下添加配置,也可以直接克隆配置
修改项目module中的配置文件bootstrap.yml,添加如下配置,关键代码如下:
spring:
cloud:
nacos:
config:
namespace: 4b614b5b-248d-4da9-a442-873aec47b4ba
其中,namespace后面的字符串为命名空间的id,可直接从命名空间列表中进行拷贝.
重启服务,继续刷新http://localhost:8081/config/doGetLogLevel地址。检测输出,看看输出的内容是什么,是否为dev-mu命名空间下配置的内容
分组设计及实现
当我们在指定命名空间下,按环境或服务做好了配置以后,有时还需要基于服务做分组配置,例如,一个服务在不同时间节点(节假日,活动等)切换不同的配置,可以在新建配置时指定分组名称,如图所示:
修改 group ,在controller中添加代码访问
@Value("${server.tomcat.threads.max:200}")
private String MaxThreads;
@RequestMapping("/doGetThread")
public String doGetThread(){
return MaxThreads;
}
共享配置设计及读取
第一步:在nacos中创建一个共享配置文件,例如:
第二步:在指定的微服务配置文件(bootstrap.yml)中设置对共享配置文件的读取,例如:
见红色区域内容。
config:
server-addr: 127.0.0.1:8848
file-extension: yml # Configure the data format of the content, default to properties
namespace: 4b614b5b-248d-4da9-a442-873aec47b4ba
group: DEFAULT_GROUP_51
shared-configs[0]:
data-id: app-public-dev.yml
refresh: true #默认false,共享配置更新,引用此
第三步:在指定的Controller类中读取和应用共享配置即可,例如:
@RefreshScope
@RestController
public class ProviderPageController {
@Value("${page.pageSize:10}")
private Integer pageSize;
@GetMapping("/provider/doGetPageSize")
public String doGetPageSize(){
//return String.format()
return "page size is "+pageSize;
}
}
第四步:启动服务进行访问测试。