【マイクロサービス02】Nacos構成センターのエントリーレベルの使い方

マイクロサービス関連の記事:

この記事は主に以下の内容で構成されています。

  • なぜ構成センターが必要なのですか?
  • 使い方Nacos Config

: この部分のコードは、[マイクロサービス 01]のコードに基づいて変更されています。

構成センターが必要な理由

構成センターを使用しない場合、私たちのプロジェクトの構成方法は一般的に次のとおりです。

  • のようにプロジェクトの設定ファイルに書き込みますapplication.yml
  • Javaコード構成などを使用するなど、コードにハードコーディングされていますMyBatis
  • 環境/起動変数: オペレーティング システムの環境変数、または起動コマンドの -D パラメーターを介して構成項目を渡します。
  • データベース/キャッシュからフェッチし、構成アイテムをデータベースに保存します。

上記の方法には多かれ少なかれ独自の欠点があります. 最初の 3 つの構成項目を変更する必要がある場合は、通常、アプリケーションの構成項目を再起動して有効にする必要があります.4 番目の方法は不要に思えますが、構成ファイルはコード リソースとして使用され、その一部として、構成アイテムのバージョン管理や構成ロールバックを行うことができません。

そこで、上記の問題を解決できる設定方法が必要なのでNacosデビュー。

ナコス紹介

コンポーネントはmicroservice 01で使用されていますNacosが、関連する紹介はありませんので、ここで簡単に紹介しますnacos以下の内容はNacos の公式 Web サイトからのものです。

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変更後、print false にアクセスする

以上が設定センターNacosとしての。

参考文献

おすすめ

転載: juejin.im/post/7230307122414665784
おすすめ