统一配置管理
随着微服务越来越多,如果达到成百上千个服务,如果一个配置文件和数十个服务有关系,需要逐个微服务的配置文件去调——麻烦;
并且调完,每个微服务都需要重启——生产环境下,一个服务的重启带来的影响比较大;
需求:希望配置文件能够实现统一的管理,比如说数十个配置文件的修改,想只需要修改一个就行了,并且这个服务不用重启动——服务热更新
nacos配置管理
Data ID:一般命名为:服务名称-配置环境.yml(必须唯一)
配置的内容一般是需要变化的配置,比如开关按钮、时间格式之类的
配置获取流程:
项目启动——>(读取nacos配置文件,需要先知道nacos的地址)——>读取本地配置文件application.yml——>创建Spring容器——>加载bean
bootstrap.yml的优先级比application.yml优先级更高,放置nacos地址
步骤:
1:引入Nacos配置管理客户端依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2:新建一个bootstrap.yml文件,作为引导文件
spring:
application:
name: orderservice #服务名称
profiles:
active: dev #开发环境
cloud:
nacos:
server-addr: localhost:8848 # nacos服务地址
config:
file-extension: yaml #文件名后缀
检验是否成功
@Value("${pattern.dateformat}") //读取配置文件
private String dataformat;
@GetMapping("now")
public String now(){
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dataformat));
}
这说明,微服务都已经成功从nacos控制台里得到时间的配置
配置热点更新
接下来要实现文件的热更新
要实现配置的自动更新
第一种方式:在@Value注入的变量所在的类上添加注解@RefreshScope即可 //完成属性刷新的一个功能
第二种方式:使用@ConfigurationProperties注解,可以完成配置的自动加载
新建一个类,专门完成配置的加载
@Data //提供get和Set的方法
@Component //纳入容器管理,任何人都可以使用
@ConfigurationProperties(prefix = "pattern") //前缀,约定大于配置,前缀名和变量名两者拼接与配置文件一致,就能够完成配置文件的属性注入
public class PatternProperties {
private String dateformat;
}
然后在UserController类注入测试
@Autowired
private PatternProperties properties;
@GetMapping("now")
public String now(){
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(properties.getDateformat()));
}
配置共享
多环境配置共享:
场景:有一个配置属性,在开发、测试、生产等环境的值是一样的,志这样的配置,在每个配置文件里写一个,浪费并且麻烦不合适,找一个地方,这个配置更改之后,不管环境怎么变,都能够被加载————多环境共享需求
实现步骤
微服务启动时会从nacos读取多个配置文件
服务名称-环境-后缀名
服务名称-后缀名
第二个文件名称方程,不管环境怎么变,微服务启动时候一定会读取第二个文件
属性名冲突时候优先级 :
nacos配置优先于本地配置环境
服务名称-环境-后缀名 文件格式优先于 服务名称-后缀名
搭建Nacos集群
基本步骤:
搭建数据库,初始化数据库表结果
下载nacos安装包
配置nacos
集群配置 ,解压nacos安装包,配置好配置信息,复制三份
进入nacos的conf目录,修改配置文件名字,cluster.conf.example重新命名为cluster.conf
接下来改该文件的内容
接下来配置mysql的信息,集群要访问mysql信息
找到application.properties文件
去掉#,数据源打开(告诉使用的是mysql集群)
数据库数量,有几台mysql
数据库连接信息
集群配置完毕
启动nacos集群
将配置好的集群复制成三份,进入每份的配置文件application.properties文件修改端口,分别为8845\8846\8847
找到bin目录,以集群方式启动nacos,命令行为:startup.cmd
nginx反向代理
直接找到nginx的安装包,解压后找到conf目录,http里面添加如下配置信息
upstream nacos-cluster {
server 127.0.0.1:8845;
server 127.0.0.1:8846;
server 127.0.0.1:8847;
}server {
listen 80;
server_name localhost; location /nacos {
proxy_pass http://nacos-cluster;
}
}
打开nginx,cmd命令下输入start nginx.exe
如此,就实现了在这三个当中做负载均衡
java代码做相应配置,把原来8848端口改为80端口即可(bootstrap.yml)
值得一提的是,配置完毕开始访问localhost:nacos地址时候,能够访问的了nacos,但是运行的服务不在nacos配置的集群的当中,解决办法为删除data目录下的protocol文件夹,重启服务即可。