SpringCloud之Nacos配置管理(热共享更新配置集群搭建)

Posted -emo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringCloud之Nacos配置管理(热共享更新配置集群搭建)相关的知识,希望对你有一定的参考价值。

统一配置管理

随着微服务越来越多,如果达到成百上千个服务,如果一个配置文件和数十个服务有关系,需要逐个微服务的配置文件去调——麻烦;

并且调完,每个微服务都需要重启——生产环境下,一个服务的重启带来的影响比较大;

需求:希望配置文件能够实现统一的管理,比如说数十个配置文件的修改,想只需要修改一个就行了,并且这个服务不用重启动——服务热更新

nacos配置管理

Data ID:一般命名为:服务名称-配置环境.yml(必须唯一)

配置的内容一般是需要变化的配置,比如开关按钮、时间格式之类的

 

 

配置获取流程:

项目启动——>(读取nacos配置文件,需要先知道nacos的地址)——>读取本地配置文件application.yml——>创建Spring容器——>加载bean

bootstrap.yml的优先级比application.yml优先级更高,放置nacos地址

步骤:

1:引入Nacos配置管理客户端依赖

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

2:新建一个bootstrap.yml文件,作为引导文件

spring:
application:
name: orderservice #服务名称
profiles:
active: dev #开发环境
cloud:
nacos:
server-addr: localhost:8848 # nacos服务地址
config:
file-extension: yaml #文件名后缀
检验是否成功
@Value("$pattern.dateformat") //读取配置文件
private String dataformat;

@GetMapping("now")
public String now()
    return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dataformat));

 

 这说明,微服务都已经成功从nacos控制台里得到时间的配置

 

 配置热点更新

接下来要实现文件的热更新

要实现配置的自动更新

第一种方式:在@Value注入的变量所在的类上添加注解@RefreshScope即可      //完成属性刷新的一个功能

第二种方式:使用@ConfigurationProperties注解,可以完成配置的自动加载

新建一个类,专门完成配置的加载

@Data      //提供get和Set的方法
@Component //纳入容器管理,任何人都可以使用
@ConfigurationProperties(prefix = "pattern") //前缀,约定大于配置,前缀名和变量名两者拼接与配置文件一致,就能够完成配置文件的属性注入
public class PatternProperties
private String dateformat;


然后在UserController类注入测试
@Autowired
private PatternProperties properties;

@GetMapping("now")
public String now()
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(properties.getDateformat()));


配置共享

多环境配置共享:
场景:有一个配置属性,在开发、测试、生产等环境的值是一样的,志这样的配置,在每个配置文件里写一个,浪费并且麻烦不合适,找一个地方,这个配置更改之后,不管环境怎么变,都能够被加载————多环境共享需求
实现步骤
微服务启动时会从nacos读取多个配置文件
服务名称-环境-后缀名
服务名称-后缀名
第二个文件名称方程,不管环境怎么变,微服务启动时候一定会读取第二个文件

属性名冲突时候优先级 :

nacos配置优先于本地配置环境

服务名称-环境-后缀名  文件格式优先于  服务名称-后缀名

搭建Nacos集群

基本步骤:

搭建数据库,初始化数据库表结果

下载nacos安装包

配置nacos

  集群配置 ,解压nacos安装包,配置好配置信息,复制三份

    进入nacos的conf目录,修改配置文件名字,cluster.conf.example重新命名为cluster.conf

    接下来改该文件的内容

    

  接下来配置mysql的信息,集群要访问mysql信息

    找到application.properties文件

      去掉#,数据源打开(告诉使用的是mysql集群)

      

       数据库数量,有几台mysql

      

       数据库连接信息

      

   集群配置完毕   

启动nacos集群

  将配置好的集群复制成三份,进入每份的配置文件application.properties文件修改端口,分别为8845\\8846\\8847

  

  找到bin目录,以集群方式启动nacos,命令行为:startup.cmd

nginx反向代理

  直接找到nginx的安装包,解压后找到conf目录,http里面添加如下配置信息

upstream nacos-cluster
server 127.0.0.1:8845;
server 127.0.0.1:8846;
server 127.0.0.1:8847;

server
listen 80;
server_name localhost;

location /nacos
proxy_pass http://nacos-cluster;

  打开nginx,cmd命令下输入start nginx.exe

  如此,就实现了在这三个当中做负载均衡

  

   java代码做相应配置,把原来8848端口改为80端口即可(bootstrap.yml)

值得一提的是,配置完毕开始访问localhost:nacos地址时候,能够访问的了nacos,但是运行的服务不在nacos配置的集群的当中,解决办法为删除data目录下的protocol文件夹,重启服务即可。

八SpringCloud实用篇_Nacos配置共享

一、配置共享

其实微服务启动时,会去nacos读取多个配置文件,例如:

  • [spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml

  • [spring.application.name].yaml,例如:userservice.yaml

[spring.application.name].yaml不包含环境,因此可以被多个环境共享。
下面我们通过案例来测试配置共享

1.1、添加一个环境共享配置

我们在nacos中添加一个userservice.yaml文件:

1.2、在user-service中读取共享配置

在user-service服务中,修改PatternProperties类,读取新添加的属性:

package com.xbmu.user.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@Data
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties 
    private String dateformat;
    private String envSharedValue;

在user-service服务中,修改UserController,添加一个方法:

1.3、运行两个UserApplication,使用不同的profile

修改UserApplication2这个启动项,改变其profile值:


这样,UserApplication(8082)使用的profile是dev,UserApplication2(8081)使用的profile是test。
启动UserApplication和UserApplication2

访问结果如下:

可以看出来,不管是dev,还是test环境,都读取到了envSharedValue这个属性的值。

1.4、总结:

微服务会从nacos读取的配置文件:

  • [服务名]-[spring.profile.active].yaml,环境配置
  • [服务名].yaml,默认配置,多环境共享

优先级:

  • [服务名]-[环境].yaml >[服务名].yaml > 本地配置

1.5、多服务共享配置

不同微服务之间可以共享配置文件,通过下面的两种方式指定:

  • 方式一
server:
  port: 8082
spring:
  application:
    name: userservice # 服务名称
  profiles:
    active: dev # 环境
  cloud:
    nacos:
      server-addr: localhost:8848 # Nacos地址
      config:
        file-extension: yaml # 文件后缀名
        shared-configs: # 多微服务间共享的配置列表
          - dataId: common.yaml # 要共享的配置文件id
  • 方式二
server:
  port: 8082
spring:
  application:
    name: userservice # 服务名称
  profiles:
    active: dev # 环境
  cloud:
    nacos:
      server-addr: localhost:8848 # Nacos地址
      config:
        file-extension: yaml # 文件后缀名
        extension-configs: # 多微服务间共享的配置列表
          - dataId: extend.yaml # 要共享的配置文件id

多种配置的优先级

以上是关于SpringCloud之Nacos配置管理(热共享更新配置集群搭建)的主要内容,如果未能解决你的问题,请参考以下文章

SpringCloud微服务之微服务SpringCloud实用篇02

SpringCloud微服务之微服务SpringCloud实用篇02

SpringCloud 核心组件Nacos配置热更新&配置共享第5章

SpringCloud之微服务实用篇2

SpringCloud之微服务实用篇2

Nacos配置管理(统一配置,配置热更新方式,配置共享优先级)Nacos集群搭建