spring Cloud配置中心 Nacos 1.搭建服务端 2.搭建客户端 3.动态刷新 4.nacos config高可用 5.nacos config高级配置

文章目录

    • 配置中心
      • Nacos
        • 1.搭建服务端
        • 2.搭建客户端
        • 3.动态刷新
        • 4.nacos config高可用
        • 5.nacos config高级配置

在上篇我们谈到 注册中心, 通过这篇文章来跟大家一起学习和了解spring Cloud的配置中心;
注册中心的链接:
https://blog.csdn.net/weixin_44797327/article/details/134653420?spm=1001.2014.3001.5501

配置中心

Nacos

微服务-配置中心

微服务架构中存在很多服务,每个服务都有自己的配置文件,这些配置文件如果集成在服务中,也是难以维护的,于是便可以使用配置中心来管理这些配置文件。

nacos既可以作为 注册中心 ,也可以作为 配置中心 ,使用nacos配置中心,你可以将服务里的配置文件写在nacos上通过nacos面板来修改管理服务的配置而无需停止服务。

如果使用nacos作为注册中心而不作为配置中心,添加配置:spring.cloud.nacos.config.enabled =false 即可。

可以以请求方式发布、获取配置:

发布配置:post,http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld
获取配置:get,http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test

1.搭建服务端

nacos服务端搭建是十分容易的,只需下载+配置+启动就行,参考注册中心这篇:点击前往

建议:使用mysql作为持久化。

2.搭建客户端

客户端即每个配置要被管理的服务,服务的搭建还如往常一样搭建,只不过配置文件发生一些变化,以下就认为你已经创建了一个服务模块/项目,并以此起步。

1.客户端引入nacos config依赖:

<dependency>
	<groupId>com.alibaba.cloudgroupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>

2.创建一个bootstrap.yml(或properties),配置nacos config的配置 :

spring:
 cloud:
   nacos:
     config:		#nacos的信息,添加后可以省略注册中心的nacos此类信息
       server-addr: 127.0.0.1:8848
       username: nacos		
       password: nacos
       contextPath: /nacos
       #--------------------------
       file-extension: yaml    #显示的声明dataId文件扩展名

3.application.yml(或properties),除特殊配置外,只留下下面2个配置

server:
 port: 41150
spring:
 application:
   name: server-producer

到这里你会发现你有2个配置文件: bootstrap.yml、application.yml 。这时你可能就有疑问了,不是说好的将配置交给配置中心管理了吗,怎么服务里还变多了呢。

那么我来给你解释一下吧:

bootsteap.yml:这里只配置配置中心的信息,服务通过它去获取服务所需配置,而且这里的内容基本不变。
application.yml:这里只配置端口+服务名,因为首次启动服务时,需要通过它注册达到nacos,然后才能获取配置。
可以看出,上面的配置基本上就是固定的,而且基本上不会被修改,实际项目中配置文件远远不止这些,其他配置都将被放在配置中心统一管理。

4.在nacos配置中心添加配置文件

spring Cloud配置中心 Nacos 1.搭建服务端 2.搭建客户端 3.动态刷新 4.nacos config高可用 5.nacos config高级配置_第1张图片

点击添加后页面如下:配置名要和服务名一致,后缀带不带都行

spring Cloud配置中心 Nacos 1.搭建服务端 2.搭建客户端 3.动态刷新 4.nacos config高可用 5.nacos config高级配置_第2张图片

第一次发布配置后,重启项目即可。之后修改配置都不需要启动服务。

服务与配置文件的匹配:

文件名=服务名,建议显示指定配置文件后缀。
多同名配置会互相覆盖,比如server、server.yml在指定yml格式后,两个文件会覆盖。
更多特性自己摸索,使用:服务名.yml 并 在bootstrap.yml指定格式为yaml 一定能用。

测试一下效果:按照阿里的示例进行举例。

在客户端创建一个测试类,并在nacos上配置中文件添加属性,然后注入到属性中,启动后控制台就会打印。

@Configuration
public class TestConfig {
   @Value("${user.names}")
   public String test1;
   @Value("${user.pwds}")
   public String test2;

   @PostConstruct
   public void getUser(){
       System.out.println("name=" + test1 + "|pwd=" + test2);
   }
}

启动后,会发现打印的数据就是配置中心上的数据了。

3.动态刷新

此节代码来自于:阿里云-知行动手实验室

配置发生变化后,服务中绑定的属性值将刷新,会刷新的情况有3种:

  • 类上加注解:@RefreshScope、类种非静态属性加@Value注解
@RestController
@RefreshScope
public class NacosConfigDemo {

    @Value("${user.name}")
    private String userName;

    @Value("${user.age}")
    private int userAge;

    @PostConstruct
    public void init() {
        System.out.printf("[init] user name : %s , age : %d%n", userName, userAge);
    }
    @RequestMapping("/user")
    public String user() {
        return String.format("[HTTP] user name : %s , age : %d", userName, userAge);
    }
}
  • 类上加注解:@RefreshScope、@ConfigurationProperties
@RefreshScope
@ConfigurationProperties(prefix = "user")
public class User {

    private String name;

    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
  • 使用Nacos Config监听来对Bean属性实施监听。
@RestController
@RefreshScope
@EnableConfigurationProperties(User.class)
public class NacosConfigDemo {

    @Value("${user.name}")
    private String userName;

    @Value("${user.age}")
    private int userAge;

    @PostConstruct
    public void init() {
        System.out.printf("[init] user name : %s , age : %d%n", userName, userAge);
    }

    @PreDestroy
    public void destroy() {
        System.out.printf("[destroy] user name : %s , age : %d%n", userName, userAge);
    }

    @RequestMapping("/user")
    public String user() {
        return String.format("[HTTP] user name : %s , age : %d", userName, userAge);
    }
}
4.nacos config高可用

nacos是配置中心也是注册中心,实现nacos的高可用和 注册中心 高可用一样。

5.nacos config高级配置

namespace命名空间
nacos可以实现配置文件之间隔离,不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置,可以实现不同开发环境(开发、测试、生产等)配置文件的隔离。

创建命名空间也很容易

spring Cloud配置中心 Nacos 1.搭建服务端 2.搭建客户端 3.动态刷新 4.nacos config高可用 5.nacos config高级配置_第3张图片

切换命名空间

spring Cloud配置中心 Nacos 1.搭建服务端 2.搭建客户端 3.动态刷新 4.nacos config高可用 5.nacos config高级配置_第4张图片

创建后,在客户端bootstrap.yml添加如下配置进行绑定:

spring:
	cloud:
		nacos:
			config:
				namespace: c70a9f91-a687-427f-97bb-5a6e54289a6e

Group分组

在创建配置时可以指定分组,自定义分组在bootstrap.yml添加如下:

spring:
	cloud:
		nacos:
			config:
				group: DEVELOP_GROUP

自定义配置名

三种情况完整配置案例:

spring:
	application:
		name: myserver
	cloud:
		nacos:
			config:
				server-addr: 127.0.0.1:8848
				extension-configs[0]: 	# 1.在默认组,不支持动态刷新
					data-id: myconfig-1.yaml
				extension-configs[1]:	# 2.不在默认组,不支持动态刷新
					data-id: myconfig-2.yaml
					group: MY_GROUP
				extension-configs[2]:	# 3.不在默认的组,支持动态刷新
					data-id: myconfig-3.yaml
					group: MY_GROUP
					refresh: true

总结:默认配置名+默认组时才会自动刷新,否则需指定refresh: true才自动刷新。
注意:

  • 多个相同配置文件存在优先级extension-configs[a]里a越大,优先级越高。
  • data-id结尾必须有properties/yaml/yml等扩展名。

Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术。不过大多数讲解还停留在对Spring Cloud功能使用的层面,其底层的很多原理,很多人可能并不知晓。因此本文将通过大量的手绘图,给大家谈谈Spring Cloud微服务架构的底层原理。

实际上,Spring Cloud 是一个全家桶式的技术栈,包含了很多组件。本文先从其最核心的几个组件入手,来剖析一下其底层的工作原理。也就是 Eureka、Feign、Ribbon、Hystrix、Zuul 这几个组件。 EFRHZ

你可能感兴趣的:(spring,Java,spring,cloud,spring)