【微服务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官网
如何使用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
的值得到了改变
修改后访问打印false
以上就是 Nacos
作为配置中心的简单用法。
参考资料
转载自:https://juejin.cn/post/7230307122414665784