栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

微服务架构 | 2.2 Alibaba Nacos 的统一配置管理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

微服务架构 | 2.2 Alibaba Nacos 的统一配置管理

2.2 Alibaba Nacos 的统一配置管理

前言1. Nacos 配置中心基础知识

1.1 Nacos 在配置中心中的功能1.2 Nacos 配置管理 Data ID 的构成1.3 Nacos 配置的回滚机制1.4 Nacos 配置的图形化管理界面1.5 Namespace、Group、Data ID 三者的关系1.6 Nacos 对配置的 CRUD1.7 Nacos 动态监听的长轮询机制1.8 Nacos 配置中心的源码分析 2. Nacos 基础配置

2.1 下载 Nacos 服务器2.2 引入 pom.xml 依赖文件2.3 修改 yml 配置文件2.4 在主程序类上添加注解2.5 编写业务类2.6 在 Nacos 服务器中添加配置信息2.7 报错无法装配 bean 3. Nacos 加载配置的三种方案

3.1 Data ID 方案3.2 Group 方案3.3 Namespace 方案 最后


前言

参考资料:
《Spring Microservices in Action》
《Spring Cloud Alibaba 微服务原理与实战》
《B站 尚硅谷 SpringCloud 框架开发教程 周阳》
《Nacos 官网》

Nacos 致力于解决微服务中的统一配置、服务注册与发现等问题。它提供了一组简单易用的特性集,帮助开发者快速实现动态服务发现、服务配置、服务元数据及流量管理;


1. Nacos 配置中心基础知识 1.1 Nacos 在配置中心中的功能

CRUD、版本管理、灰度管理、监听管理、推送轨迹、聚合数据等功能; 1.2 Nacos 配置管理 Data ID 的构成

${prefix}-${spring.profiles.active}.${file-extension};默认为:${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension};

prefix:默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix 来配置;spring.profiles.active:即为当前环境对应的 profile。当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension};file-exetension:为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型;

1.3 Nacos 配置的回滚机制

Nacos 会记录配置文件的历史版本默认保留 30 天,此外还有一键回滚功能,回滚操作将会触发配置更新;

1.4 Nacos 配置的图形化管理界面

配置管理;

命名空间;

1.5 Namespace、Group、Data ID 三者的关系

类似 Java 里面的 package 名和类名,最外层的 Namespace 是可以用于区分部署环境的,Group 和 Data ID 逻辑上区分两个目标对象;

默认情况下,Namespace=public,Group=DEFAULT_GROUP,Cluster=DEFAULT;

Namespace 命名空间:主要用来实现隔离,用于解决多环境及多租户数据的隔离问题。比如有三个环境:开发、测试、生产环境,可以创建三个Namespace,不同的Namespace 之间是隔离的;Group 分组:可以把不同的微服务划分到同一个分组里面去,用来实现 Data ID 分组管理的机制;Data ID:通常用于组织划分系统的配置集;Cluster 簇:对指定微服务的一个虚拟划分;Instance 实例:微服务的实例;

官方的建议是,通过 Namespace 来区分不同的环境,而 Group 可以专注在业务层面的数据分组;

1.6 Nacos 对配置的 CRUD

主要通过提供 Open API 接口或 SDK 实现;客户端通过 Open API 或调用 SDK 接口发送请求给服务器,服务器解析请求,并做相应的处理;

对配置的操作SDKOpen API说明
发布配置public boolean publishConfig(String dataId, String group, String content) throws NacosExceptionPOST: /nacos/v1/cs/configs将配置保存到 Nacos Config Server 中
删除配置public boolean removeConfig(String dataId, String group)throws NacosExceptionDELETE: /nacos/v1/cs/configs删除配置中心的指定配置
获取配置public string getConfig(String dataId, String group, long timeoutMs) throws NacosExceptionGET: /nacos/v1/cs/configs从 Nacos Config Server 中读取配置
监听配置public void addListener(String dataId, String group, Listener listener)POST: /nacos/v1/cs/configs/listener订阅感兴趣的配置,当配置发生变化时可以收到一个事件
1.7 Nacos 动态监听的长轮询机制

一般来说,动态监听有两种机制:

比较项Pull 机制Push 机制
说明客户端从服务端主动拉取数据服务端主动把数据推送到客户端
缺点不能保证数据实时性;在服务端配置长时间不更新的情况下,客户端的定时任务会做一些无效的 Pull如果客户端的数量比较多,服务端需要耗费大量的内存资源来保存每个连接;需要心跳机制来维持每个连接状态

Nacos 的解决方案:长轮询机制:

如果客户端发起 Pull 请求,服务端收到请求之后,先检查配置是否发生了变更:

变更:返回变更配置;无变更:设置一个定时任务,延期 29.5s 执行,把当前的客户端长轮询连接加入 allSubs 队列; 在这 29.5s 内的配置变化:

配置无变化:等待 29.5s 后触发自动检查机制,返回配置;配置变化:在 29.5s 内任意一个时刻配置变化,会触发一个事件机制,监听到该事件的任务会遍历 allSubs 队列,找到发生变更的配置项对应的 ClientLongPolling 任务,将变更的数据通过该任务中的连接进行返回。相当于完成了一次 PUSH 操作; 长轮询机制结合了 Pull 机制和 Push 机制的优点;源码分析详情请见:微服务架构 | *2.5 Nacos 长轮询定时机制的源码分析; 1.8 Nacos 配置中心的源码分析

由于篇幅有限,该内容放在以下两篇文章:

点击跳转:微服务架构 | *2.3 Spring Cloud 启动及加载配置文件源码分析(以 Nacos 为例)点击跳转:微服务架构 | *2.4 Nacos 获取配置与事件订阅机制的源码分析点击跳转:微服务架构 | *2.5 Nacos 长轮询定时机制的源码分析
2. Nacos 基础配置

以 Data ID 方案为例,更多方案详情请见本篇第三点《3. Nacos 加载配置的三种方案》;

2.1 下载 Nacos 服务器

详情请见:《微服务架构 | 3.2 Alibaba Nacos 注册中心》的 2. 安装并运行 Nacos 服务器; 2.2 引入 pom.xml 依赖文件


    com.alibaba.cloud
    spring-cloud-starter-alibaba-nacos-config

2.3 修改 yml 配置文件

bootstrap.yml:

# nacos配置
server:
  port: 18082

spring:
  application:
    name: nacos-config-client     #必须,构成 Nacos 配置管理 Data ID 字段的一部分
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848     #Nacos 服务注册中心地址
      config:
        server-addr: localhost:8848     #Nacos 作为配置中心地址
        file-extension: yaml     #指定 yaml 格式的配置
        
        # prefix: hhh     #Data ID 的前缀,如果不指定,就是 nacos-config-client-dev.yaml。指定后,是 hhh-dev.yaml
        # refresh: true      #是否动态刷新
        
        # group: DEFAULT_GROUP     #指定组
        # namespace: PUBLIC     #指定命名空间 ID

application.yml:

spring:
  profiles:
    active: dev # 表示开发环境
2.4 在主程序类上添加注解

@EnableDiscoveryClient:使用其他组件(Nacos、zookeeper、Consul)作为注册中心; 2.5 编写业务类

这里仅编写一个 controller 作为示例:

@RestController
@RefreshScope //使当前类下的配置支持 Nacos 的动态刷新功能
public class ConfigClientController{
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/config/info")
    public String getConfigInfo() {
        return configInfo;
    }
}
2.6 在 Nacos 服务器中添加配置信息

在 Nacos 服务器里新建并添加配置:



启动服务,调用接口:http://localhost:18082/config/info 获取配置信息;

2.7 报错无法装配 bean

注意:如果 .yml 和 Nacos 服务器配置的 Data ID 匹配不上,将导致 ConfigClientController 类里的 ${config.info} 找不到,最终报 ConfigClientController 无法装配的错误,如下:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scopedTarget.configClientController': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'config.info' in value "${config.info}"
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:380) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1411) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:592) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$1(AbstractBeanFactory.java:356) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
	at org.springframework.cloud.context.scope.GenericScope$BeanLifecycleWrapper.getBean(GenericScope.java:389) ~[spring-cloud-context-2.1.2.RELEASE.jar:2.1.2.RELEASE]
	at org.springframework.cloud.context.scope.GenericScope.get(GenericScope.java:186) ~[spring-cloud-context-2.1.2.RELEASE.jar:2.1.2.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:353) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1105) ~[spring-context-5.1.8.RELEASE.jar:5.1.8.RELEASE]
	at org.springframework.cloud.context.scope.refresh.RefreshScope.eagerlyInitialize(RefreshScope.java:134) ~[spring-cloud-context-2.1.2.RELEASE.jar:2.1.2.RELEASE]
	at org.springframework.cloud.context.scope.refresh.RefreshScope.start(RefreshScope.java:125) ~[spring-cloud-context-2.1.2.RELEASE.jar:2.1.2.RELEASE]
	at org.springframework.cloud.context.scope.refresh.RefreshScope.onApplicationEvent(RefreshScope.java:119) ~[spring-cloud-context-2.1.2.RELEASE.jar:2.1.2.RELEASE]
	at org.springframework.cloud.context.scope.refresh.RefreshScope.onApplicationEvent(RefreshScope.java:73) ~[spring-cloud-context-2.1.2.RELEASE.jar:2.1.2.RELEASE]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172) ~[spring-context-5.1.8.RELEASE.jar:5.1.8.RELEASE]
	......

3. Nacos 加载配置的三种方案

以下对 bootstrap.yml 的修改都可以在启动时配置 JVM 环境替代,使用如下命令:-Dspring.profiles.active=${profile} 3.1 Data ID 方案

新建三个 Data ID 的环境:

指定 spring.profile.active 中的配置,重启服务,可以看到配置已经切换成其他环境了:

spring:
  profiles:
    active: prod

3.2 Group 方案

新建三个 Group 的环境:

指定 spring.profile.active 和 spring.cloud.nacos.config.group 中的配置,重启服务,可以看到配置已经切换成其他环境了:application.yml:

spring:
  profiles:
    active: info #修改

bootstrap.yml:

server:
  port: 18082
spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 
      config:
        server-addr: localhost:8848
        file-extension: yaml
        group: PROD_GROUP #新增

3.3 Namespace 方案

新建两个 Namespace 的环境:


克隆 / 新建几份配置文件到新的命名空间,然后编辑修改;

指定 spring.profile.active 和 spring.cloud.nacos.config.group 中的配置,重启服务,可以看到配置已经切换成其他环境了:application.yml:

spring:
  profiles:
    active: dev #修改

bootstrap.yml:

server:
  port: 18082
spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 
      config:
        server-addr: localhost:8848
        file-extension: yaml
        group: DEFAULT_GROUP #新增
        namespace: 48b2da7d-0b26-4c15-907b-9a379db8f7de #新增,命名空间的 ID,在新建命名空间时会给出



最后
新人制作,如有错误,欢迎指出,感激不尽!
欢迎关注公众号,会分享一些更日常的东西!
如需转载,请标注出处!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/711928.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号