マイクロサービス関連の記事:
この記事は主に以下の内容で構成されています。
- なぜ構成センターが必要なのですか?
- 使い方
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官网
如何使用Nacos Config
该部分主要涉及以下内容:
@RefreshScope
注解使用- 配置文件的配置
配置中心在项目中的使用
在 consumer-service
的 pom.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-jpa
和mysql-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
服务器的哪一个分组中去读取配置文件
namespace
:Nacos Config
的namespace
和Nacos
作为服务发现阶段配置中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
复制代码
我的配置如下图所示:
consumer-application.yml创建和配置
Data ID
和 GROUP
需要和 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-service
和 consumer-service
可在控制台看到如下信息:
建表语句截图
订阅通知截图
第一张截图表示建表成功,第二张表示我们配置文件的订阅通知。
除此之外,应用的成功启动表明了 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
复制代码
注意看dataId
和group
的取值
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 を印刷する
次に、構成ファイルを変更しrefreshData: false
、メソッドに再度アクセスすると、refreshData
表示される値が変更されました
変更後、print false にアクセスする
以上が設定センターNacos
としての。