基于Nacos构建分布式配置中心

目录

1.什么是Nacos

2.nacos-client搭建

2.1新建springboot项目导入

3.springboot优先级

4.bootstrap.yml

 5.配置连接nocos

6.新建配置

7.读取配置文件

 8.启动

 9.切换配置文件

 Nacos配置中心原理总结


1.什么是Nacos

Nacos 致力于帮助您发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

其实Nacos就是第一代微服务中的注册中心Eureka和Spring Cloud Config配置中心的合体,由国内知名的Bat公司Alibaba团队开源,在第二代微服务Spring Cloud Alibaba中被广泛使用,你完全可以使用nacos替换eureka和config这两个组件。

Nacos可以实现分布式`服务注册与发现`和`分布式配置中心动态`管理

2.nacos-client搭建

2.1新建springboot项目导入

 <!--nacos服务注册与发现 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>alibaba</artifactId>
        <groupId>com.zhengyang.springcloud</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloud-alibaba-provider</artifactId>
    <dependencies>

        <!-- web组件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <!--排除tomcat依赖 -->
                <exclusion>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                    <groupId>org.springframework.boot</groupId>
                </exclusion>
            </exclusions>
        </dependency>

        <!--undertow容器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-undertow</artifactId>
        </dependency>

        <!--nacos服务注册与发现 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!--SpringCloud整合nacos配置中心-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

        <!-- lombok插件 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

3.springboot优先级

Spring Boot 配置文件的加载顺序:依次为 bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml ,其中 bootstrap.properties 配置为最高优先级 。nacos官方文档要求,指定配置文件必须放在bootstrap.properties或者bootstrap.yml中加载初始化,因为在整个SpringBoot应用程序中bootstrap.properties/yml类型的文件优先级最高加载,所以我们把配置文件都放入到bootstrap.yml中。

4.bootstrap.yml

项目启动时加载和查找配置中心文件的过程原理:

项目启动的时候,默认会去加载查找Data ID为nacos-config.yaml的配置文件;如果你设置了多环境配置profiles.active,这个时候不仅会默认加载nacos-config.yaml,另外还会去加载查找nacos-config-dev.yaml这个名称的文件。多环境下会加载查找两个文件,不指定多环境下会只默认加载一个。

你可以通过配置 spring.cloud.nacos.config.refresh.enabled=false 来关闭动态刷新

 5.配置连接nocos

server:
  port: 8715
spring:
  cloud:
    nacos:
      discovery:
        #Nacos服务器地址
        server-addr: 127.0.0.1:8848
        #开启服务注册与发现
        enabled: true
        #配置中心配置,默认自动去Nacos中找 spring-alibaba-provider.yaml
      config:
        #Nacos配置中心地址
        server-addr: 127.0.0.1:8848
        #分组选择
        group: DEFAULT_GROUP
        #类型(默认加载.properties),默认指定查找当前服务名称.yaml
        file-extension: yaml
  application:
    name: spring-alibaba-provider


6.新建配置

 

7.读取配置文件

controller加上

 @RefreshScope : 在所要使用配置文件参数值的类上加这个注解会自动实现动态刷新,只要nacos-server端一有文件发生变化,会动态刷新配置。

/**
 * @Author: Hello World
 * @Date: 2021/7/20 12:36
 * @Description:
 */
@RestController
@RequestMapping("/provider")
//动态刷新配置信息
@RefreshScope
public class ProductController {

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

    @GetMapping("/get")
    public String get(){
        return "服务端被访问8715";
    }

    @GetMapping("/name/get")
    public String getUserName(){
        return userName;
    }
}

 8.启动

启动时已经加载了nacos中的配置文件

 

 测试访问已经加载了nacaos配置的信息

 9.切换配置文件

 说明:可以使用active属性切换线上的配置文件

server:
  port: 8715
spring:
  cloud:
    nacos:
      discovery:
        #Nacos服务器地址
        server-addr: 127.0.0.1:8848
        #开启服务注册与发现
        enabled: true
        #配置中心配置,默认自动去Nacos中找 spring-alibaba-provider.yaml
      config:
        #Nacos配置中心地址
        server-addr: 127.0.0.1:8848
        #分组选择
        group: DEFAULT_GROUP
        #类型(默认加载.properties),默认指定查找当前服务名称.yaml
        file-extension: yaml
  application:
    name: spring-alibaba-provider
  profiles:
    active: pro

 Nacos配置中心原理总结

在长轮询的任务中,当服务端配置信息发生变更时,客户端将最新的数据获取下来之后,保存在了 CacheData 中,同时更新了该 CacheData 的md5值,所以当下次执行 checkListenerMd5 方法时,对前后两次的MD5值作比对,就会发现当前listener所持有的 md5 值已经和 CacheData 的 md5 值不一样了,也就意味着服务端的配置信息发生改变了,这时就需要将最新的数据通知给 Listener 的持有者。

至此配置中心的完整流程已经分析完毕了,可以发现,Nacos 并不是通过推的方式将服务端最新的配置信息发送给客户端的,而是客户端维护了一个长轮询的任务,定时去拉取发生变更的配置信息,然后将最新的数据推送给 Listener 的持有者。

猜你喜欢

转载自blog.csdn.net/qq_37612049/article/details/120301989