Spring Cloud集成Nacos作为配置中心
配置中心,顾名思义,就是用来统一管理项目中所有配置的系统。在微服务架构中,当系统从一个单体应用,被拆分成分布式系统上一个个服务节点后,配置文件也必须跟着迁移(分割),这样配置就分散了,不仅如此,分散中还包含着冗余。配置中心将配置从各应用中剥离出来,对配置进行统一管理,应用自身不需要自己去管理配置。如果一个中型的项目,不采用配置中心的模式,一大堆的各类配置项,各种不定时的修改需求,一定会让开发同学非
往期回顾
前面我们已经介绍了Nacos
的安装与配置,Spring Cloud
集成Nacos
作为服务的注册中心,集成Nacos
实现服务的负载均衡和一些常见的负载均衡策略以及使用Dubbo进行RPC调用
接下来,我们将介绍如何使用Nacos
作为配置中心加载远程配制文件
配置中心
什么是配置中心?
配置中心,顾名思义,就是用来统一管理项目中所有配置的系统。
在微服务架构中,当系统从一个单体应用,被拆分成分布式系统上一个个服务节点后,配置文件也必须跟着迁移(分割),这样配置就分散了,不仅如此,分散中还包含着冗余。配置中心将配置从各应用中剥离出来,对配置进行统一管理,应用自身不需要自己去管理配置。
如果一个中型的项目,不采用配置中心的模式,一大堆的各类配置项,各种不定时的修改需求,一定会让开发同学非常头疼且管理十分混乱。所以,我们需要使用配置中心对这些配置进行集中管理。
一个合格的配置中心需要满足如下特性:
- 配置项容易读取和修改
- 分布式环境下应用配置的可管理性,即提供远程管理配置的能力
- 支持对配置的修改的检视以把控风险
- 可以查看配置修改的历史记录
- 不同部署环境下应用配置的隔离性
配置中心的作用
- 对配置文件进行集中管理,在不同的环境下或者不同配置中,可以对配置文件进行更新和部署
- 在程序的运行期间,可以对程序中的配置文件进行动态性调整。使用分布式配置中心,就不需要在每一台服务器上都进行配置文件的修改,只需要在总服务器中进行修改,系统就会向其他的服务器进行统一的修改配置
- 如果系统程序的配置发生了变动,无需要重新重启服务器,就能够自动感知相应的变化,并将新的变化统一发送到相应程序上
- 支持不同环境的隔离和切换
分布式配置中心作用有很多,这里仅仅简单罗列了几个最为常见的作用
Nacos Config
Nacos
提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos Config,您可以在 Nacos Server 集中管理你 Spring Cloud 应用的外部属性配置。
Spring Cloud Alibaba Nacos Config 是 Config Server 和 Client 的替代方案,客户端和服务器上的概念与 Spring Environment 和 PropertySource 有着一致的抽象,在特殊的 bootstrap 阶段,配置被加载到 Spring 环境中。当应用程序通过部署管道从开发到测试再到生产时,您可以管理这些环境之间的配置,并确保应用程序具有迁移时需要运行的所有内容。
Nacos是Spring Cloud组件Spring Cloud Config的替代方案
Spring Cloud Config 分为服务端和客户端两个部分。服务端被称为分布式配置中心,它是个独立的应用,可以从配置仓库获取配置信息并提供给客户端使用。客户端可以通过配置中心来获取配置信息,在启动时加载配置。Spring Cloud Config 的配置中心默认采用Git来存储配置信息,所以天然就支持配置信息的版本管理,并且可以使用Git客户端来方便地管理和访问配置信息
快速开始
1.启动Nacos服务
如若还未启动Nacos请参见 Nacos的安装与配置
2.引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
这里我遇见了一个bug,详细参见Param ‘serviceName‘ is illegal, serviceName is blank
这个bug出现的原因是我没有导入bootstrap的依赖,导入以下依赖即可
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
3.修改配制文件
修改application.yml
,启用的是dev环境的配置
spring:
profiles:
active: dev
server:
port: 8081
添加bootstrap.yml
,主要是对Nacos的作为配置中心的功能进行配置:
spring:
application:
name: user-service
cloud:
nacos:
discovery:
server-addr: 192.168.199.128:8848 #Nacos地址
config:
server-addr: 192.168.199.128:8848 #Nacos地址
file-extension: yaml #这里我们获取的yaml格式的配置
management:
endpoints:
web:
exposure:
include: "*"
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mapper-locations: classpath:cuit/epoch/pymjl/mapper/xml/*.xml
type-aliases-package: cuit.epoch.pymjl.entity
注意:
当你使用域名的方式来访问 Nacos 时,
spring.cloud.nacos.config.server-addr
配置的方式为域名:port
。例如 Nacos 的域名为abc.com.nacos,监听的端口为 80,则
spring.cloud.nacos.config.server-addr=abc.com.nacos:80
。 注意 80 端口不能省略。
4.创建Controller
@RefreshScope
可以使Nacos
客户端运行过程中可以获取到配置中心配置的变化然后更新
package cuit.epoch.pymjl.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author Pymjl
* @version 1.0
* @date 2022/8/31 20:15
**/
@RestController
@RefreshScope
@RequestMapping("/config")
public class ConfigController {
@Value("${config.info:default}")
private String info;
@GetMapping("/info")
public String getInfo() {
return info;
}
}
5.基于 dataid 为 yaml 的文件扩展名配置方式
我们先来讲下Nacos中的dataid的组成格式及与SpringBoot配置文件中的属性对应关系:
${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
比如说我们现在要获取应用名称为user-service
的应用在dev
环境下的yaml
配置,dataid如下:
user-service-dev.yaml
根据上面的命名方式在Nacos
控制台添加如下配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.199.128:3306/cloud_learn?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
username: root
password: 123456
druid:
initialSize: 10
minIdle: 10
maxActive: 100
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 30000
validationQuery: select 'x'
testWhileIdle: true
#通过别名的方式配置扩展插件,常用的插件有:监控统计用的filter:stat,日志用的filter:log4j,防御sql注入的filter:wall
filters: stat,wall
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合并多个DruidDataSource的监控数据
useGlobalDataSourceStat: false
cache:
type: redis
redis:
host: 192.168.199.128
port: 6379
password: 123456
config:
info: This is Nacos config test
dubbo:
application:
name: ${spring.application.name}
logger: slf4j
protocol:
name: dubbo
port: -1
registry:
address: nacos://192.168.199.128:8848
config-center:
address: nacos://192.168.199.128:8848
metadata-report:
address: nacos://192.168.199.128:8848
consumer:
validation: true
timeout: 3000
check: false
loadbalance: roundrobin
scan:
base-packages: cuit.epoch.pymjl.controller
如图所示:
spring-cloud-starter-alibaba-nacos-config 在加载配置的时候,不仅仅加载了以 dataid 为
${spring.application.name}.${file-extension:properties}
为前缀的基础配置,还加载了dataid为${spring.application.name}-${profile}.${file-extension:properties}
的基础配置。在日常开发中如果遇到多套环境下的不同配置,可以通过Spring 提供的
${spring.profiles.active}
这个配置项来配置。
开始测试
先启动服务,如图,启动成功
访问接口测试
接下来我们更改在Nacos
中的配置,然后发布更新
config:
info: Changeing the nacos config
观察Spring的控制台输出
再访问刚才的接口
可见,配制文件完成了实时的动态更新,至此
关于Nacos的其他配置可参见官方文档
ngeing the nacos config
观察Spring的控制台输出
[外链图片转存中...(img-RvY46qND-1662117389530)]
再访问刚才的接口
[外链图片转存中...(img-5eS2GBg2-1662117389530)]
可见,配制文件完成了实时的动态更新,至此
关于Nacos的其他配置可参见[官方文档](https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config)
项目源码:[gitee](https://gitee.com/pymjl_0/cloud-learn) [github](https://github.com/Pymjl/cloud-learn)
更多推荐
所有评论(0)