目录
- 了解微服务常用的概念
- 了解项目架构演变
- 掌握微服务环境搭建
- 掌握微服务治理组件-Nacos Discovery
- 掌握微服务负载均衡调度组件-Ribbon
- 掌握微服务远程调度组件-Feign
- 掌握微服务流控容错组件-Sentinel
- 掌握微服务网关组件-Gateway
- 掌握微服务链路追踪组件-Sleuth&Zipkin
- 掌握微服务配置中心-Nacos Config
- 开口表述上面所有组件概念、定位、原理与运用(每个10分钟)
第九章 配置中心 Nacos Config
9.1 服务配置中心介绍
首先我们来看一下,微服务架构下关于配置文件的一些问题:
- 配置文件相对分散。在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散
在各个微服务中,不好统一配置和管理。
- 配置文件无法区分环境。微服务项目可能会有多个环境,例如:测试环境、预发布环境、生产环
境。每一个环境所使用的配置理论上都是不同的,一旦需要修改,就需要我们去各个微服务下手动
维护,这比较困难。
- 配置文件无法实时更新。我们必须要先打开源码修改了配置文件之后,还必须重新启动微服务才能使配置生效,这对一
个正在运行的项目来说是非常不友好的。
4.配置内容安全与权限:配置和源码在一起通常是不安全的,比如数据库连接信息敏感的内容,我不想让开发人员或者其他人看到,开发环境看了还无所谓,尤其是测试环境和生产环境的配置一般是不暴露的。
基于上面这些问题,我们就需要配置中心的加入来解决这些问题。
配置中心的思路是:
首先把项目中各种配置全部都放到一个集中的地方进行统一管理,并提供一套标准的接口。
当各个服务需要获取配置的时候,就来配置中心的接口拉取自己的配置。
当配置中心中的各种参数有更新的时候,也能通知到各个服务实时的过来同步最新的信息,使之动
态更新。
当加入了服务配置中心之后,我们的系统架构图会变成下面这样:
9.2 常见的服务配置中心
市面上开源的配置中心有很多,BAT每家都出过,360的QConf、淘宝的diamond、百度的disconf都是解决这类问题。
- Apollo
Apollo是由携程开源的分布式配置中心。特点有很多,比如:配置更新之后可以实时生效,支持灰
度发布功能,并且能对所有的配置进行版本管理、操作审计等功能,提供开放平台API。并且资料
也写的很详细。
- Disconf
Disconf是由百度开源的分布式配置中心。它是基于Zookeeper来实现配置变更后实时通知和生效
的。
- SpringCloud Config
这是Spring Cloud中带的配置中心组件。它和Spring是无缝集成,使用起来非常方便,并且它的配
置存储支持Git。不过它没有可视化的操作界面,配置的生效也不是实时的,需要重启或去刷新。
- Nacos
这是SpingCloud alibaba技术栈中的一个组件,前面我们已经使用它做过服务注册中心。其实它也
集成了服务配置的功能,我们可以直接使用它作为服务配置中心。
9.3 Nacos Config入门
使用nacos作为配置中心,其实就是将nacos当做一个服务端,将各个微服务看成是客户端,我们将各个微服务的配置文件统一存放在nacos上,然后各个微服务从nacos上拉取配置即可。接下来我们以商品微服务为例,学习nacos config的使用。
-
搭建nacos环境【使用现有的nacos环境即可】
-
在商品微服务中引入nacos的依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
-
在微服务中添加nacos config的配置
注意:不能使用原来的
application.yml
作为配置文件,而是新建一个bootstrap.yml
作为配置文件配置文件优先级(由高到低): bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml
spring: application: name: product-service cloud: nacos: config: server-addr: 127.0.0.1:8848 #nacos中心地址 file-extension: yaml # 配置文件格式 profiles: active: dev # 环境标识
-
在nacos中添加配置,然后把商品微服务application.yml配置复制到配置内容中.
-
注释本地的application.yam中的内容, 启动程序进行测试
-
如果依旧可以成功访问程序,说明我们nacos的配置中心功能已经实现
a.观察 我们的 商品服务发现可以正常启动,端口号是 8081 !
b.测试访问,http://localhost:8081/getproductid/1 发现商品数据正常返回!
操作原理:
观察启动后打印的日志,大体能看出操作原理
1>项目启动,先加载bootstrap.yml解析里面配置,得到3个核心信息
- 服务名:product-service
- nacos配置中心地址:127.0.0.1:8848
- 激活环境:dev
2>访nacos配置中心找项目的配置文件
没有指定具体分组默认:DEFAULT_GROUP
组 + 服务名 + 激活换—>DEFAULT_GROUP–product-service-dev.yaml 完全可以找到配置文件
9.4 配置动态刷新
所谓的动态刷新:项目运行中,手动改了nacos中的配置,项目在不停机的情况下也可以读到最新的数据。
操作步骤:
1>在nacos中的product-service-dev.yaml配置项中添加下面配置:
appConfig:
name: hello dafei
2>在商品微服务中新增NacosConfigControlller.java
package com.gec.shop.product.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.RestController;
@RestController
@RefreshScope
public class NacosConfigController {
@Value("${appconfig.name}")
public String appConfigName;
@GetMapping("/appconfigname")
public String appconfigname(){
return "从nacos上动态获取到数据是:"+appConfigName+"---而且还是实时刷新的哦-";
}
}
注意:
必须贴上@RefreshScope 在类上才有效果
**@RefreshScope 操作原理:**当配置发生更新时,贴有@RefreshScope注解的类会重新IOC创建新的对象,该类中加载的数据重新更新。
9.5 配置共享
9.5.1 配置环境
真实项目开发一般会有3套部署环境,
**开发:**dev,配置是开发的环境,比如开发环境数据库四要素,Redis环境等。
**测试:**test,配置是测试的环境,比如测试环境数据库四要素,Redis环境等。
**生产:**prod,配置是线上真实的环境,比如生产环境线上真实数据库四要素,Redis环境等。
所以在项目开发时,必须编写3个配置环境文件
appliction-dev.yaml #开发
appliction-test.yaml #测试
appliction-prod.yaml #生产
按这个标准,上面的案例还需要在nacos中创建2个配置文件
product-service-test.yaml
product-service-prod.yaml
nacos非常贴心,提供克隆功能
同时项目启动前需要明确指定要激活环境
spring:
profiles:
active: dev # 环境标识
那么这不又是要回来改代码,还是要重启啊,那我们是不是可以将项目打车jar包,然后启动的时候,通过java -jar 命令中的参数来控制啊
java -jar .\xxx-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
9.5.2 环境配置文件共享
当环境多了,那对应的配置也会越来越多,这时你会发现有很多配置是重复的,此时就要考虑可不可以将相同配置提取出来,放置到一个共有文件中,然后实现共享呢?答案是Yes
第一种场景:同一个微服务配置文件共享
操作上非常简单,只需要写一个以:spring.application.name 命名的配置文件即可。
比如:
application-dev.yaml ,application-test.yaml ,application-prod.yaml
提取公共文件名:application.yaml 看到没,没有后缀即可。
回到nacos的案例,只需要配置多一个文件:product-service.yaml 就可以啦。
案例
将之前的配置删掉:product-service-test.yaml product-service-prod.yaml
appConfig:
name: dafei hello
项目中是配置 dev
spring:
profiles:
active: dev # 环境标识
项目启动之后,报错
切换到test环境也报错
此时只需要额外添加一个配置文件:product-service.yaml
再次启动发现可以正常启动成功,并且测试:http://localhost:8081/appconfigname 一切ok!
第二种场景:不同微服务中间配置文件共享
不同为服务之间也可以实现配置共享,原理有点类似于文件引入,就是定义一个公共配置文件,然后在当前配置文件中引
入。
操作步骤:
1>在nacos中定义一个DataID为global-config.yaml的配置,用于所有微服务共享
globalConfig: global
2>修改bootstrap.yaml
spring:
application:
name: product-service
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848 #nacos中心地址
file-extension: yaml # 配置文件格式
shared-configs:
- data-id: global-config.yaml # 配置要引入的配置
refresh: true
profiles:
active: test # 环境标识
2>在NacosConfigController.java中新增一个方法
@RestController
@RefreshScope
public class NacosConfigController {
@Value("${appConfig.name}")
private String appConfigName;
@Value("${globalConfig}")
private String globalConfig;
@RequestMapping("/nacosConfig")
public String nacosConfig(){
return "远程信息:"+appConfigName;
}
@RequestMapping("/nacosConfig2")
public String nacosConfig2(){
return "全局配置:"+globalConfig;
}
}
ller {
@Value(“
a
p
p
C
o
n
f
i
g
.
n
a
m
e
"
)
p
r
i
v
a
t
e
S
t
r
i
n
g
a
p
p
C
o
n
f
i
g
N
a
m
e
;
@
V
a
l
u
e
(
"
{appConfig.name}") private String appConfigName; @Value("
appConfig.name")privateStringappConfigName;@Value("{globalConfig}”)
private String globalConfig;
@RequestMapping("/nacosConfig")
public String nacosConfig(){
return "远程信息:"+appConfigName;
}
@RequestMapping("/nacosConfig2")
public String nacosConfig2(){
return "全局配置:"+globalConfig;
}
}
3>重启服务并测试.
标签:06,配置文件,SpringCloud,配置,环境,Nacos,nacos,yaml,服务
From: https://blog.csdn.net/Fuck1269185654/article/details/143267895