【微服务-Sentinel】基于Nacos实现微服务架构的配置中心实战

前面的文章,我们介绍了Sentinel中熔断与限流的处理方式,了解了Sentinel对系统实施保护的原理。

这篇文章我们来一起看一下,如何基于Nacos集中管理应用配置实现微服务架构中“配置中心”的组件。因为构建Nacos配置中心正是Sentinel实现集群保护的基础所在。前面我们在 Dashboard 配置的一系列规则都要在生产环境中基于 Nacos 配置中心进行持久化存储。

一、为什么微服务架构必须部署配置中心

关于微服务架构中配置中心的作用,大家如果有不明白的地方,可以翻看一下前面的文章,都有讲解。我们这里再简单带过一下:现在的微服务开发主流技术是基于Springboot进行的。我们都知道Springboot默认配置文件是application.yml或者是application.properties。它保存了应用的主要配置信息(比如:端口、应用名、数据库链接地址、redis配置等),这些配置信息会随着打包放入jar文件,随着应用加载并运行。

【微服务-Sentinel】基于Nacos实现微服务架构的配置中心实战如果我们只有几个微服务的情况下,配置文件都放在一个jar包中肯定没什么问题,也比较好运维。但如果我们的微服务架构涉及到几百上千个微服务,协同十几个团队进行开发,同时部署了上百台服务器和几千个实例,那涉及到运维方面的压力可就成倍增长了,这里给运维同学带来的压力主要在以下几个方面:

  • 1、工作量增加:比如我们微服务A 有 400 个实例,这些配置文件 application.yml 分散存储在每一个 Jar 中。此时如果机房环境变化,数据库服务器的 IP 变更,运维人员就需要在 400 个实例中逐个对每一个数据库连接 URL 进行调整,这个过程费时费力还容易出错。

  • 2、版本管理方面:由于生产环境的状况远比开发、测试环境复杂,谁都无法保证新版本服务上线时新应用一定不会出问题。如果出现重大故障,生产环境下必须具备应用版本回滚的机制,保证生产可用的前提下再分析故障原因,而这个场景中如何对配置文件进行版本管理也是必须要考虑到的。

  • 3、环境切换方面:在成熟的软件研发流程中,是拥有多套不同环境的,例如:开发环境、测试环境、UAT 环境、仿真环境、生产环境。不同环境中各种组件的 IP、用户名、密码、配置项都会有差异,在不同环境下运行要求应用具备快速切换并加载对应的配置文件的能力,显然将配置写死在 Jar 中是无法满足这个要求的。

为了解决这些问题,在现有的微服务架构下,必须额外的引入“配置中心”这一组件,配置中心的职责就是集中管理微服务架构中每一个服务实例的配置数据。当微服务架构引入配置中心后,微服务应用只需持有应用启动的最小化配置,在应用启动时微服务应用所需的其他配置数据,诸如数据库连接字符串、各种用户名密码、IP 等信息均从配置中心远程下载,不再本地保存。同时,作为开发应用的程序员,在书写应用配置时也不再直接写入 application.yml 配置,而是直接在配置中心提供的 UI 进行设置。

【微服务-Sentinel】基于Nacos实现微服务架构的配置中心实战

当引入配置中心之后,我们的微服务架构会有以下变化:

【微服务-Sentinel】基于Nacos实现微服务架构的配置中心实战研发运维人员在配置中心提前定义各种环境的配置信息,之后在微服务实例启动时根据服务名、环境等从配置中心查询配置数据并下载到服务实例本地,最后服务实例加载这些来自配置中心的配置信息完成应用的启动。

说到这想必大家对配置中心的作用已经了解,在 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,完成建表【微服务-Sentinel】基于Nacos实现微服务架构的配置中心实战

执行完后,我们通过Navicat查看效果

【微服务-Sentinel】基于Nacos实现微服务架构的配置中心实战

这里以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访问网址查看配置列表页面,以后我们所有的应用配置都可以通过配置列表来展示。

【微服务-Sentinel】基于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配置中心页面,点击右上角“+”号

【微服务-Sentinel】基于Nacos实现微服务架构的配置中心实战

打开后页面中填入以下信息:

【微服务-Sentinel】基于Nacos实现微服务架构的配置中心实战我们来介绍一下页面的各个选项的作用:

  • Data ID:配置的唯一标识,格式固定为:{微服务id}-{环境名}.yml,这里填写 order-service-dev.yml,其中 dev 就是环境名代表这个配置文件是 order-service 的开发环境配置文件。
  • Group:指定配置文件的分组,这里设置默认分组 DEFAULT_GROUP 即可。
  • 描述:说明 order-service-dev.yml 配置文件的用途。
  • 配置格式:指定“配置内容”的类型,这里选择 YAML 即可。
  • 配置内容:将 order-service 工程的 application.yml 文件内容粘贴过来。

之后点击右下角的“发布”按钮完成设置。

【微服务-Sentinel】基于Nacos实现微服务架构的配置中心实战与此同时,在 nacos_config 数据库的 config_info 表中也出现了对应配置数据。【微服务-Sentinel】基于Nacos实现微服务架构的配置中心实战

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 中进行调整,然后让微服务实例重启即可重新下载生效。

文章将持续更新,欢迎关注公众号:服务端技术精选。欢迎点赞、关注、转发


原文始发于微信公众号(服务端技术精选):【微服务-Sentinel】基于Nacos实现微服务架构的配置中心实战

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/261344.html

(0)
newbe的头像newbebm

相关推荐

发表回复

登录后才能评论
极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!