前面的文章,我们介绍了Sentinel中熔断与限流的处理方式,了解了Sentinel对系统实施保护的原理。
这篇文章我们来一起看一下,如何基于Nacos集中管理应用配置,实现微服务架构中“配置中心”的组件。因为构建Nacos配置中心正是Sentinel实现集群保护的基础所在。前面我们在 Dashboard 配置的一系列规则都要在生产环境中基于 Nacos 配置中心进行持久化存储。
一、为什么微服务架构必须部署配置中心
关于微服务架构中配置中心的作用,大家如果有不明白的地方,可以翻看一下前面的文章,都有讲解。我们这里再简单带过一下:现在的微服务开发主流技术是基于Springboot进行的。我们都知道Springboot默认配置文件是application.yml或者是application.properties。它保存了应用的主要配置信息(比如:端口、应用名、数据库链接地址、redis配置等),这些配置信息会随着打包放入jar文件,随着应用加载并运行。
如果我们只有几个微服务的情况下,配置文件都放在一个jar包中肯定没什么问题,也比较好运维。但如果我们的微服务架构涉及到几百上千个微服务,协同十几个团队进行开发,同时部署了上百台服务器和几千个实例,那涉及到运维方面的压力可就成倍增长了,这里给运维同学带来的压力主要在以下几个方面:
-
1、工作量增加:比如我们微服务A 有 400 个实例,这些配置文件 application.yml 分散存储在每一个 Jar 中。此时如果机房环境变化,数据库服务器的 IP 变更,运维人员就需要在 400 个实例中逐个对每一个数据库连接 URL 进行调整,这个过程费时费力还容易出错。
-
2、版本管理方面:由于生产环境的状况远比开发、测试环境复杂,谁都无法保证新版本服务上线时新应用一定不会出问题。如果出现重大故障,生产环境下必须具备应用版本回滚的机制,保证生产可用的前提下再分析故障原因,而这个场景中如何对配置文件进行版本管理也是必须要考虑到的。
-
3、环境切换方面:在成熟的软件研发流程中,是拥有多套不同环境的,例如:开发环境、测试环境、UAT 环境、仿真环境、生产环境。不同环境中各种组件的 IP、用户名、密码、配置项都会有差异,在不同环境下运行要求应用具备快速切换并加载对应的配置文件的能力,显然将配置写死在 Jar 中是无法满足这个要求的。
为了解决这些问题,在现有的微服务架构下,必须额外的引入“配置中心”这一组件,配置中心的职责就是集中管理微服务架构中每一个服务实例的配置数据。当微服务架构引入配置中心后,微服务应用只需持有应用启动的最小化配置,在应用启动时微服务应用所需的其他配置数据,诸如数据库连接字符串、各种用户名密码、IP 等信息均从配置中心远程下载,不再本地保存。同时,作为开发应用的程序员,在书写应用配置时也不再直接写入 application.yml 配置,而是直接在配置中心提供的 UI 进行设置。
当引入配置中心之后,我们的微服务架构会有以下变化:
研发运维人员在配置中心提前定义各种环境的配置信息,之后在微服务实例启动时根据服务名、环境等从配置中心查询配置数据并下载到服务实例本地,最后服务实例加载这些来自配置中心的配置信息完成应用的启动。
说到这想必大家对配置中心的作用已经了解,在 Spring Cloud Alibaba 这个架构下,Nacos 除了能作为注册中心,还提供了配置中心的功能。别看 Nacos 身兼多职,但每一项职责也并不平庸,Nacos 作为配置中心,除了基本的配置存储,还提供了版本管理、变更推送、监听查询以及友好的中文 UI 界面,无论是研发人员还是运维人员都可以快速上手实现应用配置。
遥遥领先~
二、部署Nacos配置中心
因为Nacos本身就拥有注册中心和配置中心的双重能力,在部署方面基本与Nacos集群部署一致。唯一的不同点是Nacos需要将应用的配置信息保存在数据库以防丢失,所以要配置Nacos的数据库访问地址。下面我们来快速过一下,如果有不明白的,可以看一下专栏前面的文章,会有详细的介绍哦。
1、下载、解压Nacos
tar -xvf nacos-server-1.8.0.tar.gz
2、配置数据库信息
这一步比较关键,在MySQL中执行一下/nacos/conf/nacos-mysql.sql,完成建表
执行完后,我们通过Navicat查看效果
这里以config_开头的表都是Nacos配置中心使用时保存的应用配置的表。
3、配置Nacos数据源
打开Nacos安装目录,找到/usr/local/nacos/conf/application.properties,定位到“Count of DB”附近,按下面的示例配置数据源即可。
### Count of DB: 数据库总数
db.num=1
### Connect URL of DB: 数据库连接,根据实际情况调整
db.url.0=jdbc:mysql://192.168.3.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=root
4、创建cluster.conf文件
cp cluster.conf.example cluster.conf
打开 cluster.conf,添加所有 Nacos 集群节点 IP 及端口
#vim cluster.conf
192.168.3.1:8848
5、启动Nacos
sh /usr/local/nacos/bin/startup.sh
启动后,我们可以在Nacos访问网址查看配置列表页面,以后我们所有的应用配置都可以通过配置列表来展示。
三、微服务接入Nacos配置中心
上面我们已经完成了Nacos配置中心的创建,这里我们来看一下如何把我们的微服务接入Nacos配置中心。
1、创建微服务工程
利用Spring Initializr 向导创建 order-service 订单服务工程,确保 pom.xml 引入以下 3 个依赖
<!-- Spring Boot Web模块 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Nacos注册中心starter -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- Nacos配置中心starter -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2、修改配置文件application.yml
application.yml 文件内容如下,注意最后两行,custom 开头的配置项是自定义的,用于演示环境切换。
server:
port: 8000
spring:
application:
name: order-service
cloud:
nacos:
discovery:
server-addr: 192.168.3.1:8848 #Nacos通信地址
username: nacos
password: nacos
custom: #自定义配置项
flag: development
database: 192.168.3.1
3、创建接口
新建TestController,增加/test接口,将配置文件中两个自定义配置输出:
@RestController
public class TestController {
@Value("${custom.flag}")
private String flag;
@Value("${custom.database}")
private String database;
@GetMapping("/test")
public String test(){
return "flag:" + flag + "<br/> database:" + database;
}
}
4、访问接口,测试
在浏览器中访问测试接口,查看返回信息
http://localhost:8000/test
结果如下:
flag:development
database:192.168.3.1
其中 flag:development 说明当前是“开发环境”。
一切准备就绪,下面我们接入 Nacos 配置中心。
5、Nacos配置中心信息配置
打开Nacos配置中心页面,点击右上角“+”号
打开后页面中填入以下信息:
我们来介绍一下页面的各个选项的作用:
- Data ID:配置的唯一标识,格式固定为:{微服务id}-{环境名}.yml,这里填写 order-service-dev.yml,其中 dev 就是环境名代表这个配置文件是 order-service 的开发环境配置文件。
- Group:指定配置文件的分组,这里设置默认分组 DEFAULT_GROUP 即可。
- 描述:说明 order-service-dev.yml 配置文件的用途。
- 配置格式:指定“配置内容”的类型,这里选择 YAML 即可。
- 配置内容:将 order-service 工程的 application.yml 文件内容粘贴过来。
之后点击右下角的“发布”按钮完成设置。
与此同时,在 nacos_config 数据库的 config_info 表中也出现了对应配置数据。
6、删除Springboot工程配置文件
注意,我们前面已经将order-service的配置信息保存到了数据库中,这里可以返回order-service工程中删除application.yml文件。
7、创建引导文件
在 resources 目录下创建 bootstrap.yml 引导文件,对 Nacos 配置中心地址进行设置。注意,bootstrap.yml 文件名是固定的,不要随意改变。
spring:
application:
name: order-service #微服务id
profiles:
active: dev #环境名
cloud:
nacos:
config: #Nacos配置中心配置
file-extension: yml #文件扩展名
server-addr: 192.168.3.1:8848
username: nacos
password: nacos
logging: #开启debug日志,仅为调试时使用
level:
root: debug
在上面的配置中,包含了两部分内容,第一部分说明 Nacos 配置中心的 IP 端口等信息,第二部分是通过文件中的 “微服务 id”-“环境名”.“文件扩展名” 三部分组合为有效的 data id,即order-service-dev.yml。
这个 data id 要和 Nacos 的设置大小写保持完全一致,这样在微服务启动时便自动会从 Nacos配置中心获取 order-service-dev.yml 配置并下载到本地完成启动过程。
做完引导文件后,我们就可以启动服务看一下日志输出了
...
[main] c.a.c.n.c.NacosPropertySourceBuilder : Loading nacos data, dataId: 'order-service-dev.yml', group: 'DEFAULT_GROUP', data: server:
server:
port: 8000
spring:
application:
name: order-service
cloud:
nacos:
discovery:
server-addr: 192.168.31.10:8848
username: nacos
password: nacos
custom: #自定义配置项
flag: development
database: 192.168.3.1
[main] o.s.b.factory.config.YamlMapFactoryBean : Loading from YAML: Byte array resource [resource loaded from byte array]
...
[main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8000 (http) with context path ''
通过 Debug 日志发现,在启动时微服务向 Nacos 查询 order-service-dev.yml 的内容,并将配置内容打印在 Debug 级别日志中,之后作为应用配置加载完成启动。
到这里,我们就可以再次访问我们的测试接口看一下返回效果了;
flag:development
database:192.168.3.1
到这里我们完成了 Nacos 配置中心的接入。因为我们把配置数据放在 Nacos 配置中心中,微服务在启动时自动进行下载,因此同一个微服务的所有实例得到的配置信息都是一致的,如果需要调整里面的配置,只需在 Nacos 中进行调整,然后让微服务实例重启即可重新下载生效。