【微服务02】Nacos配置中心的入门级用法

微服务相关文章:

本文主要有以下内容:

  • 为什么需要配置中心?
  • 如何使用Nacos Config

注意:该部分的代码在 【微服务01】中的代码基础之上进行代码改动

为什么需要配置中心

在没有使用配置中心的时候,我们项目的配置采用的方式一般有如下几种

  • 写在项目的配置文件中如application.yml中。
  • 硬编码到代码中,如使用Java代码配置MyBatis等。
  • 环境 / 启动变量:通过操作系统的环境变量,或者启动命令中的 -D 参数传入配置项。
  • 从数据库/缓存中获取,将配置项保存在数据库中。

上述几种方式或多或少都有自己的弊端,前三种当我们需要修改配置项时,通常需要重新启动应用配置项才能生效,而第四种看似不用,但是配置文件作为代码资源的一部分,我们无法做到对配置项的版本控制或者配置回滚等操作。

因此我们需要一种配置方式能够解决上述问题,因此Nacos 闪亮登场。

Nacos介绍

微服务01中使用了Nacos组件,但没有做相关介绍,因此在这里简单的介绍以下nacos。以下内容来自于Nacos官网

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

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

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

Nacos生态图:

nacos.png 图片来自nacos官网

如何使用Nacos Config

该部分主要涉及以下内容:

  • @RefreshScope注解使用
  • 配置文件的配置

配置中心在项目中的使用

consumer-servicepom.xml添加下列依赖:

<!-- 添加Nacos Config配置项 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency><!-- 读取bootstrap文件 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!-- 添加这两个依赖的目的是为了演示Nacos配置中心起了作用-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.21</version>
    <scope>runtime</scope>
</dependency>
复制代码

注意:额外添加了spring-data-jpamysql-connector-java的依赖!

接着在resources目录下创建bootstrap.yml文件添加并如下配置信息:

spring:
  application:
    name: consumer-application
  cloud:
    nacos:
      config:
        server-addr: http://192.168.1.7:8848
        file-extension: yml
        # prefix: 文件名前缀,默认是spring.application.name
        namespace: dev
        cluster-name: Cluster-A
        group: DEFAULT_GROUP
        # 从Nacos读取配置项的超时时间
        timeout: 5000
        # 长轮询超时时间
        config-long-poll-timeout: 10000
        # 轮询的重试时间
        config-retry-time: 2000
        # 长轮询最大重试次数
        max-retry: 3
        # 开启监听和自动刷新
        refresh-enabled: true
复制代码

配置项说明

文件定位配置项:告诉应用从那个Nacos服务器的哪一个分组中去读取配置文件

  • namespaceNacos ConfignamespaceNacos 作为服务发现阶段配置中 namespace 是同一个概念和用法。在这里指定了 namespace=dev,应用程序则只会去获取 dev 这个命名空间下的配置文件;
  • group:概念和用法与 Nacos 服务发现中的 group 相同,如未指定则默认值为 DEFAULT_GROUP,应用程序只会加载相同与配置文件中 group 值相同的配置文件;
  • prefix:需要加载的文件名前缀,默认为当前应用的名称,即 spring.application.name,一般不需要特殊配置;
  • file-extension:需要加载的文件扩展名,默认为 properties,我改成了 yml

超时和重试配置项:读取失败的超时和重试策略

  • timeout:从 Nacos 服务器上读取配置项的超时时间,单位是 ms,默认值 3000 毫秒;
  • config-retry-time:获取配置项失败的重试时间;
  • config-long-poll-timeout:长轮询超时时间,单位为 ms;
  • max-retry:最大重试次数。

注意:必须把name属性从application.yml迁移过来,否则无法动态刷新

然后再在Nacos控制台添加consumer-appliaiton.yml;配置文件,配置信息如下所示:

refreshData: true
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/react?serverTimezone=Asia/Shanghai
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
  #jpa
  jpa:
    show-sql: true
    hibernate:
      ddl-auto: update
复制代码

我的配置如下图所示:

nacosyml.png consumer-application.yml创建和配置

Data IDGROUP 需要和 bootstrap.yml 中的配置项保持一致。

为了验证 nacos 中新建的配置文件起了作用,在 consumer-service 添加实体类 Student

@Table
@Entity
public class Student {
​
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "stu_id", nullable = false)
    private Integer stuId;
​
​
    @Column(name = "stu_name")
    private String stuName;
​
    @Column(name = "stu_age")
    private Integer stuAge;
​
    @Column(name = "stu_address")
    private String stuAddress;
    
    // getter and setter 省略
}
复制代码

接下来先后启动 produce-serviceconsumer-service 可在控制台看到如下信息:

sql.png

建表语句截图

config_success.png 订阅通知截图

第一张截图表示建表成功,第二张表示我们配置文件的订阅通知。

除此之外,应用的成功启动表明了 bootstrap.yml 的加载顺序在 application.yml 之前,配置中心的配置信息读取先于 application.yml

先通过 bootstrap.yml 定位从那个服务器上读取配置信息,定位服务器后读取相应的配置文件供应用使用。在这里就是读取 bootstrap.yml 的配置去定位配置中心服务器,从配置中心的 consumer-application.yml加载数据库配置信息供服务建表时使用。

注:如果要添加其他的配置文件,如消息队列、redis 等中间件的配置。 需要在spring.nacos.config节点下添加下列配置信息

extension-configs:
    - dataId: redis-config.yml
    group: EXT_GROUP # 动态刷新
    refresh: true
    - dataId: rabbitmq-config.yml
    group: EXT_GROUP
    refresh: true
复制代码

注意看dataIdgroup的取值

ext_group.png redis和RocketMQ配置截图

配置信息的动态刷新

ConsumerController类上添加@RefreshScope注解 通过@value注入值,修改后的代码如下

@RestController
@RequestMapping("consumer/")
@RefreshScope
public class ConsumerController {
​
    @Resource
    ProduceDataInt produceDataInt;
​
    @Value("${refreshData:true}")
    private Boolean refreshData;
​
    @GetMapping("string")
    public String consumer(){
​
        System.out.println("refreshData = " + refreshData);
        System.out.println(produceDataInt.getData().get("produce"));
        return "consumer user";
    }
​
}
复制代码

先访问consumer/string方法得到如下输出:

true.png 第一次打印true

然后修改配置文件中的 refreshData: false ,再次访问该方法,可以看到refreshData的值得到了改变

false.png 修改后访问打印false

以上就是 Nacos 作为配置中心的简单用法。

参考资料

猜你喜欢

转载自juejin.im/post/7230307122414665784