3.服务配置NacosConfig

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 3.服务配置NacosConfig

个人博客地址: https://blog.zjzaki.com/archives/1692275186701

1.服务配置中心介绍


首先我们来看一下,微服务架构下关于配置文件的一些问题:

  1. 配置文件相对分散。在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散在各个微服务中,不好统一配置和管理。
  2. 配置文件无法区分环境。微服务项目可能会有多个环境,例如:测试环境、预发布环境、生产环境。每一个环境所使用的配置理论上都是不同的,一旦需要修改,就需要我们去各个微服务下手动维护,这比较困难。
  3. 配置文件无法实时更新。我们修改了配置文件之后,必须重新启动微服务才能使配置生效,这对一个正在运行的项目来说是非常不友好的。

基于上面这些问题,我们就需要配置中心的加入来解决这些问题。

配置中心的思路是:

  • 首先把项目中各种配置全部都放到一个集中的地方进行统一管理,并提供一套标准的接口。
  • 当各个服务需要获取配置的时候,就来配置中心的接口拉取自己的配置。
  • 当配置中心中的各种参数有更新的时候,也能通知到各个服务实时的过来同步最新的信息,使之动态更新。

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

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

  • Apollo
    Apollo是由携程开源的分布式配置中心。特点有很多,比如:配置更新之后可以实时生效,支持灰度发布功能,并且能对所有的配置进行版本管理、操作审计等功能,提供开放平台API。并且资料也写的很详细。
  • Disconf
    Disconf是由百度开源的分布式配置中心。它是基于Zookeeper来实现配置变更后实时通知和生效的。
  • SpringCloud Config
    这是Spring Cloud中带的配置中心组件。它和Spring是无缝集成,使用起来非常方便,并且它的配置存储支持Git。不过它没有可视化的操作界面,配置的生效也不是实时的,需要重启或去刷新。
  • Nacos
    这是SpingCloud alibaba技术栈中的一个组件,前面我们已经使用它做过服务注册中心。其实它也集成了服务配置的功能,我们可以直接使用它作为服务配置中心。

2.Nacos Config入门


使用nacos作为配置中心,其实就是将nacos当做一个服务端,将各个微服务看成是客户端,我们将各个微服务的配置文件统一存放在nacos上,然后各个微服务从nacos上拉取配置即可。接下来我们以商品微服务为例,学习nacos config的使用。

2.1.启动nacos

启动即可,不用改动

2.2.在shop-common引入依赖

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

2.3.在微服务service-product中添加nacos config的配置

注:

1)不能使用原来的application.yml作为配置文件,而是新建一个bootstrap.yml作为配置文件;

2)在bootstrap和application数据项相同时,bootstrap中的配置不会被覆盖;

配置文件优先级(由高到低)

bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml

spring:
  application:
    name: service-product
  cloud:
    nacos:
      config:
        server-addr: localhost:8848 # nacos的服务端地址
        file-extension: yml # 配置文件格式
  profiles:
    active: dev # 环境标识

说明:之所以需要配置 spring.application.name ,是因为它是构成 Nacos 配置管理 dataId字段的一部分。在 Nacos Spring Cloud 中,dataId 的完整格式如下:

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

配置完成之后,启动微服务shop-product并查看控制台日志信息:

2.4.在nacos中添加配置

点击右下角发布

**PS: **

1)Data ID不能随便写,要跟配置文件中的对应,对应关系如图所示

2)配置文件格式要跟配置文件的格式对应,且目前仅仅支持YAML和Properties

3)配置内容按照上面选定的格式书写

3.Nacos Config深入


3.1.配置动态刷新

在入门案例中,我们实现了配置的远程存放,但是此时如果修改了配置,我们的程序是无法读取到的,因此,我们需要开启配置的动态刷新功能。

在service-product中添加NacosConfigController

package com.zjzaki.shopproduct.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * @Author zjzaki
 * @Package com.zjzaki.shopproduct.controller
 * @Date 2023-08-17 19:48:00
 */
@RestController
@RequestMapping("/nacos-config")
@RefreshScope//只需要在需要动态读取配置的类上添加此注解就可以
public class NacosConfigController {
    @Autowired
    private ConfigurableApplicationContext applicationContext;
    /**
     * 1 硬编码方式
     * @return
     */
    @GetMapping("/test1")
    public String nacosConfingTest1() {
        return applicationContext.getEnvironment().getProperty("config.name");
    }
    @Value("${config.name}")
    private String appName;
    /**
     * 2 注解方式
     * @return
     */
    @GetMapping("/test2")
    public String nacosConfingTest2() {
        return appName;
    }
}

注入配置文件属性:@Value @ConfigurationProperties应的bean的后置处理器为ConfigurationPropertiesBindingPostProcessor,它是实现了BeanPostProcessor接口,在bean被实例化后,会调用后置处理,递归的查找属性,通过反射注入值,属性需提供其setter和getter方法。

测试

1.访问:http://localhost:8081/nacos-config/test1

2.访问:http://localhost:8081/nacos-config/test2

3.2.配置共享

当配置越来越多的时候,我们就发现有很多配置是重复的,这时候就考虑可不可以将公共配置文件提取出来,然后实现共享呢?当然是可以的。接下来我们就来探讨如何实现这一功能。

3.2.1.同一个微服务的不同环境之间共享配置

如果想在同一个微服务的不同环境之间实现配置共享,其实很简单。 只需要提取一个以spring.application.name 命名的配置文件,然后将其所有环境的公共配置放在里面即可。

1.在nacos上新建一个service-product.yml配置存放商品微服务的公共配置

config:
  os: windows

2.在NacosConfigController中添加方法

//3 读取shop-product所有环境共享配置
@Value("${config.os}")
private String os;
@RequestMapping("/test3")
public String nacosConfingTest3() {
    return os;
}

3.访问:http://localhost:8081/nacos-config/test3

4.修改bootstarp.yml中的配置,将active设置成test,重启项目,再次访问

此时需要在nacos上新建一个service-product-test.yml

内容:

config:
    name: product_test

访问:http://localhost:8081/nacos-config/test3

3.3.不同微服务中间共享配置

不同为服务之间实现配置共享的原理类似于文件引入,就是定义一个公共配置,然后在当前配置中引入。

3.3.1.在nacos中定义一个DataID为all-service.yaml的配置,用于所有微服务共享

config:
    mysql: 192.168.1.2:3306

3.3.2.修改bootstrap.yml

spring:
  application:
    name: service-product
  cloud:
    nacos:
      config:
        server-addr: localhost:8848 # nacos的服务端地址
        file-extension: yaml # 配置文件格式
        shared-dataids: all-service.yaml # 配置要引入的配置
        refreshable-dataids: all-service.yaml # 配置要实现动态配置刷新的配置
  profiles:
    active: test # 环境标识

shared-dataids: all-service.yaml和refreshable-dataids: all-service.yaml已过时

可以使用以下取代

extension-configs[0]:
 data-id: all-service.yaml
 group: DEFAULT_GROUP
 refresh: true
shared-configs[0]:
 data-id: all-service.yaml
 group: DEFAULT_GROUP
 refresh: true   

extension-configs的优先级高于shared-configs

最终的配置

spring:
  application:
    name: service-product
  cloud:
    nacos:
      config:
        server-addr: localhost:8848 # nacos的服务端地址
        file-extension: yml # 配置文件格式
        extension-configs[0]:
          data-id: all-service.yml
          group: DEFAULT_GROUP
          refresh: true
        shared-configs[0]:
          data-id: all-service.yml
          group: DEFAULT_GROUP
          refresh: true
  profiles:
    active: test # 环境标识

3.3.3.在NacosConfigController中添加方法

@Value("${config.mysql}")
private String mysql;
@RequestMapping("/test4")
public String nacosConfingTest4() {
    return mysql;
}

3.3.4.启动商品微服务

访问:http://localhost:8081/nacos-config/test4

3.3.5.在shop-order中添加bootstarp.yml

spring:
  application:
    name: service-order
  cloud:
    nacos:
      config:
        server-addr: localhost:8848 # nacos的服务端地址
        file-extension: yml # 配置文件格式
        extension-configs[0]:
          data-id: all-service.yml
          group: DEFAULT_GROUP
          refresh: true
        shared-configs[0]:
          data-id: all-service.yml
          group: DEFAULT_GROUP
          refresh: true
  profiles:
    active: test # 环境标识

3.3.6.controller包下,添加NacosConfigController

package com.zjzaki.shoporder.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * @Author zjzaki
 * @Package com.zjzaki.shoporder.controller
 * @Date 2023-08-17 20:17:37
 */
@RestController
@RequestMapping("/nacos-config")
@RefreshScope//只需要在需要动态读取配置的类上添加此注解就可以
public class NacosConfigController {
    @Value("${config.mysql}")
    private String mysql;
    @RequestMapping("/test4")
    public String nacosConfingTest4() {
        return mysql;
    }
}

3.3.7.启动订单微服务

访问:http://localhost:8091/nacos-config/test4

发现可以正常读取all-service.yml中的配置,证明不同微服务之间共享配置

4.Nacos的几个概念


  • 命名空间(Namespace):命名空间可用于进行不同环境的配置隔离。一般一个环境划分到一个命名空间
  • 配置分组(Group):配置分组用于将不同的服务可以归类到同一分组。一般将一个项目的配置分到一组
  • 配置集(Data ID):在系统中,一个配置文件通常就是一个配置集。一般微服务的配置就是一个配置集

4.1.创建命名空间(Namespace)

命名空间

spring:
  application:
    name: config-test
  cloud:
    nacos:
      config:
        server-addr: localhost:8848 # nacos的服务端地址
        file-extension: yaml # 配置文件格式
#        shared-dataids: all-service.yaml # 配置要引入的配置
#        refreshable-dataids: all-service.yaml # 配置要实现动态配置刷新的配置
        namespace: a4776bdc-6683-4d0f-a971-67553404c618
        extension-configs[0]:
          data-id: all-service.yaml
          group: DEFAULT_GROUP
          refresh: true
  profiles:
    active: dev

spring:
  application:
    name: config-test
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        # 修改服务注册中的命名空间,默认是注册到public
        namespace: a4776bdc-6683-4d0f-a971-67553404c618
        # 修改服力注到nacos上分组分称,默认是DEFAULT_GROUP
        group: shop_ex
      config:
        server-addr: localhost:8848 # nacos的服务端地址
        file-extension: yaml # 配置文件格式
#        shared-dataids: all-service.yaml # 配置要引入的配置
#        refreshable-dataids: all-service.yaml # 配置要实现动态配置刷新的配置
        namespace: a4776bdc-6683-4d0f-a971-67553404c618
#        group: shop_ex
        extension-configs[0]:
          data-id: all-service.yaml
          group: DEFAULT_GROUP
          refresh: true
  profiles:
    active: dev

4.2.Nacos多环境切换

4.3.如何解决不同环境配置不同

4.4.如何解决不同环境配置相同

4.5.不同微服务相同配置共享

5.bootstrap


Spring Cloud 构建于 Spring Boot 之上,在 Spring Boot 中有两种上下文,一种是 bootstrap, 另外一种是 application, bootstrap 是应用程序的父上下文,也就是说 bootstrap 加载优先于 applicaton。bootstrap 主要用于从额外的资源来加载配置信息,还可以在本地外部配置文件中解密属性。这两个上下文共用一个环境,它是任何Spring应用程序的外部属性的来源。bootstrap 里面的属性会优先加载,它们默认也不能被本地相同配置覆盖。

什么配置在application配置?什么配置在bootstrap里面配置?

1、当使用 Spring Cloud Config Server 的时候,spring.application.name 和 spring.cloud.config.server.git.uri应该在 bootstrap.yml 里面指定

2、一些加密解密的配置也应该配置在bootstrap里面

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
11天前
|
缓存 Java 数据库连接
常见配置
常见配置
18 1
|
3月前
wslconfig 配置
wslconfig 配置
62 0
|
6月前
|
Ubuntu 安全 算法
UbuntuSSH配置
UbuntuSSH配置
86 0
|
Shell Linux 程序员
vs2015配置vcpkg
vs2015配置vcpkg
405 0
|
安全 Shell 网络安全
安全配置
一、 密码配置1、 全局明文密码:控制路由器从用户模式登录到特权模式的密码,显示为明文。Router (confi g)#enable password yujieRouter (config)#Router>enablePassword:明文密码加密:输入明文密码后,通过该命令将密码加密。Router (config)#service password-encryptionRouter(config)#2、 全局密文密码:控制路由器从用户模式登录到特权模式的密码,显示为密文。Router(config)#enable secret cntc-edu.comRoute(通过设置可使用用户在本地
安全配置
|
缓存 安全 网络架构
|
Ubuntu Java Linux
|
SQL 存储 关系型数据库