目录
一、为什么需要配置中心
二、常用的配置中心
Nacos 的几个概念
三、Nacos配置中心的使用
(一)properties格式
1、导入依赖
2、在配置中心新建配置
3、修改配置文件名为bootstrap.yml
4、在微服务中添加nacos config服务地址的配置
5、测试获取注册中心的配置
(二)yaml格式
(三)profiles.active—粒度配置
经常会出现的报错信息:
常见报错
一、为什么需要配置中心
在没有配置中心之前,传统应用配置的存在以下痛点:
(1)采用本地静态配置,无法保证实时性:修改配置不灵活且需要经过较长的测试发布周期,无法尽快通知到客户端,还有些配置对实时性要求很高,比方说主备切换配置或者碰上故障需要修改配置,这时通过传统的静态配置或者重新发布的方式去配置,那么响应速度是非常慢的,业务风险非常大
(2)易引发生产事故:比如在发布的时候,容易将测试环境的配置带到生产上,引发生产事故。
(3)配置散乱且格式不标准:有的用properties格式,有的用xml格式,还有的存DB,团队倾向自造轮子,做法五花八门。
(4)配置缺乏安全审计、版本控制、配置权限控制功能:谁?在什么时间?修改了什么配置?无从追溯,出了问题也无法及时回滚到上一个版本;无法对配置的变更发布进行认证授权,所有人都能修改和发布配置。
而配置中心区别于传统的配置信息分散到系统各个角落的方式,对系统中的配置文件进行集中统一管理,而不需要逐一对单个的服务器进行管理。那这样做有什么好处呢?
(1)通过格式统一化配置中心,可以使得配置标准化、
(2)当配置信息发生变动时,修改实时生效,无需要重新重启服务器,就能够自动感知相应的变化,并将新的变化统一发送到相应程序上,快速响应变化。比方说某个功能只是针对某个地区用户,还有某个功能只在大促的时段开放,使用配置中心后只需要相关人员在配置中心动态去调整参数,就基本上可以实时或准实时去调整相关对应的业务。
(3)通过审计功能还可以追溯问题
二、常用的配置中心
微服务中配置中心的主流解决方案主要有三种:Nacos、Apollo、Config+Bus,不过里我们主要介绍 Nacos 作为配置中心的用法。
Nacos 的几个概念
命名空间(Namespace)
命名空间可用于进行不同环境的配置隔离。一般一个环境划分到一个命名空间
配置分组(Group)
配置分组用于将不同的服务可以归类到同一分组。一般将一个项目的配置分到一组
配置集(Data ID)
在系统中,一个配置文件通常就是一个配置集。一般微服务的配置就是一个配置集
三、Nacos配置中心的使用
使用nacos作为配置中心,其实就是将nacos当做一个服务端,将各个微服务看成是客户端,我们将各个微服务的配置文件统一存放在nacos上,然后各个微服务从nacos上拉取配置即可。
就相当于服务模块请求nacos,nacos响应给服务模块一些数据
(一)properties格式
1、导入依赖
哪个服务模块要获取nacos配置管理的数据,就在哪个模块上添加依赖
<!--nacos的config配置中心依赖-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--把application.yml配置文件名称改为bootstrap.xml-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
2、在配置中心新建配置
3、修改配置文件名为bootstrap.yml
4、在微服务中添加nacos config服务地址的配置
spring:application:name: user-server #注册服务的名称# 配置数据源datasource:druid:url: jdbc:mysql://localhost:3306/nacos?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8driver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: 123456#clout配置nacos服务注册中心cloud:nacos:discovery: #配置客户端server-addr: 192.168.100.129:8848 #虚拟机ip地址和端口号username: nacos #nacos网址的账号密码password: nacos#配置nacos网站的config配置中心config:server-addr: 192.168.100.129:8848 #虚拟机ip地址和端口号file-extension: properties #配置内容的类型格式username: nacos #nacos网站的账号密码password: nacos
5、测试获取注册中心的配置
@RestController
@RequestMapping("/user")
public class UserController {@Value("${username}")//通过配置中心的配置内容的键获取valuepublic String username;@Value("${age}")//通过配置中心的配置内容的键获取valuepublic String age;@GetMapping("/test2")public void test2(){System.out.println(username); //控制台打印张三System.out.println(age);//99}}
6、可以将yml配置文件中数据库的配置移至配置中心,并修改工程中数据源的配置
在user服务模块中获取配置中心的配置内容数据源配置,这样也可以把数据库配置成功,就可以把yml配置文件中的数据源配置删除了
@Configuration
public class DataSourceConfig {@Value("${spring.datasource.druid.username}")private String username;@Value("${spring.datasource.druid.password}")private String password;@Value("${spring.datasource.druid.url}")private String url;@Value("${spring.datasource.druid.driver-class-name}")private String driverClassName;@Beanpublic DataSource dataSource(){DruidDataSource druidDataSource = new DruidDataSource();druidDataSource.setUrl(url);druidDataSource.setUsername(username);druidDataSource.setPassword(password);druidDataSource.setDriverClassName(driverClassName);return druidDataSource;}
}
(二)yaml格式
1、配置中心新建配置
2、修改工程配置文件名为bootstrap.yml并修改配置文件配置
(三)profiles.active—粒度配置
1、配置中心创建配置
data id : 服务名-命名空间名.后缀名(order-server-dev.yaml)
2、工程模块配置
经常会出现的报错信息:
org.springframework.beans.factory.BeanCreationException:@Value没有注入成功,要仔细检查一遍
常见报错
1、如果启动不了报错,有可能出现的问题是:防火墙没有关闭,关闭防火墙后再去开启Nacos服务
查看防火状态
systemctl status firewalld
systemctl stop firewalld
然后再去启动Nacos服务
2、如果启动成功了,发现nacos服务注册中心网站没有任何数据和注册的消息,有可能是本机的网络更改了
因为conf/application.properties文件中IP地址是当前网络属性的IPv4地址,如果更换了网络要修改IP地址
# 启用standalone模式
nacos.standalone=true
# 修改端口号
server.port=8848
# 修改数据存储位置
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://192.168.216.176:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456
注意要修改以下参数:
server.port:修改为要使用的端口号 db.url.0:修改为MySQL数据库的连接地址,IP地址是当前网络属性的IPv4地址,换一个网络会发生变化,记得修改
db.user、db.password:并设置正确的数据库用户名和密码