SpringCloudAlibaba之Nacos Config

1、服务配置中心介绍

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

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

配置中心的思路是:

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

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

在业界常见的服务配置中心,有这几种:

  1. Apollo

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

  2. Disconf

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

  3. SpringCloud Config

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

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

2、Nacos Config入门

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

在商品微服务中1引入依赖

XML 复制代码
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

在微服务中添加nacos config的配置

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

配置文件优先级(由高到低):bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml

先注释掉原来的yml配置文件,仅仅留下独有的配置,比如说端口、服务名这些。

java 复制代码
spring:
  application:
    name: product-service
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848 #nacos中心地址
        file-extension: yaml # 配置文件格式
  profiles: 
  	active: dev # 环境标识

在nacos中添加配置,然后把订单微服务application.yml配置复制到配置内容中

释本地的application.yam中的内容, 启动程序进行测试

3、Nacos Config配置动态刷新

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

在nacos中的order-service-dev.yaml配置项中这段配置(一定是在远程的配置文件上,不是本地)

java 复制代码
config:
	appName: order # 没啥含义,仅仅为了测试动态刷新,当改参数的时候,看看是否可以动态刷新

在order微服务中新增NacosConfigControlller

java 复制代码
@RestController
@RefreshScope // 实现动态刷新的注解
public class NacosConfigController {
    @Value("${appConfig.name}")
    private String appConfigName;
    @RequestMapping("/nacosConfig1")
    public String nacosConfig(){
        return "远程信息:"+appConfigName;
    }
}

4、Nacos Config配置共享

当配置越来越多的时候,我们就发现有很多配置是重复的,这个时候,我们就需要考虑将公共的1配置文件提取出来,然后实现配置文件共享,谁需要直接导入即可。

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

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

新建一个order-service.yaml的配置文件

这个配置文件用于存放公共的配置文件。

java 复制代码
server:
  port: 8080
  tomcat:
    threads:
      max: 10 #tomcat的最大并发值修改为10,
spring:
  zipkin:
    base-url: http://127.0.0.1:9411/ #zipkin server的请求地址
    discoveryClientEnabled: false #让nacos把它当成一个URL,而不要当做服务名
    sleuth:
      sampler:
        probability: 1.0 #采样的百分比
  application:
    name: order-service
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql:///shop-product?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
    username: root
    password: 1101121833
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    sentinel:
      transport:
        port: 9999 #跟控制台交流的端口,随意指定一个未使用的端口即可
        dashboard: localhost:8080 # 指定控制台服务的地址
      web-context-unify: false
  jpa:
    properties:
      hibernate:
        hbm2ddl:
          auto: update
        dialect: org.hibernate.dialect.MySQL5InnoDBDialect
product-service: # 调用的提供者的名称
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
feign:
  client:
    config:
      default:
        connectTimeout: 3000
        readTimeout: 3000

新建一个order-service-test.yaml的配置文件

这个配置文件用于存放测试环境的配置。

java 复制代码
appConfig:
  name: order-service
env: dev
server:
    application:
        name: order-service
spring:
  application:
    name: order-service # 服务的名字
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848 #nacos中心地址
        file-extension: yaml # 配置文件格式

在Controller中新增测试方法

4.2、不同微服务中间共享配置

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

在nacos中定义一个global-config.yaml的配置文件

这个配置文件用于存储所有微服务都共享的配置。为了测试方便就写一个属性。

globalConfig: global
修改bootstrap.yaml

java 复制代码
spring:
  application:
    name: order-service # 服务的名字
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848 #nacos中心地址
        file-extension: yaml # 配置文件格式
        shared-configs:
          - data-id: global-config.yaml # 配置要引入的配置
            refresh: true
  profiles:
    active: test # 环境标识

修改1Controller的侧式方法

java 复制代码
@RestController
@RefreshScope
public class NacosConfigController {
    @Value("${appConfig.name}")
    private String appConfigName;
    @Value("${env}")
    private String env;
    @Value("${globalConfig}")
    private String globalConfig;
    @RequestMapping("/nacosConfig1")
    public String nacosConfig(){
        return "远程信息:"+appConfigName;
    }
    @RequestMapping("/nacosConfig2")
    public String nacosConfig2(){
        return "公共配置:"+appConfigName+",环境配置信息:"+env;
    }
    @RequestMapping("/nacosConfig3")
    public String nacosConfig3(){
        return "全局配置:"+globalConfig+",公共配置:"+appConfigName+",环境配置信息:"+env;
    }
}

测试

11.5、nacos的几个概念

  1. 命名空间(Namespace)

    命名空间可用于进行不同环境的配置隔离。一般一个环境划分到一个命名空间。

  2. 配置分组(Group)

    配置分组用于将不同的服务可以归类到同一分组。一般将一个项目的配置分到一组。

  3. 配置集(Data ID)

    在系统中,一个配置文件通常就是一个配置集。一般微服务的配置就是一个配置集。

相关推荐
DantyWei15 分钟前
controller注册及调用时机
后端
edwarddamon31 分钟前
Spring Cloud 配置热更新与 Bean 代理机制梳理
java·后端
码事漫谈1 小时前
我用 Seed Evolving 做了个 AI 小说写作工具
后端
evans在进步2 小时前
Spring AI 从入门到实战:用 Java 实现大模型对话与 Tool Calling
java·人工智能·spring
evans在进步2 小时前
LeetCode 189 轮转数组:三次反转原地解决,图解 Java 实现
java·算法·leetcode
DantyWei2 小时前
kube-controller-manager的leader选举流程和策略
后端
妙码生花2 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(五十四):管理员个人资料页面、管理员日志优化
前端·后端·go
我命由我123453 小时前
Jetpack Compose - MaterialExpressiveTheme 与 MaterialTheme、ColorScheme
android·java·开发语言·java-ee·kotlin·android jetpack·android runtime
大卫陈3 小时前
PCB 拼版系统近期迭代复盘:大小拼跃迁、横直料重构与引擎打磨
后端·架构