乐趣区

关于java:Spring-Cloud-Alibaba-整合-Nacos-实现服务配置中心

在之前的文章《Nacos 本地单机版部署步骤和应用》中,大家应该理解了 Nacos 是什么?其中 Nacos 提供了动静配置服务性能

一、Nacos 动静配置服务是什么?

官网是这么说的:

Nacos 动静配置服务是什么?

动静配置服务能够以中心化、内部化和动态化的形式治理所有环境的利用配置和服务配置。

动静配置打消了配置变更时重新部署利用和服务的须要,让配置管理变得更加高效和麻利。

配置中心化治理让实现无状态服务变得更简略,让服务按需弹性扩大变得更容易。

Nacos 控制台的性能

Nacos 提供了一个简洁易用的 UI (控制台样例 Demo) 用来治理所有的服务和利用的配置。Nacos 还提供包含配置版本跟踪、金丝雀公布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理个性,更平安地在生产环境中治理配置变更和升高配置变更带来的危险。

二、实战:Nacos 实现服务配置核心

上面通过两个大模块实现:

  • 在 Nacos 中新建或批改配置
  • 在 Spring Cloud 利用中加载 Nacos 配置

2.1 在 Nacos 新建配置

依据上篇文章,部署运行 Nacos,而后关上配置管理 – 配置列表页面。地址:http://localhost:8848/nacos/index.html#/configurationManagement

点击右上角创立按钮,进入新建配置页面,新建配置如图所示:

配置详解:

  • Data ID:配置为 config-service.yml。Data ID 是指定配置且保障全局唯一性。
  • Group:默认配置为 DEFAULT_GROUP,不须要批改。
  • 配置格局 :抉择 YAML 配置文件格式
  • 配置内容 :具体配置的内容。这里简略配置了个键值对,其实理论利用场景,会配置包含存储配置、端口配置和各种中间件配置等

Nacos Data ID 规范格局如下:

${prefix}-${spring.profiles.active}.${file-extension}

其中:

  • prefix:默认为 spring.application.name 的值
  • spring.profiles.active:该案例为空,个别指定 dev test 等环境配置
  • file-extension:配置内容格局

2.2 创立 Spring Cloud 利用

1、创立利用

新建工程,工程名为:springcloud-nacos-config-sample

工程项目地址在:

  • Github:https://github.com/JeffLi1993…
  • Gitee:https://gitee.com/jeff1993/sp…

2、配置 pom 依赖

pom.xml 代码如下:

<?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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>springcloud</groupId>
    <artifactId>springcloud-nacos-config-sample</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springcloud-nacos-config-sample :: Nacos 服务配置核心案例 </name>

    <!-- Spring Boot 启动父依赖 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.2.RELEASE</version>
    </parent>

    <dependencies>

        <!-- Nacos Config 依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

        <!-- Spring Boot Web 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- Spring Boot Test 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.10</version>
            <optional>true</optional>
        </dependency>

    </dependencies>

    <dependencyManagement>
        <dependencies>
            
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
                <version>0.2.2.RELEASE</version>
            </dependency>
            
            <!-- Spring Cloud Hoxton.SR12 版本依赖 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR7</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

其中依赖了:

  • Spring Cloud Alibaba Nacos Config 依赖
  • Spring Cloud Hoxton.SR12 版本依赖

3、创立配置文件

在利用工程的 resources 目录下,创立 application.yml 文件,填入如下信息:

server:
  port: 8083 # 服务端口

spring:
  application:
    name: config-service # 服务名称 

其中:

  • server.port 指定了服务端口 8083
  • spring.application.name 指定了服务名称 config-service,要跟 Nacos 后盾新建配置的 Data ID 值保持一致。

为啥呢?因为看一下 Nacos Config 源码 org.springframework.cloud.alibaba.nacos.client.NacosPropertySourceLocator#locate。源码如下:

if (StringUtils.isEmpty(dataIdPrefix)) {dataIdPrefix = env.getProperty("spring.application.name");
}

如果 Data ID 没有配置,则读取 spring.application.name 服务名称配置。

持续创立 bootstrap.yml 文件,填入以下信息:

spring:
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848 # Nacos 配置核心地址
        file-extension: yml # 配置文件格式 

其中:

  • nacos.config.server-addr 指定了 Nacos 地址和端口
  • nacos.config.file-extension 指定了配置文件格式为 yml

4、创立测试类和启动类

新建 Spring Cloud 利用启动类 ConfigApplication,代码如下:

/**
 * Spring Boot 服务启动类
 *
 * Created by bysocket.com on 21/12/06.
 */
@SpringBootApplication  // Spring Boot 利用标识
public class ProviderApplication {public static void main(String[] args) {
        // 程序启动入口
        // 启动嵌入式的 Tomcat 并初始化 Spring 环境及其各 Spring 组件
        SpringApplication.run(ProviderApplication.class,args);
    }
}

而后新建测试管制类 ConfigController,代码如下:

/**
 * Config 案例
 * <p>
 * Created by bysocket.com on 21/12/07.
 */
@RestController
@Slf4j
@RefreshScope
@Data
public class ConfigController {@Value("${blog.name}")
    private String blogName;

    @GetMapping("/get")
    public String get() {return "ConfigController#get blog name =" + getBlogName();
    }
}

代码详解如下:

  • @Value 注解:@Value 对 Bean 的字段或者办法参数进行标注,职责是基于表达式给字段或办法参数设置默认属性值。通常格局是注解 + SpEL 表达式,如 @Value(“SpEL 表达式 ”)。
  • @RefreshScope 注解:容许在运行时动静刷新 Bean 的 Scope 实现。如果 Bean 被刷新,则在下次访问 Bean 即执行办法时,会创立一个新实例。这阐明在利用运行时,在 Nacos 控制台批改了对应配置的值后,会同时批改和失效该 Bean 这个值,达到动静配置的成果。

5、运行测试

启动下面的利用,会在控制台看到如下信息:

2021-12-09 20:11:43.399  INFO 13909 --- [-127.0.0.1_8848] o.s.c.a.n.c.NacosPropertySourceBuilder   : Loading nacos data, dataId: 'config-service.yml', group: 'DEFAULT_GROUP'
2021-12-09 20:11:43.400  INFO 13909 --- [-127.0.0.1_8848] b.c.PropertySourceBootstrapConfiguration : Located property source: [BootstrapPropertySource {name='bootstrapProperties-config-service.yml'}]

这里能够看出,曾经加载了 Nacos 配置信息 dataId: 'config-service.yml'group: 'DEFAULT_GROUP'

最初在浏览器关上地址 http://localhost:8083/get,响应如图所示:

动静配置测试

而后去 Nacos 控制台,配置列表点击批改 config-service.yml 配置。将 www.bysocekt.com 改成 bysocket.com,而后确认公布。如图所示:

能够从控制台看到如下日志:

2021-12-09 20:31:30.747  INFO 13909 --- [-127.0.0.1_8848] o.s.c.e.event.RefreshEventListener       : Refresh keys changed: [blog.name]

从新拜访下浏览器该地址 http://localhost:8083/get,响应如图所示:

阐明动静刷新配置胜利。

三、Nacos 实现分布式配置小结

本文具体介绍了 Spring Cloud 整合 Nacos 实现服务散布配置。要害两点:

  • 如何在 Nacos 设置对应的配置
  • 如何在工程中通过依赖和注解关联上对应的外化配置

参考资料

  • 官网案例:https://github.com/nacos-grou…
  • 官网文档:https://nacos.io/zh-cn/docs/q…
  • https://blog.didispace.com/sp…

代码示例地址

本文案例,能够查看开源我的项目 springcloud-learning-example 中的 springcloud-nacos-config-sample 模块:

  • Github:https://github.com/JeffLi1993…
  • Gitee:https://gitee.com/jeff1993/sp…

以下系列教程举荐

  • 《Spring Cloud 系列教程》
  • 《Spring Boot 2.x 系列教程》
  • 《Elasticsearch 入门系列教程》

    作者:泥瓦匠(公号「程序员泥瓦匠」)出处:https://www.bysocket.com 欢送转载,也请保留这段申明。谢谢!

退出移动版